表結合をして変数使ってレコード抽出するには

解決


たけあ  2007-02-15 23:14:25  No: 135292

VB5.0でACCESSのデータを扱っています。
フォームにリストボックス(list1)とテキストボックス(text1)があります。
テキストボックスに入力した文字(変数 KANA を使います。)を含むレコードをリストボックスに表示させたいのですが
エラー「パラメータが少なすぎます。1を指定してください」とでます。

ACCESSのデザインはこんな感じです

テーブル:【顧客TBL】
-------------------------
フィールド名 データ型 
-------------------------
ID 数値型 (主キー) 
かな テキスト型 
住所 テキスト型 
-------------------------

テーブル:【契約TBL】
----------------------
フィールド名 データ型  
----------------------
ID 数値型 (主キー) 
保険種類 テキスト型 
証券番号 テキスト型 
----------------------

コードはこんな感じです

Private Sub Command1_Click()

List1.Clear

Dim mdb As Database
Dim SQL1 As String
Dim mrs1 As Recordset
Dim KANA As String

KANA = Text2.Text

'データベースをオープン
Set mdb = OpenDatabase("顧客契約2.mdb")

'選択クエリーを取得
SQL1 = "select 顧客TBL.顧客ID,顧客TBL.顧客かな,契約TBL.保険種類,契約TBL.証券番号 from 顧客TBL left join 契約TBL on 顧客TBL.顧客ID = 契約TBL.顧客ID where 顧客ID.顧客かな like ""%" & KANA & "%"" "

'条件に一致するレコードを取得
Set mrs1 = mdb.OpenRecordset(SQL1, dbOpenDynaset) 

         ↑
「パラメータが少な すぎます。1を指定してください」
のエラーがでて、mrs1 = nothing

If Text2.Text <> "" Then

List1.Clear

List1.AddItem Left(mrs1.Fields("顧客ID") & Space(3), 3) + vbTab + Left(mrs1.Fields("顧客かな") & Space(10), 10) + vbTab + Left(mrs1.Fields("保険種類") & Space(10), 10) + vbTab + mrs1.Fields("証券番号")

'オブジェクトを閉じる
mrs1.Close
mdb.Close

'オブジェクトを解放
Set mrs1 = Nothing
Set mdb = Nothing

色々試しましたがエラーの意味がよくわかりません。
わかる方どうぞよろしくお願いします。。


魔界の仮面弁士  2007-02-16 02:38:34  No: 135293

> 「パラメータが少な すぎます。1を指定してください」

このエラーが出る時は、SQL 中に「スペルミス」がある可能性が高いですよ。
つまり、

・SQL 中に、列名や関数名として認識できない、未定義のキーワードが 1 つ含まれていた。
・Jet はそれを、SQL 中の変数(パラメータ)であると解釈した。
・しかし、QueryDef を経由せずに Recordset を開いているため、その Parameter は処理されていない。
・結果として、エラーメッセージが表示される。

のような状況である、ということです。

で。もしかしたら、
  Dim Q As DAO.QueryDef
  Set Q = DB.CreateQueryDef("", SQL)
のようにして無名クエリを作り、それを
  Dim P As DAO.Parameter
  For Each P In Q.Parameters
    Debug.Print P.Name
  Next
のようにして Parameter を列挙することで、その
「変数とみなされてしまった未定義キーワード」を
調べることができるかも。


魔界の仮面弁士  2007-02-16 02:42:18  No: 135294

あぁ、これかな。

> where 顧客ID.顧客かな like ""%" & KANA & "%""

FROM 句にあるテーブルは、[顧客TBL] と [契約TBL] だけなのに、
WHERE 句では、[顧客ID] というテーブルを参照しようとしていますね。


たけあ  2007-02-16 20:45:56  No: 135295

魔界の仮面弁士様
毎度ありがとうございます。
顧客IDのところを顧客TBLと書かないといけませんでした。
ご指摘通りでした。
つまらないミスで申し訳ないです。
お手数かけてすみません。
ありがとうございました!!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加