複数のコンボボックスで絞込み

解決


yamada  2013-04-23 20:42:24  No: 44403

stringにSQL文を貯めこんでいく方式で、
データの検索をしています。

コンボボックス(検索項目)とエディット(検索文字)のセットが4つあります。

コンボボックスには
「レコードID」、
「氏名」、
「氏名カナ」、
「電話番号」
の4項目が4つのコンボボックスそれぞれ Item.Addされています。

仮にコンボボックスの名前を
combo_key1、
combo_key2、
combo_key3、
combo_key4

エディットの名前を
edit_key1、
edit_key2、
edit_key3、
edit_key4  とします。

それぞれのコンボボックスに例えば、
combo_key1 = 氏名カナ、
combo_key2 = 電話番号、
combo_key3 = 氏名カナ、
combo_key4 = 電話番号

が選択されていて、
全てのエディットにも検索文字が入力されていた場合に、

where (氏名カナ='アイウエオ' or 氏名カナ='カキクケコ') and (電話番号 = '000-0000' or 電話番号 = '000-0000')
と、自動的にSQL文を作成したいのです。

コンボボックスに「レコードID」、「氏名」、「氏名カナ」、「電話番号」の別々の選択がされていたら、全て「and」でつなげ、
同一項目が選択されている場合は、「or」でつなげたいのです。

いろいろ試行錯誤しているのですが、私には難しく悩んでおります。

どなたか手助けお願いします!


au  2013-04-23 20:57:49  No: 44404

ぱっと思いついた方法としては、StringListをキーが4つなら4つ用意して、選択されてるのがレコードIDなら1個目のリストに、氏名が選択されてるなら2個目のリストにという風にキー毎に検索条件をリストに追加するようにしておいて

最後に、それぞれのリスト内の項目はorで繋いで、最後にそれぞれのリストから作成した条件をandで繋ぐという風にすればどうでしょ?


yamada  2013-04-23 23:35:52  No: 44405

auさん

回答有り難うございます。
なるほど、その発想はありませんでした。

早速やってみましたところ、

TStringListに値を入れて、
1〜4のstringlistから値を抽出する場合、
forで回して取得したいと思い

for i:=1 to 4 do begin
  TStringList(FindComponent('keylist'+IntToStr(i))).Text

という感じでやろうとしたのですが、
TStringListは使えないのですね。
keylistは名前です。

楽にやりたいと思うのですが、良い方法ないでしょうか?
重ね重ねお願いします。


KHE00221  2013-04-24 00:04:36  No: 44406

ComboBoxだけど

var
    StringList: TStringList;
    I: Integer;
    C1: String;
    B: Boolean;
    Result: String; //結果
begin
    StringList := TStringList.Create;
    StringList.AddObject(ComboBox1.Text+ '=' + Char(39) + Edit1.Text + Char(39) , TObject(ComboBox1.ItemIndex) );
    StringList.AddObject(ComboBox2.Text+ '=' + Char(39) + Edit2.Text + Char(39) , TObject(ComboBox2.ItemIndex) );
    StringList.AddObject(ComboBox3.Text+ '=' + Char(39) + Edit3.Text + Char(39) , TObject(ComboBox3.ItemIndex) );
    StringList.AddObject(ComboBox4.Text+ '=' + Char(39) + Edit4.Text + Char(39) , TObject(ComboBox4.ItemIndex) );
    StringList.Sort;

    Result := StringList[0];

    C1 := '';
    B := False;
    for I:=1 to StringList.Count - 1 do
    begin
      if Integer(StringList.Objects[I-1]) = Integer(StringList.Objects[I]) then
      begin
        C1 := ' or ';
      end
      else
      begin
        C1 := ') and (';
        B := True;
      end;
      Result := Result + C1 + StringList[I]
    end;

    if B = True then Result := '(' + Result + ')';

    StringList.Free;


yamada  2013-04-24 00:44:05  No: 44407

KHE00221さん

回答有り難うございます。
バッチリでした!

StringListの使い方をよくわかってませんで、
目から鱗でした。
プログラムがすごくスマートになりました。

大変勉強になりました。

お二方、ありがとうございました!


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

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






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