クラシック・レポートに表示する列を、条件ごとに決める方法を考えてみました。
サンプル・データセットの表EMPを使用して、例となる実装を行ってみます。
表EMPの列EMPNO、ENAMEは固定で表示し、列SAL、COMMは表示を選択できるようにします。
サーバー側の条件を使う
クラシック・レポートのソースの表名はEMPです。ごく一般的なレポートの設定になります。ページ番号が3であることが前提です。
列SALの表示を制御するページ・アイテムP3_SHOW_SALを作成します。タイプにチェックボックスを選択し、設定のデフォルトの使用をONにします。デフォルトではチェックを入れた時に、ページアイテムの値はYになります。
同様に列COMMの表示を制御するページ・アイテムP3_SHOW_COMMを作成します。
送信ボタンB_SUBMITを作成します。動作のアクションはデフォルトであるページの送信です。
今回、列JOB, MGR、HIREDATE、DEPTNOは条件に関係なく表示させないので、それらの列を選択し、構成のビルド・オプションでコメント・アウトします。(ビルド・オプションのコメント・アウトが使用できるのはAPEX 21.2以降です。それ以前の場合、コメント・アウトというビルド・オプション - 除外するだけ - を作成しておきます。)
これから今回のテーマです。
列SALを選択し、サーバー側の条件を設定します。
タイプにアイテム = 値を選択し、アイテムはP3_SHOW_SALとします。値にYを指定します。これで、チェックボックスP3_SHOW_SALにチェックが入っているときのみ、列SALがレポートに表示されます。
列COMMの設定も同様になります。アイテムはP3_SHOW_COMMになります。
動的なSELECT文の生成と汎用列名の使用
レポートのソースとなるSELECT文自体に、列の選択を適用させます。レポートのソースのタイプをSQL問合せを返すファンクション本体とし、ファンクション本体に以下を記述します。
ソースの汎用列名の使用をONにして、汎用列数を4とします。この結果として、ソースとなるSELECT文の評価に関係なく、列COL01からCOL04までがレポートに作成されます。
チェックボックスの指定に従って、レポートのソースとして実行されるSELECT文が変わります。
給与のみにチェックが入っている場合は、以下のSELECT文が実行されます。
select empno, ename, sal from emp
給与と手当にチェックが入っている場合は、以下です。
select empno, ename, sal, comm from emp
手当だけのときは以下です。
select empno, ename, comm from emp
両方にチェックが入っていないときは以下です。
select empno, ename from emp
以上より、汎用列のCOL03、COL04は条件によって給与または手当が表示されることになります。
一番目の列COL01は、つねに列EMPNOが表示されるため、ラベルは従業員番号で固定できます。
列COL02も同様に、つねに列ENAMEが表示されるため、ラベルは従業員名で固定できます。
列COL03は列SALと列COMMのどちらが表示されるか、決まっていません。そのため、ラベル名を保持するページ・アイテムP2_COL03_LABELを作成し、タイプを非表示とします。
列COL03のラベルとして&P2_COL03_LABEL.を設定します。ページ・アイテムP2_COL03_LABELの値は、ソースとなるファンクション中で作成される、SELECT文に合わせて設定しています。
以上で、サンプルとなる実装は完了です。
どちらの実装でも、記事の先頭にあるGIF動画の動作をします。
あらかじめ表示できる列が決まっていて、その中で列を非表示にする場合はサーバー側の条件で制御できるでしょう。表示する列自体がデータに依存する場合は、汎用列を使います。
さらに細かい実装であれば、表のピボットを実装したこちらの記事も参考になると思います。
今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/classic-report-column-selection.sql
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完