2023年2月22日水曜日

スマート・フィルタでの列の選択

 スマート・フィルタが適用されるクラシック・レポートで表示される列を選択したい、という相談がありました。

クラシック・レポートの表示列は、サーバー側の条件を設定することにより非表示にできます。ただし、スマート・フィルタはクラシック・レポートをソースにしているため、その列に適用されるフィルタが存在する場合、そのフィルタもサーバー側の条件を使って非表示にする必要があります。また、フィルタを非表示にした場合、ページのリロードを行う必要があります。

以上の処理を実装してみました。


アプリケーションの作成には、サンプル・データセットに含まれるEMP/DEPTを使用します。

アプリケーション作成ウィザードを起動します。

名前はスマート・フィルタと列選択とします。デフォルトで作成されるホーム・ページ削除し、表EMPソースとしてスマート・フィルタのページを追加します。


ホーム・ページを削除した後、ページの追加をクリックし、スマート・フィルタを選択します。


スマート・フィルタの追加のダイアログにて、ページ名EMPレポートを選択し、としてEMPを指定します。

ページの追加をクリックします。


以上の作業を行なったのち、アプリケーションの作成をクリックします。

アプリケーションが作成されたら、スマート・フィルタが実装されたページをページ・デザイナで開きます。

最初に列を選択するために使用するページ・アイテムを作成します。

作成したページ・アイテムの識別名前P1_COLUMNSタイプとしてチェックボックス・グループを選択します。ラベル列選択とします。チェックボックスを横並びにするため、設定列の数4を指定します。


LOVのタイプに静的値を選択し、静的値として表示値戻り値が同じSALJOBDEPTNOを設定します。追加値の表示OFFにします。


ページ・アイテムP1_COLUMNが変更されたときにページをリロードさせるために、P1_COLUMNSに動的アクションを作成します。

識別名前列選択の変更とします。タイミングはデフォルトでイベント変更選択タイプアイテムアイテムとして(動的アクションの作成を実行したアイテムである)P1_COLUMNSが選ばれます。


TRUEアクションとして、ページの送信を指定します。


これよりクラシック・レポートの列とフィルタに、サーバー側の条件を設定します。

ページ・アイテムP1_COLUMNSには、すべての項目にチェックが入っているときはSAL:JOB:DEPTNO、SALESとJOBのときはSAL:JOBという形で、選択されている項目の戻り値:(コロン)で区切られて保存されます。

フィルタP1_JOBとレポートの列JOBを選択します。サーバー側の条件タイプとして行が返されるを選択し、SQL問合せに以下を記述します。

select 1 from apex_string.split(:P1_COLUMNS,':') where column_value = 'JOB'


フィルタP1_SAL、列SALに対して、サーバー側の条件を設定します。

select 1 from apex_string.split(:P1_COLUMNS,':') where column_value = 'SAL'


フィルタP1_DEPTNO、列DEPTNOについても、同様の設定を行います。

select 1 from apex_string.split(:P1_COLUMNS,':') where column_value = 'DEPTNO'


以上で今回の実装は完了です。アプリケーションを実行すると、本記事の先頭のGIF動画のようになります。

面積が増えますが、列の選択にチェックボックス・グループの代わりにシャトルを使っても良いでしょう。


今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/column-selection-with-smart-filter.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。