2024年8月8日木曜日

Oracle JETのチャートをレポートに組み込む

Oracle APEXはチャートを表示するライブラリとしてOracle JETを使用しています。Oracle APEX 24.1には、Oracle JET 16.0.1がバンドルされています。

Oracle JETを使用するにあたって参照するドキュメントは、主にCookbookになるかと思います。Oracle APEX 24.1でバンドルされている16.0.1に近いバージョンのCookbookへのリンクです。

2024年8月8日時点での最新バージョンは16.1.0のようです。URLからバージョン番号を除くと、最新のCookbookにアクセスできます。

Oracle APEXではチャートはリージョンとして実装されています。リージョンは入れ子にできないため、チャート・リージョンをレポート・リージョンやカード・リージョンに埋め込むことはできません。

この制限を回避するため、Oracle JETのチャート・コンポーネントをOracle APEXのリージョンを介さずに、直接レポート・リージョンやカード・リージョンに埋め込んでみます。また、Oracle JETのチャートを、Oracle APEXのテンプレート・コンポーネントにしてみます。

Oracle JETチャートのレポートへの組み込みを、以下より段階を踏んで作業していきます。作業にはサンプル・データセットEMP/DEPTを使用します。

作業に使用する空のAPEXアプリケーションを作成します。名前Integrating JET Chartsとします。



標準のチャート



最初にOracle APEXに組み込みのチャート・リージョンを使って、バー・チャートを作成します。

リージョンを作成し、識別タイプとしてチャートを選択します。


チャートの属性を開き、チャートタイプとして外観向きとしてを選択します。


シリーズを選択し、識別名前SALとします。ソース表名EMPを選択し、WHERE句deptno = 10並替え基準タイプ静的値ORDER BY句empno ascと記述します。

列のマッピングラベルENAMESALを割り当てます。


作成したページを実行すると、以下のように表示されます。このバー・チャートの表示を基準として、Oracle JETを直接呼び出して同じバー・チャートを表示させます。




oj-chart要素の埋め込み



Oracle JETより提供されているoj-chart要素を静的コンテンツに埋め込んで、バー・チャートを表示します。oj-chart要素の関するドキュメントは以下より参照します。

ページ中でOracle JETのコンポーネントを呼び出せるように、ページ・プロパティにいくつか設定を行います。

JavaScriptファイルURLに以下を記述します。

[require jet]

ページ・ロード時に実行に以下を記述します。埋め込む要素がoj-chartなので、requireojs/ojchartを指定しています。

require(["ojs/ojchart"], function() {});

CSSファイルURLとして以下を記述します。

#JET_CSS_DIRECTORY#redwood/oj-redwood-notag-min.css


データベースより取り出した値を保持するページ・アイテムとして、P2_GROUPSP2_VALUEを作成します。タイプ非表示です。


ページ・アイテムP2_GROUPS計算を作成します。実行ポイントリージョンの前を選択し、ページ・レンダリングの開始前に、ページ・アイテムに値を設定します。

計算タイプとしてSQL問合せ(単一の値を返す)を選択し、SQL問合せとして以下を記述します。
select
    json_arrayagg(
        json_object(
            'name' value ename
        )
    order by empno asc )
from emp where deptno = 10
バー・チャートのそれぞれのバーとなる従業員の名前を、従業員番号の昇順に並べたJSON配列として返しています。


同様にページ・アイテムP2_VALUEにも計算を作成します。SQL問合せは以下になります。
select
    json_arrayagg(
        sal
    order by empno asc )
from emp where deptno = 10
給与を、従業員番号の昇順で並べたJSON配列として返しています。P2_GROUPSの従業員名の配列中の位置と、同じ位置に給与が配置されます。


タイプ静的コンテンツのリージョンの、ソースHTMLコードに以下を記述します。



以上で実装は完了です。ページを実行すると以下のように表示されます。



テンプレート・コンポーネントによる実装



oj-chart要素を直接埋め込む代わりに、Oracle JETのチャートを描画するテンプレート・コンポーネントを作成し、それを使ってチャートを描画します。

最初にテンプレート・コンポーネントを作成します。

共有コンポーネントプラグインを開きます。


作成をクリックします。


プラグインの作成最初からとして、へ進みます。


プラグイン名前JET Bar Chart内部名APEXUGJ.JET.BARCHARTとします。テンプレート・コンポーネントプラグインの一種であり、単体でエクスポート/インポートが可能です。その際に、世界の誰かが作成したプラグインの静的IDとぶつからないように、世界で一意となるであろう値を静的IDとして設定します。

タイプテンプレート・コンポーネントを選択します。テンプレート次として使用可能は、単一(部分)のみにチェックを入れます。リージョンまたはレポート列のタイプとして選択可能なテンプレート・コンポーネントになります。

部分に以下を記述します。Oracle JETとして提供されているカスタム要素(今回のバー・チャートではoj-chart)によるチャートの描画は非同期で実行されます。Oracle APEXのレポートも描画は非同期で行われます。Oracle APEXがレポートを描画する際に、oj-chart要素がチャートの描画を完了するまで待つことはないため、結果としてレポート列にチャートが描画されません。

そのため、同期処理としてチャートを描画するカスタム要素a-jet-bar-chartを作成し、それをテンプレート・コンポーネントに埋め込みます。

ここで一旦、プラグインの作成を行います。


テンプレート・コンポーネントJET Bar Chartが作成されます。テンプレート部分に書き込まれた置換文字列が認識され、カスタム属性としてCSS ClassesGroupsValueColorOrientationが作成されます。

