データウィンドウで未入力の条件を無視して検索する
2021/09/03
方法
データウィンドウでの検索において、複数ある条件の中からユーザーに任意の条件を指定させる場合など条件の個数が固定ではない場合に、未入力の条件を無視した検索を実装する方法がいくつかあります。
方法 1 : 動的に条件を追加する
検索を行う前に指定された条件から WHERE 句を生成して追加します。
データウィンドウのデータソースでは WHERE 句のない SELECT 文を定義しておき、SQLPreview イベント内で入力された条件のみを WHERE 句として生成します。
【例】
[SQLPreview イベント]
string ls_where string ls_arg1, ls_arg2, ls_arg3 IF request = PreviewFunctionRetrieve! THEN // 入力された条件を取得 ls_arg1 = sle_1.text ls_arg2 = sle_2.text ls_arg3 = sle_3.text // 入力された条件から WHERE 句を生成 // 条件1 IF ls_arg1 <> "" THEN ls_where += "COLUMN1 = '" + ls_arg1 + "' " END IF // 条件2 IF ls_arg2 <> "" THEN IF ls_where <> "" THEN ls_where += "AND " ls_where += "COLUMN2 = '" + ls_arg2 + "' " END IF // 条件3 IF ls_arg3 <> "" THEN IF ls_where <> "" THEN ls_where += "AND " ls_where += "COLUMN3 = '" + ls_arg3 + "' " END IF // いずれかの条件が入力されている場合 IF ls_where <> "" THEN ls_where = " WHERE " + ls_where // 発行する SQL を編集 this.SetSQLPreview(sqlsyntax + ls_where) END IF END IF
なお、データウィンドウの SELECT 文を動的に変更する方法にはプロパティを変更する方法もあります。
データウィンドウの SELECT 文の WHERE 句を動的に変更する
方法 2 : 検索した後でフィルターによりデータを絞り込む
すべてのデータを検索した後、データウィンドウのフィルター機能によりデータを絞り込みます。
方法 1 と同様に入力された条件のみをフィルター式に追加します。
【例】
[検索処理]
string ls_filter string ls_arg1, ls_arg2, ls_arg3 dw_1.Retrieve() // 条件を取得 ls_arg1 = sle_1.text ls_arg2 = sle_2.text ls_arg3 = sle_3.text // フィルター条件を生成 // 条件1 IF ls_arg1 <> "" THEN ls_filter += "COLUMN1 = '" + ls_arg1 + "' " END IF // 条件2 IF ls_arg2 <> "" THEN IF ls_filter <> "" THEN ls_filter += "AND " ls_filter += "COLUMN2 = '" + ls_arg2 + "' " END IF // 条件3 IF ls_arg3 <> "" THEN IF ls_filter <> "" THEN ls_filter += "AND " ls_filter += "COLUMN3 = '" + ls_arg3 + "' " END IF // フィルター条件を設定 dw_1.SetFilter(ls_filter) // フィルターを適用 dw_1.Filter()
方法 3 :指定されなかった条件が無視される SELECT 文を記述する
データウィンドウで下記のような SELECT 文を定義し、指定されなかった条件については Retrieve の引数に NULL 値を渡して、NULL 値以外の条件のみでデータが絞り込まれるようにします。
[データウィンドウのデータソース] (検索引数に as_arg1, as_arg2, as_arg3 を設定)
SELECT COLUMN1, COLUMN2, COLUMN3 FROM SAMPLE_TABLE WHERE (COLUMN1 = :as_arg1 OR :as_arg1 IS NULL) AND (COLUMN2 = :as_arg2 OR :as_arg2 IS NULL) AND (COLUMN3 = :as_arg3 OR :as_arg3 IS NULL)
[検索処理]
string ls_arg1, ls_arg2, ls_arg3 // 条件を取得 ls_arg1 = sle_1.text ls_arg2 = sle_2.text ls_arg3 = sle_3.text // 未入力の場合は NULL を設定 IF ls_arg1 = "" THEN SetNull(ls_arg1) IF ls_arg2 = "" THEN SetNull(ls_arg2) IF ls_arg3 = "" THEN SetNull(ls_arg3) // 検索 dw_1.Retrieve(ls_arg1, ls_arg2, ls_arg3)
Tips情報
プロダクト :PowerBuilder
バージョン :2019R3