2022年5月19日木曜日

クラシック・レポートで表示する列を選択する

 クラシック・レポートに表示する列を、条件ごとに決める方法を考えてみました。

サンプル・データセットの表EMPを使用して、例となる実装を行ってみます。

表EMPの列EMPNO、ENAMEは固定で表示し、列SAL、COMMは表示を選択できるようにします。


サーバー側の条件を使う


クラシック・レポートのソース表名EMPです。ごく一般的なレポートの設定になります。ページ番号であることが前提です。


リージョン表示列の選択を作成します。識別タイプ静的コンテンツです。列の選択に使用するチェックボックスや、送信ボタンを配置します。


列SALの表示を制御するページ・アイテムP3_SHOW_SALを作成します。タイプチェックボックスを選択し、設定デフォルトの使用ONにします。デフォルトではチェックを入れた時に、ページアイテムの値はYになります。


同様に列COMMの表示を制御するページ・アイテムP3_SHOW_COMMを作成します。


送信ボタンB_SUBMITを作成します。動作アクションはデフォルトであるページの送信です。


今回、列JOB, MGRHIREDATEDEPTNOは条件に関係なく表示させないので、それらの列を選択し、構成ビルド・オプションコメント・アウトします。(ビルド・オプションのコメント・アウトが使用できるのはAPEX 21.2以降です。それ以前の場合、コメント・アウトというビルド・オプション -  除外するだけ - を作成しておきます。)


これから今回のテーマです。

SALを選択し、サーバー側の条件を設定します。

タイプアイテム = 値を選択し、アイテムP3_SHOW_SALとします。Yを指定します。これで、チェックボックスP3_SHOW_SALにチェックが入っているときのみ、列SALがレポートに表示されます。


COMMの設定も同様になります。アイテムP3_SHOW_COMMになります。



動的なSELECT文の生成と汎用列名の使用



レポートのソースとなるSELECT文自体に、列の選択を適用させます。レポートソースタイプSQL問合せを返すファンクション本体とし、ファンクション本体に以下を記述します。

ソース汎用列名の使用ONにして、汎用列数とします。この結果として、ソースとなる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文に合わせて設定しています。


COL04も同様の設定を行います。


以上で、サンプルとなる実装は完了です。

どちらの実装でも、記事の先頭にあるGIF動画の動作をします。

あらかじめ表示できる列が決まっていて、その中で列を非表示にする場合はサーバー側の条件で制御できるでしょう。表示する列自体がデータに依存する場合は、汎用列を使います。

さらに細かい実装であれば、表のピボットを実装したこちらの記事も参考になると思います。

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

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