コンボボックスのアイテムを SQLで検索するには どうすればいいでしょうか?
まずは、
コンボボックスの中身は
データベースに登録できてますか?
登録されていないデータはSQLで検索できませんよ
というか質問が大雑把すぎ
何で作って、どこまで分かってるの?
すいません^^;
VB6.0です。
オラクルデータベースで テーブルが二つあります。テーブルAとBとします。
今Bにカラーコードフィールドと色フィールドがあり
(テーブルB)
カラーコード 色
100 青
110 赤
120 黒
Aにカラーコードフィールドとその他のフィールドがいくつかあります。
配列を使って Bの色フィールドを色コンボボックスにセットし
ListIndexプロパティを使って テーブルAに無い色フィールドを条件に
テーブルAを検索できるようにはできるのですが
テーブルAのカラーコードフィールド以外のフィールドを条件に 色フィールドを検索し
色コンボボックスに表示させたいのです。
>テーブルAのカラーコードフィールド以外のフィールドを条件に
>色フィールドを検索し色コンボボックスに表示させたいのです。
難解な文章ですね。
テーブルAのカラーコードフィールドに含まれないBのカラーコード
フィールドを検索結果として抽出するということですか?
こういうこと?
SELECT 色 FROM テーブルA
WHERE カラーコード NOT IN
(SELECT カラーコード FROM テーブルB)
(テーブルA)
商品コード 〜 〜 〜 カラーコード
10000 120
11000 100
12000 110
13000 100
14000 100
テーブルAはこんな感じになっていて 商品コードを条件にして
カラーコードに対応する色フィールドを 表示させたいのです。
ん〜難解だけど、難しく考えすぎじゃないのかなぁ
ま、いいか・・・。SQLの問題なんだよね?
ん〜っと
SELECT A.* FROM A
WHERE NOT EXIST (SELECT NULL
FROM B
WHERE A.カラーコードフィールド = B.カラーコードフィールド)
これで、
Bのカラーコードフィールドと
Aのカラーコードフィールドが一致しない、Aのデータが取得できます。
つまり、あ さんの言った。
>テーブルAのカラーコードフィールドに含まれないBのカラーコード
>フィールドを検索結果として抽出する。
です。
>テーブルAのカラーコードフィールド以外のフィールドを条件
に何を絞り込むか?ですが、
Aのテーブルならば
SELECT A.* FROM A
WHERE NOT EXIST (SELECT NULL
FROM B
WHERE A.カラーコードフィールド = B.カラーコードフィールド)
AND カラーコードフィールド以外の条件
です。
上手い質問の仕方の1例として
何処の何(というフィールド)を、どうする。
という書き方をしないと伝わりにくいです。
あ〜、書き込んでいる間に、投稿があったみたいなので、再考
SELECT A.* FROM A
WHERE NOT EXIST (SELECT NULL
FROM B
WHERE A.カラーコードフィールド = B.カラーコードフィールド)
AND A.商品コード = '14000'
でFAかな?
prStrSql = "SELECT * FROM SYOUHIN WHERE NOT EXIST (SELECT NULL FROM M_HINSYU WHERE SYOUHIN.N_HINSYU_ID = M_HINSYU.N_HINSYU_ID) AND N_SYOUHIN_CD = " & txtSyouhinCd.Text & ""
このようにしたのですが これだと 「ORA-00936: missing expression」というエラーが出ます。
「NULL」を「*」にしても 同じエラーが出ますが 「NULL」は「*」では いけないのでしょうか?
別にかまわないですけれども、
Oracleが列フィールドを解析しようとするので、
厳密に言うと、時間はかかりますよ?
エラー番号の件は、OTNのメッセージ検索機能を使って原因を
解析してください。
OracleのSQLエラーの場合は、エラーコードを明記して質問するのが
わりとセオリーになっています。
ので、今回のケースは「ORA-00936」をキーワードにしてググってみると
いろいろなエラーパターンとその対処がごっそりヒットしますよ。
# N_SYOUHIN_CDあたりがCharじゃないですか?と疑ってみたり。
With prRsHinsyu
'先頭レコードから最終レコードまで実行
For prIntDatNoHinsyu = 0 To .RecordCount - 1
'品種名称フィールドを品種名称コンボボックスに追加
cboHinsyu.AddItem (.Fields("V_HINSYU_NM").Value)
'品種IDフィールドを配列に格納
prStrHinsyuId(prIntDatNoHinsyu) = .Fields("N_HINSYU_ID").Value
'次のレコードへ移動
.MoveNext
Next
End With
こんな感じで Form Loadイベントプロシージャで 配列に格納しているのですが
ListIndexプロパティを使用して 品種IDと品種名称を結びつけることは できないのでしょうか?
cboHinsyu.Text = prStrHinsyuId(prIntDatNoHinsyu)
cboHinsyu.ListIndex = prIntDatNoHinsyu
cboHinsyu.Text = cboHinsyu.List(cboHinsyu.ListIndex)
こうしても ListIndexプロパティの値は-1のままなので
アイテムリストから選択しないと ListIndexプロパティは 使えないのかな?
>アイテムリストから選択しないと ListIndexプロパティは 使えないのかな?
そうです。ヘルプにもあるように、
選択されていないときのリストインデックスの値は-1です。
>prStrSql = "SELECT * FROM SYOUHIN WHERE NOT EXIST (SELECT NULL FROM M_HINSYU WHERE SYOUHIN.N_HINSYU_ID = M_HINSYU.N_HINSYU_ID) AND N_SYOUHIN_CD = " & txtSyouhinCd.Text & ""
これでうまくいかなかったので
'SQLの指定
prStrSql = "SELECT * FROM SYOUHIN LEFT JOIN M_HINSYU ON M_HINSYU.N_HINSYU_ID = SYOUHIN.N_HINSYU_ID LEFT JOIN M_COLOR ON M_COLOR.N_COLOR_ID = SYOUHIN.N_COLOR_ID LEFT JOIN M_SIZE ON M_SIZE.N_SIZE_ID = SYOUHIN.N_SIZE_ID WHERE N_SYOUHIN_CD = " & txtSyouhinCd.Text & ""
'商品マスタレコードセットオブジェクトへ接続する
prRsSyouhin.Open prStrSql, prCn, adOpenStatic, adLockOptimistic
'品種コンボボックスにデータソースの指定
Set cboHinsyu.DataSource = prRsSyouhin
'品種コンボボックスへ表示
cboHinsyu.DataField = "V_HINSYU_NM"・・・※
こんな感じで テーブルの結合はうまくいったのですが ※で
「フィールドまたはデータメンバに連結できません」とエラーが出ます・・・。
もしかして Form_Loadイベントプロシージャで
'SQLのクリア
prStrSql = ""
'SQLの指定
prStrSql = "SELECT * FROM M_HINSYU"
'品種マスタレコードセットオブジェクトへ接続する
prRsHinsyu.Open prStrSql, prCn, adOpenStatic, adLockOptimistic
'品種コンボボックスにデータソースの指定
Set cboHinsyu.DataSource = prRsHinsyu
こうしてるのでエラーが出るのでしょうか?
データソースを変更する場合には いったん閉じないとまずいのでしょうか?
'品種コンボボックスにデータソースの指定
Set cboHinsyu.DataSource = prRsSyouhin
'品種コンボボックスへ表示
cboHinsyu.DataField = "N_HINSYU_ID"
'品種マスタ先頭レコード移動
prRsHinsyu.MoveFirst
'文字列の定義
Dim strHinsyuCriteria As String
'文字列への代入
strHinsyuCriteria = "N_HINSYU_ID = '" & cboHinsyu.Text & "'"
'品種マスタの特定の品種IDへレコード移動
prRsHinsyu.Find strHinsyuCriteria, 0, adSearchForward
'品種コンボボックスへ表示
cboHinsyu.ListIndex = prRsHinsyu.AbsolutePosition - 1
これでできました。
ありがとうございました。
ツイート | ![]() |