対話モード・レポートのソースがローカル・データベースではなく、REST APIなどを経由したデータ・ソースである場合では、無駄なAPI呼び出しは避けたいです。また、課金が発生する場合は、ボタンを明示的に押したときに限りAPIを呼び出すように限定したいです。
エクスポートされている以下のアプリケーションに、上記の要件を満たすため動的アクションを追加しました。
https://github.com/ujnak/apexapps/blob/master/exports/llama2-ui-test.zip
対話モード・レポートの表示に時間がかかる場合に活用できる、一般的な実装です。
以下の2つの機能を実装しています。
- ページ・ロード時は、対話モード・レポートに一覧を表示しない(データ・ソースへの問い合わせを行わない)。
- ボタンQUERYをクリックすると対話モード・レポートのリフレッシュが開始します。リフレッシュが完了するまでボタンQUERYを無効化し、連続したクリックを無視します。リフレッシュが完了したら、ボタンQUERYを有効化します。
以下、追加した実装の説明です。
最初に対話モード・レポートの属性の遅延ロードをオンに変更します。
遅延ロードがオフの場合、ページ・ロードの間に対話モード・レポートの表示が行われるため、後で使用するリフレッシュ前のイベントが発生しません。リフレッシュ前のイベントが取れないと、リフレッシュ処理をキャンセルできません。
対話モード・レポートに動的アクションを作成します。識別の名前はBefore Refresh Responseとしています。
実行のイベント有効範囲に1回を選択します。
遅延ロードがオンであるため、ページ・ロード時にイベントapexfreshが対話モード・レポートに送られ、ページ・ロードとは非同期で対話モード・レポートのリフレッシュが開始されます。ページ・ロード時のリフレッシュ処理が常に1回目のリフレッシュになるため、動的アクションBefore Refresh Responseはページ・ロードのときだけ評価されます。
タイミングのイベントはリフレッシュ前、選択タイプはリージョン、リージョンはResponseになります。
TRUEアクションとしてイベントの取消を選択します。動的アクションのタイミングはリフレッシュ前なので、これから実行されるはずだったリフレッシュ処理が取り消されます。時間のかかるLlama.cpp(Llama2)への問い合わせもキャンセルされます。
TRUEアクションとして無効化を選択し、影響を受ける要素の選択タイプにボタン、ボタンにQUERYを選びます。対話モード・レポートのリフレッシュを行なうアクションよりも先に実行されるよう、Trueアクションの一番上に配置します。
対話モード・レポートに動的アクションを作成します。
タイミングのイベントはリフレッシュ後を選択します。
TRUEアクションとして有効化を選択します。影響を受ける要素の選択タイプはボタン、ボタンとしてQUERYを選択することにより、ボタンQUERYをクリックしたときに無効化されたボタンを、再度クリック可能な状態に戻します。
以上で機能の追加は完了です。
Oracle APEXのアプリケーション作成の参考になれば幸いです。
メモ
リージョンのリフレッシュをJavaScriptのコードから行なう場合は、対話モード・レポートの静的IDがllama2だとすると、
古いやり方(今でも動く):
apex.event.trigger("#llama2","apexrefresh");
新しいやり方:
apex.region("llama2").refresh();
完