Page 64 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼Access2000標準装備でADODBレコードセット... 青山 02/10/15(火) 10:16 ┗すこし長文です。 こうちゃん 02/10/15(火) 14:54 ┗アドバイスありがとうございます 青山 02/10/15(火) 21:21 ┗Re:アドバイスありがとうございます こうちゃん 02/10/16(水) 9:03 ┗解決しました 青山 02/10/17(木) 10:30 ─────────────────────────────────────── ■題名 : Access2000標準装備でADODBレコードセット... ■名前 : 青山 ■日付 : 02/10/15(火) 10:16 -------------------------------------------------------------------------
初めて書き込みます。助けて頂けますと幸です。 ADOでとってきたデータをAccess2000の標準装備で表示させるにはどうしたらよいのでしょうか。 データは抽出できたものの、それを表示させる方法がわかりません。 例えばVBのFrexGridのように、 指定した行・列のグリッドにテキストデータなりを入力し、逆に 指定した行・列のグリッドに書込んである内容を取り出す、というような 方法を知りたいのです。 ※やりたいことは以下の通りです。 「条件入力画面」と「結果一覧画面」と「詳細画面」と3画面使う予定です。 「条件入力画面」で入力した条件に該当するレコードをテーブルから検索し、 該当するレコードのいくつかのフィールド分のデータを「結果一覧画面」に表示し、 このなかのレコードを選択すると 「詳細画面」にそのレコードの全フィールド分のデータを表示する ようにしたいと考えています。 「結果一覧画面」と「詳細画面」は1フォームに入れてしまっても構いません。 「条件入力画面」では、コンボボックスからの選択で検索条件を決定し、これをグローバル変数として持つようにしました。 ADODBのレコードセットでデータ取得までは出来たのですが、これを表示する方法がわかりません。 回避策として、現在までに「結果一覧画面」としてやってみたのは、 結局ADODBのレコードセットで取得したデータは使わず、 選択クエリ入力でSQL文を書いたクエリをサブフォームとして表示させることと、 リストボックスのRowSourceにSQL文を入れてRequeryすることでした。 こんな感じで↓ Me.ListBox.RowSource = _ "SELECT フィールド1, フィールド2 " & _ "FROM テーブル1 " & _ "WHERE " & "フィールド3 = " & グローバル変数 Me.ListBox.Requery 上記ソースの「グローバル変数」というのは、条件入力画面から入力したものです。 クエリをサブフォームで表示する方のSQL文もほぼ同様のものです。 しかし、こちらクエリを用いる方は、グローバル変数を見てくれないのか、 Whereで書いた部分について、パラメータ入力を求めるダイアログが出てきてしまって ダメでした。 リストボックスの方は、上記で表示できるのですが、その後の、 レコード(リストボックスの行)選択→「詳細画面」に全フィールドのデータを表示するやり方が分かりません。 クエリをサブフォームで表示したときには、クエリで全フィールドをSelectしておき、 サブフォームとして表示する際に、一部を選んでテキストボックスで表示していたので クエリそのものには全データが入っていたわけなので、 選択レコードについて詳細を再表示、ということも可能な気がしていたのですが、 リストボックスでは、もともとのSQL文から、 列数以下のフィールドを指定する他ありません…よね? これでは再表示の際に、全フィールド分のデータを取り直してくることになるような。 というわけで、 上記(※)のようなことをやりたい場合、どうするのがよいのでしょうか。 |
青山 さん、こんにちは ADOのレコードセットをフォームのレコードセットとして読み込む場合は、以下のように CursorLocation = adUseClient としてレコードセットを取得する方法があります。 下記例は、「条件入力画面」でグローバル変数に条件を取得し、ADOのレコードセットをその条件で取得し、abc1フォームを開きます。 さらに、abc1フォームのフィールド1をダブルクリックした際に、フィールド1とフィールド2を条件として abc1-2 フォームを開く例です。 '****************** form abc1 *************** Private Sub Form_Load() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim strsql As String Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.CursorLocation = adUseClient strsql = "SELECT フィールド1, フィールド2 " & _ "FROM テーブル1 " & _ "WHERE " & "フィールド3 = " & グローバル変数 rs.Open strsql, cn Set Me.Recordset = rs rs.Close Set rs = Nothing Set cn = Nothing End Sub Private Sub フィールド1_DblClick(Cancel As Integer) DoCmd.OpenForm "abc1-2" End Sub '****************** form abc1-2 *************** Private Sub Form_Load() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim strsql As String Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.CursorLocation = adUseClient strsql = "select * from abc where フィールド1=" & Forms!abc1.フィールド1 & " and フィールド2=" & Forms!abc1.フィールド2 rs.Open strsql, cn Set Me.Recordset = rs rs.Close Set rs = Nothing Set cn = Nothing End Sub ただし、この方法は一般的ではありません。 普通に考えれば、SQL文(SELECT文)をくみたてて、フォームのレコードソースに設定する方法が簡便です。 フォームを2つ用意します。 1つには最初の条件を選択するコンボボックスまたはリストボックスを配置し、(青山さんの例ではグローバル変数のもととなるデータ)条件を選択させます。 仮に「cmb条件」とします。 そのフォームにサブフォームを配置しておきます。 サブフォームには「結果一覧」に含めるフィールドを含めて設定しておき、「cmb条件」の更新前イベント等に、サブフォームのRecordSourceを設定するコードを書いておきます。 サブフォームの1レコードを選択してコマンドボタンをクリックしたときや、レコードのダブルクリックイベントで2つめのフォームをDocmdでオープンします。 2つめのフォームのロードイベントで、1つめのフォームのサブフォームの条件で、自分のレコードセットを設定するコードを書いておきます。 というような感じです。 もちろんすべてを1つのフォームに収めることも、3つのフォームを使うことも可能です。 すこしわかりづらくなってしましまいましたが、あとは青山さんがコードを書いてみてwからない部分を、そこまでのコードを含め具体的に質問してみてください。 |
こうちゃんさん、丁寧なご回答、本当にありがとうございます。 あれから何度も試してみて、無事望みの結果を得られました。 ありがとうございました! しかし、やっている間に、数々の疑問が湧きまして、 再度質問させてください。またも長くて恐縮なのですが… いろいろ書込んでおりますけれども、全てとは申しません、 幾つかでも結構ですので、教えてはいただけないでしょうか。 頂いたご回答からしますと、Accessでは、 データを取得してから、そのデータを1つずつ、 表示用のコントロールの該当個所に当てはめてゆく、というやり方は 無い…というか一般的でないのですね? ご説明下さったうち前者のADOを使う方法でも、 SQLをそのまま表示させるのだと理解しましたが、合っていますでしょうか。 また、余談になり恐縮ですが、この例を実行した状態というのは、 このSQL文をSQLビューに書込んだクエリを開いたときと同じだと 判断してよろしいのでしょうか。 後者の方が好ましいということで、そちらに挑戦してみました。 やってみたのは以下の通りです。 条件入力画面では、条件選択用にコンボボックスを設け、 コンボボックスで表示させるデータは、テーブルで持っています。 検索対象のテーブルは、他のmdbにあり、リンクで呼んでいます。 クエリを用意し、このクエリでは、検索対象のテーブルの全フィールドを呼び、 該当するフィールドの抽出条件(クエリデザイン)に、 コンボボックスで選んだ値を入れようとしました。 ところが、ここで、式ビルダを用い、 条件入力画面のコンボボックスのvalueを選ぼうとしたら、 選択肢にはvalueがなかったので、手打ちで入れておきました。 結果一覧画面には、サブフォームとして先ほどのクエリの いくつかのフィールドを表示させるようにしました。 こちらには、条件設定(where〜)はしていません。 サブフォームでなくクエリに条件設定をした理由は、 サブフォームのデータ元となるクエリとして、 全テーブルを持ってくるよりも処理が速いのではないかと考えたからです。 どうなんでしょう、全テーブルを持ってきても同じですか? ここまでの状態で、クエリやサブフォームを直接ダブルクリックして開こうとすると、 パラメータ(コンボボックスからの条件入力がない分)の入力が求められ、 適当な値を入れると、クエリ・サブフォームいずれも正しい検索結果が表示されます。 上記まではコーディング無しです。 条件入力画面にコマンド釦(search)を設け、これを押すことで 結果一覧画面(list)が表示されるようにしました。 まんまコレ↓だけなんですけど Private Sub search_Click() DoCmd.OpenForm "list" End Sub すると、コマンドボックスで指定された値が反映され、正しい検索結果が表示されました。 ここで疑問なのですが、ここまでの状態にするのに、 今まで使っていたmdbをいじり回すとどうにもエラーになってしまっていたのですが、 新たにmdbを作成したらあっさり表示されました。 これはどういうわけなのでしょう。 見えないところでもいろいろ設定されてしまうのでしょうか? そして、ここで問題のRequeryなのですが、 Requeryは、クエリにでなくサブフォームにかけるものなのですか? 私の場合ですと、例えば、上記のコンボボックスから条件を入力しない場合、つまり 条件で制限しないで全レコードを表示させたい場合ですとか、または、 他の条件を入力する別のコンボボックスを設ける場合ですとか…、 上ではクエリの抽出条件に直接書いた内容を、その時々で変えたい、とします。 Requeryというのは、このような場合に利用するものなのでしょうか。 サブフォームにしかRequeryできないのなら、 クエリに条件設定は入れない方がいいのですよね。 また、クエリには条件設定するのを止めますと、 クエリを開けた状態が検索対象テーブルそのままになってしまいますよね、 ならば、 サブフォームにクエリを解してテーブルを呼ぶ必要はないのかな?と サブフォームのレコードソースとしてテーブルを指定したら、 条件設定を入れられなくなってしまいました。 クエリを介することは必要なのですか。 で、さしあたり、クエリの条件設定を外してテーブルそのままにしまして、 そのクエリの幾つかのフィールドをサブフォームに表示させるようにした状態で、 サブフォームのフォームロードにRequeryを入れました。 その内容は、変数strSQLにSQL文を作成して、 Me.RecordSource = strSQL Me.Requery というものです。 これで無事表示することができました! …が、表示されたものの、それまでの既存mdbいじり回しでは 同じようにして何度もエラーになっているので、 使い方として合っているのか自信がありません。 合っていますか? 以降は、このSQL文の作成をパターンで色々変えてゆけばよいのですよね… 以上です。 本当に助かりました、ご親切にありがとうございました。 |
青山さん、こんにちは >頂いたご回答からしますと、Accessでは、 >データを取得してから、そのデータを1つずつ、 >表示用のコントロールの該当個所に当てはめてゆく、というやり方は >無い…というか一般的でないのですね? >ご説明下さったうち前者のADOを使う方法でも、 >SQLをそのまま表示させるのだと理解しましたが、合っていますでしょうか。 はい、わたしはそう理解しています。 VBのグリッドコントロールのようなコントロールはアクセスにはありませんが、その代わり連結フォームが簡単に作成できます。 テーブル、クエリ、SQL文等のレコードセットを直接フォームのグリッドに連結できます。 Accessを使う場合、この連結フォームの機能を使うのが「王道」かと思います。 >また、余談になり恐縮ですが、この例を実行した状態というのは、 >このSQL文をSQLビューに書込んだクエリを開いたときと同じだと >判断してよろしいのでしょうか。 です。 >そして、ここで問題のRequeryなのですが、 >Requeryは、クエリにでなくサブフォームにかけるものなのですか? >私の場合ですと、例えば、上記のコンボボックスから条件を入力しない場合、つまり >条件で制限しないで全レコードを表示させたい場合ですとか、または、 >他の条件を入力する別のコンボボックスを設ける場合ですとか…、 >上ではクエリの抽出条件に直接書いた内容を、その時々で変えたい、とします。 >Requeryというのは、このような場合に利用するものなのでしょうか。 >サブフォームにしかRequeryできないのなら、 >クエリに条件設定は入れない方がいいのですよね。 > >また、クエリには条件設定するのを止めますと、 >クエリを開けた状態が検索対象テーブルそのままになってしまいますよね、 >ならば、 >サブフォームにクエリを解してテーブルを呼ぶ必要はないのかな?と >サブフォームのレコードソースとしてテーブルを指定したら、 >条件設定を入れられなくなってしまいました。 >クエリを介することは必要なのですか。 必要ありません。 単一テーブルを元にしたクエリは、元テーブルに対するSELECT文と等価です。 私は、このケースではクエリを使いません。 フォームのレコードソースにテーブルを指定しておいて、"Filter/フィルタ" プロパティに条件を設定するか、Where条件を付加したSELECT文を組み立てて、そのSQL文を直接レコードソースに設定します。 私はフォームのコントロールの値を条件としたクエリは、上記をテストする際に使う程度で、実運用ではあまり使いません。 ただし、SQL文があまりに複雑になる場合等メンテナンスのし易さを優先する場合は使用する場合もあります。 まあ、ケースによるってことでしょうが・・ >で、さしあたり、クエリの条件設定を外してテーブルそのままにしまして、 >そのクエリの幾つかのフィールドをサブフォームに表示させるようにした状態で、 >サブフォームのフォームロードにRequeryを入れました。 >その内容は、変数strSQLにSQL文を作成して、 > Me.RecordSource = strSQL > Me.Requery >というものです。 >これで無事表示することができました! >…が、表示されたものの、それまでの既存mdbいじり回しでは >同じようにして何度もエラーになっているので、 >使い方として合っているのか自信がありません。 >合っていますか? 合っています。 >以降は、このSQL文の作成をパターンで色々変えてゆけばよいのですよね… サブフォームに選択したデータを表示する場合は、"LinkChildFields/リンク子フィールド"、"LinkMasterFields/リンク親フィールド" プロパティを利用する方法もあります。 HELPや関連書籍で確認してみてください。 >…が、表示されたものの、それまでの既存mdbいじり回しでは >同じようにして何度もエラーになっているので、 この件に関しては当方で再現できませんのでなんともいえませんが、DBに不整合があるように思います。 「ツール」「データベースユーティリティ」「最適化/修復」を1度されてみたらどうでしょう? |
こうちゃんさん、こんにちは。 ご回答ありがとうございました。 もやもやがスッキリしました。 >フォームのレコードソースにテーブルを指定しておいて、"Filter/フィルタ" プロパティに条件を設定するか、Where条件を付加した SELECT文を組み立てて、そのSQL文を直接レコードソースに設定します。 後者のやり方が私には理解しやすかったのでやってみまして、望みの結果を得られました。 >サブフォームに選択したデータを表示する場合は、"LinkChildFields/リンク子フィールド"、"LinkMasterFields/リンク親フィールド" プロパティを利用する方法もあります。 情報ありがとうございます。勉強してみます。 曖昧な質問に丁寧にお答え下さり、ありがとうございました。 |