VB5.0でACCESSのデータを扱っています。
フォームにテキストボックス(text1)とコンボボックス(combo1)があります。
テキストボックスに入力したID(変数 x を使います。)に応じたデータ(証券番号)をコンボボックスに表示させたいのですが
ACCESSのデザインはこんな感じです
テーブル:【顧客TBL】
-------------------------
フィールド名 データ型
-------------------------
ID 数値型 (主キー)
かな テキスト型
住所 テキスト型
-------------------------
テーブル:【契約TBL】
----------------------
フィールド名 データ型
----------------------
ID 数値型 (主キー)
保険種類 テキスト型
証券番号 テキスト型
----------------------
コードは
Private Sub Text1_Change()
Dim mdb As Database
Dim mrs As Recordset
Dim SQL As String
Dim x, i As Integer
x = Val(Text1.Text)
'データベースをオープン
Set mdb = OpenDatabase("顧客契約2.mdb")
'顧客TBLと契約TBLの選択クエリーを取得
SQL = " select 顧客TBL.顧客ID,顧客TBL.住所,契約TBL.証券番号 from 顧客TBL innner join 契約TBL on 顧客TBL.顧客ID = 契約TBL.顧客ID where 顧客TBL.顧客ID = " & x & " "
'条件に一致するレコードを取得
Set mrs = mdb.OpenRecordset(SQL, dbOpenDynaset)
i = 0
With Combo1
Do Until mrs.EOF
i = i + 1
'リストに全フィールドを追加
Combo1.AddItem mrs.Fields("証券番号")
mrs.MoveNext
Loop
End With
mrs.Close
end sub
ACCESSのデータは1つのIDに対していくつもの証券番号が登録できるようになっています。
例)
ID | 氏名 | 証券番号 |
--------------------------
1|山田 |123-223 |
1|山田 |555-888 |
:
:
:
11|大田 | 777-888 |
12|田中 |474-999 |
12|田中 |888-888 |
テキストボックスにID「12」を入力するとコンボボックスにIDが 12 の人の証券番号はでてくるのですが、同時にIDが「1」と「11」の人の証券番号もでてきます。
これを12の人のデータだけを出すようにするにはどうしたらよいのでしょうか??
結果に影響するか不明ですが、
>Dim x, i As Integer
この書き方だと、xがVariant型、iがInteger型として宣言されていますが、
それは期待通りですか?
Dim x As Integer, i As Integer
か
Dim x As Integer
Dim i As Integer
の意図だったとするとか。
それから、
契約TBL.顧客IDが、
「ACCESSのデザイン」として貴殿が示された「契約TBL」
の項目の中にありませんが、契約TBLに顧客IDがあるのであれば、
顧客TBLをJOINする必要が無いような気もします。
あと数値を文字列に連結するなら、暗黙の型変換に頼らず、
"SELECT 証券番号 FROM 契約TBL WHERE 顧客ID = " & CStr(x)
としたほうが間違いが無いです。
本題ですが、
抽出する前に、
Combo1.Clear
で前回抽出したリストをクリアしないと、
前回抽出したものに今回のものが追加されていって溜まってしまいますが
そこは大丈夫ですか?
Changeイベントに書かれているので、
「12」を入力しようとして、 「1」キーを打った瞬間に「1」のデータをAddItem、
「2」キーを打った瞬間に「12」のデータをAddItem
という動きをしそうですけど。
もげ様
たくさんアドバイスいただいてありがとうございます!!
変数のところは x も i も integer型で宣言したかったのですが、
知識不足ですみません。。
表結合せずに試みたところできました!
ほんとにありがとうございました♪
ツイート | ![]() |