データウィンドウで未入力の条件を無視して検索する

PowerBuilder Tips

方法

データウィンドウでの検索において、複数ある条件の中からユーザーに任意の条件を指定させる場合など条件の個数が固定ではない場合に、未入力の条件を無視した検索を実装する方法がいくつかあります。

方法 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

Tips 一覧を見る
PowerBuilder マイグレーション
PowerBuilder学習、動画で始めちゃう?