スマート・フィルタが適用されるクラシック・レポートで表示される列を選択したい、という相談がありました。
クラシック・レポートの表示列は、サーバー側の条件を設定することにより非表示にできます。ただし、スマート・フィルタはクラシック・レポートをソースにしているため、その列に適用されるフィルタが存在する場合、そのフィルタもサーバー側の条件を使って非表示にする必要があります。また、フィルタを非表示にした場合、ページのリロードを行う必要があります。
以上の処理を実装してみました。
アプリケーション作成ウィザードを起動します。
名前はスマート・フィルタと列選択とします。デフォルトで作成されるホーム・ページを削除し、表EMPをソースとしてスマート・フィルタのページを追加します。
ホーム・ページを削除した後、ページの追加をクリックし、スマート・フィルタを選択します。
スマート・フィルタの追加のダイアログにて、ページ名はEMP、レポートを選択し、表としてEMPを指定します。
ページの追加をクリックします。
以上の作業を行なったのち、アプリケーションの作成をクリックします。
アプリケーションが作成されたら、スマート・フィルタが実装されたページをページ・デザイナで開きます。
最初に列を選択するために使用するページ・アイテムを作成します。
作成したページ・アイテムの識別の名前はP1_COLUMNS、タイプとしてチェックボックス・グループを選択します。ラベルは列選択とします。チェックボックスを横並びにするため、設定の列の数に4を指定します。
LOVのタイプに静的値を選択し、静的値として表示値と戻り値が同じSAL、JOB、DEPTNOを設定します。追加値の表示は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'
select 1 from apex_string.split(:P1_COLUMNS,':') where column_value = 'DEPTNO'
以上で今回の実装は完了です。アプリケーションを実行すると、本記事の先頭のGIF動画のようになります。
面積が増えますが、列の選択にチェックボックス・グループの代わりにシャトルを使っても良いでしょう。
https://github.com/ujnak/apexapps/blob/master/exports/column-selection-with-smart-filter.zip
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完