作成されたカスタム属性は、タイプがすべてセッション・ステート値(つまりアイテム)となっています。GroupsValueセッション・ステート値ですが、CSS ClassesColorおよびOrientationは違うため、これらを設定を変更します。


カスタム属性CSS Classesを開きます。

表示順序の数値の昇順で、コンポーネントの設定項目の表示順序が決まります。主要な設定の順番で表示されるように調整します。ラベルCSS Classesとします(デフォルトではCss Classes)。タイプテキストを選択します。

カスタム属性が必須の場合は、必須オンにします。CSS Classes必須オフです。エスケープ・モードは(HTMLの属性に与える値なので)HTML属性を選択します。


カスタム属性Colorを開きます。

設定タイプカラーに変更し、エスケープ・モードHTML属性とします。

変更の適用をクリックします。


カスタム属性Orientationを開きます。

設定タイプ選択リストエスケープ・モードHTML属性に変更します。

静的LOV値の追加をクリックします。


表示値戻り値ともにhorizontalを入力します。作成後、さらに作成をクリックします。


表示値戻り値ともにverticalを入力します。作成をクリックします。


静的LOVが設定できたので変更の適用をクリックし、カスタム属性Orientationの設定を完了します。


カスタム属性Groupsを開き、設定エスケープ・モードHTML属性に変更します。


カスタム属性Valueを開き、設定エスケープ・モードHTML属性に変更し、かつ、必須オンにします。


カスタム要素a-jet-bar-chartに関する実装を追加します。

ファイルのセクションに移動し、ファイルの作成をクリックします。このテンプレート・コンポーネントとともにページにロードされるJavaScriptのファイルを作成します。


ディレクトリjsファイル名script.jsとします。

作成をクリックします。


js/script.jsの本文として以下を記述します。

変更の保存を行い、取消をクリックしてエディタを閉じます。


ファイルとしてjs/script.jsおよびjs/script.min.jsが作成されたことを確認します。

ロードするファイルURLに作成したファイルを記述します。

カスケード・スタイルシートに以下を記述します。

#JET_CSS_DIRECTORY#redwood/oj-redwood-notag-min.css

JavaScriptに以下を記述します。

[require jet]#PLUGIN_FILES#js/script#MIN#.js

変更の適用をクリックします。


以上でバー・チャートを描画するテンプレート・コンポーネントJET Bar Chartは完成です。

oj-chart要素にてバー・チャートを描画していたページのコピーをページ番号3として作成し、静的コンテンツのリージョンを変更します。

ページ・プロパティJavaScriptファイルURLページ・ロード時に実行CSSファイルURLは空白にします。これらはテンプレート・コンポーネントJET Bar Chartのロード時にロードされます。


oj-chart要素を含んだ静的コンテンツのリージョンのタイプJET Bar Chartに変更します。

外観テンプレートStandardにします。


リージョンの属性を開き、テンプレート・コンポーネントJET Bar Chartに作成したカスタム属性を設定します。

Groupsにはページ・アイテムP3_GROUPSValueにはP3_VALUESを設定します。Colorには文字列#309fdbOrientationにはhorizontalを選択します。


ページの変更を保存し、実行すると以下のように表示されます。




oj-chart要素による対話モード・レポートへの組み込み



oj-chart要素を使って、対話モード・レポートの列にバー・チャートを表示させます。

対話モード・レポートのソースSQL問合せとして以下を記述します。
select
    dname,
    json_arrayagg(
        json_object(
            'name' value ename
        )
    order by empno asc ) groups,
    json_arrayagg(
        sal
    order by empno asc) value,
    '' chart
from emp_dept_v group by dname

CHARTにバー・チャートを表示するよう、HTML式に以下を記述します。



oj-chart要素によるチャートの生成なので、ページ・プロパティに前出の設定を加えます。


以上の設定を行い、ページを実行すると以下のように表示されます。


レポートの描画とoj-chartの描画の両方が非同期である問題は、ページ送りを行うと発生します。

ページごとの行数に設定し、ページ送りができるようにします。


次ページを表示します。


次のページに移りますが、チャートは表示されません。

チャートを表示するには、ページを再ロードする必要があります。


ページ送りをするたびにページの再ロードを実施するのは大変なので、ワークアラウンドとして動的アクションを作成しページを再ロードします。

対話モード・レポートに動的アクションを作成します。

タイミングイベントリフレッシュ後です。


リフレッシュ後に実行するTRUEアクションとしてJavaScriptコードの実行を選択し、設定コードとして以下を記述します。ページの再ロードを実行しています。

location.reload();


ワークアラウンドの設定は以上です。


テンプレート・コンポーネントによる対話モード・レポートへの組み込み



oj-chart要素を使った対話モード・レポートのページをコピーし、テンプレート・コンポーネントJET Bar Chartを使った実装に置き換えます。

CHARTを選択し、識別タイプJET Bar Chartに変更します。

設定CSS Classesとしてw600Groupsとして列GROUPSValueとして列VALUEを選択します。Colorには#309fdbを指定し、Orientationhorizontalを選択します。

ワークアラウンドとして設定した動的アクションは、不要なので削除します。


ページ・プロパティJavaScriptファイルURLページ・ロード時に実行CSSファイルURLは空白にします。

以上の変更を保存しページを実行すると、以下のように表示されます。ページ送りを行っても、レポートは正しく描画されます。


今回の記事は以上になります。

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

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