過去ログ

                                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

 ───────────────────────────────────────  ■題名 : Re:フォームの値を参照するクエリー  ■名前 : しのしの  ■日付 : 03/11/18(火) 14:40  -------------------------------------------------------------------------
   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

以上 ご参考になれば幸いです。

 ───────────────────────────────────────  ■題名 : Re:フォームの値を参照するクエリー  ■名前 : パラメー  ■日付 : 03/11/18(火) 16:32  -------------------------------------------------------------------------
   ▼しのしの さん:
長文のお返事、お忙しい中ありがとうございました。

<提案1>のコンボボックスを利用するやり方ですが、以前、別の処理をコンボボックスにて作成したところ、ユーザーより処理速度が遅いとの指摘を受けたことがあり、別の方法はないかと模索しておりました。

<提案3>のSQL文を直接埋め込むやり方ですが、私の苦手意識からクエリーでと手を抜いてしまいました。しのしのさんのお返事と過去のログなどを見て、以下のようにうたい何とかクリアできました。

BRHMST.Open "SELECT * " & "FROM BRHMST WHERE CODE= " & "'" & a & "'" & " AND BRH_CODE= " & "'" & b & "'" & "", _
db, adOpenStatic, , adCmdTableDirect
   
Me![支店名] = BRHMST![BRH_NAME]

以上、ありがとうございました

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 435