Page 435 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼フォームの値を参照するクエリー パラメー 03/11/17(月) 16:36 ┗Re:フォームの値を参照するクエリー しのしの 03/11/18(火) 14:40 ┗Re:フォームの値を参照するクエリー パラメー 03/11/18(火) 16:32 ─────────────────────────────────────── ■題名 : フォームの値を参照するクエリー ■名前 : パラメー ■日付 : 03/11/17(月) 16:36 -------------------------------------------------------------------------
初めて投稿させていただきます。 Access2000、ADOにて以下の作業時に「パラメータが少なすぎます。1を指定して下さい」メッセージが表示されてしまうことについて教えて下さい。 以下のモジュール内のQS_追加(支店検索)はフォームに入力されたコードを元に検索するクエリーなのですが、実行時に「パラメータが少なすぎます。1を指定して下さい」と表示されてしまいます。 過去のログに同様の質問があったのですが、DAOの場合だった為、ADOでのやり方も教えて頂ければと思い投稿しました。 お忙しいところ申し訳ありませんがよろしくお願いします。 'ADO定義 Dim db As ADODB.Connection Set db = CurrentProject.Connection '支店マスタ Dim BRHMST As ADODB.Recordset Set BRHMST = New ADODB.Recordset BRHMST.Open "QS_追加(支店検索)", db, adOpenStatic, , adCmdTableDirect BRHMST.MoveFirst Do Until BRHMST.EOF If BRHMST![BRH_CODE] = Me![支店] Then Me![支店名] = BRHMST![BRH_NAME] Exit Do End If BRHMST.MoveNext Loop |
Toパラメー さん 今手元になにもないので、いい加減であることを前提にご覧ください。 使用する単語やメソッド、プロパティ値など間違っている可能性があります。 必ずヘルプで確認してくださいね。よろしくお願いします Toご覧の皆さん 間違いがありましたら、ご指摘よろしくお願いします。(ペコリ) 何がしたいのかがよく分からないため、適当なご提案です。 また、"QS_追加(支店検索)"クエリ、またはフォームの内容不明確なので、 例えば、以下のようなクエリ"Q1" と、非連結フォーム"検索画面"を基にご提案します クエリ"Q1"のSQLビュー SELECT 支店ID,支店名,地域ID FROM 支店マスタ WHERE 地域ID =[Forms]![検索画面]![地域]; フォーム"検索画面" レコードソース:なしあるいは、"Q1"以外 コントロール"地域":非連結テキストボックス、初期値0 入力規則数値のみ コントロール"支店":非連結テキストボックス、初期値0 入力規則数値のみ コントロール"支店名":非連結テキストボックス、初期値NULL ----------------------------------- <エラーの原因> 「QS_追加(支店検索)はフォームに入力されたコードを元に検索するクエリー」 というのは、上記例のクエリ"Q1"のようなものではないですか? これでは、オブジェクトはパラメータを認識できないと思いますが、違ってます? --------------------------------- <提案1> コントロール支店および支店名を1つにする 単純に支店IDから支店名を表示させたいだけなら、コンボボックスを利用すればモジュール不要です。コントロールウィザードを使って作成することをお奨めします。 開くDBもCURRENTみたいだし、これが一番単純かつ効率的であると考えます コントロール"cbo支店":コンボボックス 値集合タイプ :テーブル/クエリ 値集合ソース :SELECT [支店ID],[支店名] FROM [支店マスタ] 連結列 :1 ----支店IDをコンボボックス値にする場合 列幅 :2.5cm;2.5cm(例)----支店ID値を表示したくないときは0cm;2.5cm -------------------------------------------- <提案2>Q1をパラメータクエリに変更し、コマンドオブジェクトを使う 「ADO」で!!とおっしゃるなら、コマンドオブジェクトを利用されてはどうですか? また、利用するコントロールに格納される値によって、CreateParameter引数が違ってきます。(コードはエラー処理を全く含んでいませんので状況により追加してください) ヘルプを参考に 必ず、カスタマイズしてご利用ください。 > BRHMST.MoveFirst > Do Until BRHMST.EOF > If BRHMST![BRH_CODE] = Me![支店] Then > Me![支店名] = BRHMST![BRH_NAME] > Exit Do > End If > BRHMST.MoveNext > Loop の部分もパラメータ化しています。 パラメータ化したクエリ"Q1"のSQLビュー SELECT 支店名 FROM 支店マスタ WHERE (地域ID =[P地域]) and (支店ID =[P支店]) Dim acmd As ADODB.Command Set acmd = New ADODB.Command With acmd .ActiveConnection = db .CommandText = "Q1" .CommandType = adCmdStoredProc .Parameters.Append _ Object:=.CreateParameter( _ Name:="P地域", _ Type:=adInteger, _ Direction:=adParamInput, _ ) .Parameters.Append _ Object:=.CreateParameter( _ Name:="P支店", _ Type:=adInteger, _ Direction:=adParamInput) End With acmd.Parameters("P地域").Value = me.地域.value acmd.Parameters("P支店").Value = me.支店.value Set BRHMST = acmd.Execute() '選択される支店名が1つだけと決まっているならGETROWSの引数は省略出来る If BRHMST.EOF = False me.支店名.value=BRHMST.GETROWS() end if ---- '終了処理を忘れずに。 BRHMST.Close Set BRHMST = Nothing Set acmd = Nothing set db =Nothing -------------------------------------------- <提案3>SQL文を直接埋め込む 今作成しているモジュールを利用したい、というのなら、 >BRHMST.Open "QS_追加(支店検索)", db, adOpenStatic, , adCmdTableDirect の部分を次のように変更されてはどうですか? ただし、利用するコントロール値(数値or文字列? NULL値含む?""含む?) によっては、SQLステートメントが変更になります dim strSQL as string 'SQLステートメント strSQL ="SELECT 支店ID,支店名,地域ID FROM 支店マスタ" & VBnewLine _ & "WHERE 地域ID =" & Me.地域.value BRHMST.Open strSQL,db, adOpenStatic 以上 ご参考になれば幸いです。 |
▼しのしの さん: 長文のお返事、お忙しい中ありがとうございました。 <提案1>のコンボボックスを利用するやり方ですが、以前、別の処理をコンボボックスにて作成したところ、ユーザーより処理速度が遅いとの指摘を受けたことがあり、別の方法はないかと模索しておりました。 <提案3>のSQL文を直接埋め込むやり方ですが、私の苦手意識からクエリーでと手を抜いてしまいました。しのしのさんのお返事と過去のログなどを見て、以下のようにうたい何とかクリアできました。 BRHMST.Open "SELECT * " & "FROM BRHMST WHERE CODE= " & "'" & a & "'" & " AND BRH_CODE= " & "'" & b & "'" & "", _ db, adOpenStatic, , adCmdTableDirect Me![支店名] = BRHMST![BRH_NAME] 以上、ありがとうございました |