データウィンドウの SELECT 文の条件を動的に追加する
方法
検索引数を利用して動的に条件を変更する場合、指定される可能性のあるすべての条件を WHERE 句としてあらかじめ準備しておく必要がありますが、データウィンドウの WHERE 句をスクリプトにより動的に追加することで、必要な条件のみを指定することができます。
この方法を利用することで、1 つのデータウィンドウオブジェクトを使用して条件の異なるクエリを発行して検索することもできます。
WHERE 句を動的に追加する方法には下記の 2 つの方法があります。
データウィンドウの定義を変更する
データウィンドウに定義されている SELECT 文を永続的に書き換えます。ウィンドウが閉じられるまで、追加された条件が適用され、一度指定した条件を変更したい場合は、前回指定した条件を除去する必要があります。
ウィンドウを開いた後で条件が変更されない場合はこの方法が有効です。
データウィンドウオブジェクトに定義された SELECT 文は DataWindow.Table.Select プロパティで取得/変更することができます。
以下の例では、同一データウィンドウオブジェクトを設定した dw_1 と dw_2 があり、それぞれ「emp_id が 1000 未満」、「emp_id が 1000 以上」という条件を追加して検索しています。
データウィンドウオブジェクトには WHERE 句を記述していない SELECT 文が定義されています。
// dw_1 用変数の定義 string ls_sql_dw1 string ls_sqlstat_dw1, ls_rc_modify_dw1 // dw_2 用変数の定義 string ls_sql_dw2 string ls_sqlstat_dw2, ls_rc_modify_dw2 // dw_1 の SQL 文を取得する ls_sql_dw1 = dw_1.Describe("DataWindow.Table.Select") // SQL 文に WHERE 句を追加する ls_sqlstat_dw1 += " WHERE emp_id < 1000" // WHERE 句を追加した SELECT 文をデータウィンドウに設定する ls_rc_modify_dw1 = dw_1.Modify("DataWindow.Table.Select=~"" + ls_sqlstat_dw1 + "~"") // データを取得する dw_1.Retrieve() // dw_2 の SQL 文を取得する ls_sql_dw2 = dw_2.Describe("DataWindow.Table.Select") // SQL 文に WHERE 句を追加する ls_sqlstat_dw2 += " WHERE emp_id >= 1000" // WHERE 句を追加した SELECT 文をデータウィンドウに設定する ls_rc_modify_dw2 = dw_2.Modify("DataWindow.Table.Select=~"" + ls_sqlstat_dw2 + "~"") // データを取得する dw_2.Retrieve()
実際に発行される SQL を書き換える
Retrieve 呼び出し時に発行される SQL をのみを変更します。データウィンドウの定義には手を加えないため、変更は 1 度のみ適用されます。次に Retrieve を呼び出す場合に再度条件を指定する必要があります。
検索を行うたびに条件が変わるような用途ではこちらの方法が有効です。
Retrieve で実際に発行される SELECT 文は、データウィンドウの SQLPreview イベントの sqlsyntax 引数で取得することができます。取得した SELECT 文に WHERE 句を追加し、SetSQLPreveiw 関数で SELECT 文を書き換えます。
以下の例では 1 つのデータウィンドウを使用して、ラジオボタンのチェック状態を判定して「emp_id が 1000 未満」、「emp_id が 1000 以上」という条件をそれぞれ追加して検索します。
データウィンドウオブジェクトには WHERE 句を記述していない SELECT 文が定義されています。
[データウィンドウの SQLPreview イベント]
string ls_newsql IF sqltype = PreviewSelect! THEN // ラジオボタンのチェック状態により条件を追加 CHOOSE CASE true CASE rb_1.checked // rb_1 がチェックされている場合 ls_newsql = sqlsyntax + " WHERE emp_id < 1000" CASE rb_2.checked // rb_2 がチェックされている場合 ls_newsql = sqlsyntax + " WHERE emp_id >= 1000" END CHOOSE // 変更後の SELECT 文を設定 this.SetSQLPreview(ls_newsql) END IF
Tips情報
プロダクト :PowerBuilder
バージョン :2019R3