2022年7月28日木曜日

APEX 22.1の新機能 - 並替え基準を使う

 APEX 22.1より、リージョンのプロパティとして並替え基準(英語ではOrder By)が追加されています。レポートやチャートのソースに適用するORDER BY句を、ソースとは別のプロパティとして定義できるようにしたものです。

サンプル・データセットのEMP/DEPTに含まれる表EMPの従業員(列ENAME)を、給与(列SAL)の昇順にして棒グラフで表示しています。上位5件10件をページ・アイテムで選択し、チャートの表示件数を切り替えています。


APEX 22.1以前でも、このような実装はできましたが、APEX 22.1の新機能の並替え基準では、同じページをより簡単に実装できるようになりました。

以前の実装方法と、APEX 22.1の並替え基準を使った実装方法を比較してみます。


準備作業



両方の実装を行うAPEXアプリケーションを作成します。

データにはサンプル・データセットEMP/DEPTに含まれる表EMPを使用します。そのため、あらかじめサンプル・データセットをインストールしておきます。

SQLワークショップユーティリティサンプル・データセットを開き、名前EMP/DEPTのアクションインストールをクリックして、EMP/DEPTをインストールします。

ダイアログが開きます。今回の記事では言語としてJapaneseを選択していますが、Englishやその他の言語でも同様に作業できます。スキーマとして、ワークペースのデフォルト・パーシング・スキーマが選択されます。変更は不要です。

へ進みます。


データセットのインストールを実行します。


サンプル・データセットのインストールより作成されるAPEXアプリケーションは、色々な機能が実装された特別なアプリケーションになります。今回はそれらの機能は不要なので、このダイアログからアプリケーションの作成は行いません。

終了をクリックします。


サンプル・データセットがインストールされると、アクションがインストールから更新に変わります。


表EMPの準備ができたので、APEXアプリケーションを作成します。

アプリケーション・ビルダーより、アプリケーション作成ウィザードを呼び出します。

アプリケーションの名前は、新しいソート・アイテムとします。

このアプリケーションに上位件数を限定したチャートを実装します。22.1以前の実装を行うページと、新しいソート・アイテムを使った実装を行うページを、あらかじめ追加しておきます。

ページの追加をクリックします。


チャートを選択します。


ページ名22.1以前、チャートのタイプとして表またはビューEMPラベル列ENAME列値値列SALを指定し、ページの追加をクリックします。


まったく同じページを追加します。ページ名新しいソート・アイテムとします。


アプリケーションの作成を実行します。


アプリケションが作成されました。これで準備は完了です。


22.1以前での実装



22.1以前では、以下の実装を行います。
  1. 件数を指定するページ・アイテムを作成する。
  2. ページ・アイテムの値が変わったら、チャートをリフレッシュする動的アクションを作成する。
  3. チャートやリージョンのソースを、設定した件数が反映されるように変更する。
リージョン22.1以前に、ページ・アイテムを作成します。

識別名前P2_TOPNとします。タイプ選択リストを選びます。ラベル上位件数とします。ページ・アイテムP2_TOPNに数値が設定されていないとソースのSELECT文が不正になるため、検証必須の値ONにします。LOVタイプ静的値とします。追加値の表示OFFNULL値の表示OFFとします。


LOV静的値の設定です。静的値として、表示値5件に対し戻り値を5、表示値10件に対し戻り値を10の、2件を作成します。実行時にソートOFFにし、定義順で表示されるようにします。


詳細保存されていない変更の警告無視にします。無視にしていないと、件数を変更した後にページを移動しようとすると「行った変更が保存されない可能性があります。」と警告がポップアップします。そのポップアップの「このページを離れる」をクリックしないとページの移動ができません。

ソースセッション・ステートの保持は(デフォルトではセッションごと(ディスク)ですが、無駄なので)リクエストごと(メモリーのみ)に変更します。デフォルトタイプとして静的値を選び、静的値10を指定します。


ページ・アイテムP2_TOPNでの選択が変更されたときに、チャートをリフレッシュする動的アクションを作成します。

ページ・アイテムP2_TOPNで動的アクションを作成します。

動的アクションの識別名前は、上位件数の変更とします。タイミングデフォルトで、イベント変更選択タイプアイテムアイテムP2_TOPNになります。


TRUEアクションリフレッシュに変更し、影響を受ける要素選択タイプとしてリージョンを選び、リージョン22.1以前を指定します。このリージョン22.1以前に、棒グラフのチャートが表示されています。


チャートに給与の降順で従業員が表示されるよう、シリーズのソースを変更します。

シリーズシリーズ1を選択し、ソースSQL問合せを以下に変更します。
select
    empno
    , ename
    , sal
from emp
order by sal desc fetch first :P2_TOPN rows only
送信するページ・アイテムとして、P2_TOPNを指定します。


以上で実装は完了です。アプリケーションを実行すると、先頭のGIF動画のように動作します。

検索結果の行数を制限するために、fetch first構文を使用しています。オラクルではこれ以外に、以下のような記述でも検索結果の行数を制限できます。
select
    empno
    , ename
    , sal
from (
    select
        empno
        , ename
        , sal
    from emp
    order by sal desc
)
where rownum <= :P2_TOPN
または、
select
    empno
    , ename
    , sal
from (
    select
        empno
        , ename
        , sal
        , row_number() over (order by sal desc) topn
    from emp
)
where topn <= :P2_TOPN
ただし、これらの構文によるSELECT文では、次に紹介する並替え基準を使った実装はできません。fetch first構文が使えるようになったのは12cからで11gでは使用できませんが、Oracle APEX 22.1ではOracle Database 11gはサポート対象から外れているため、fetch first構文が使えない状況は発生しません。


APEX 22.1での実装



APEX 22.1の並替え基準を使って、同じ機能を実装します。

シリーズのシリーズ1を選択します。ソースタイプ表/ビューに変更し、表名EMPを指定します。ソースとなるSQL問合せにorder by句が含まれないよう、それを排除します。

並替え基準タイプアイテムを選択し、アイテムOrder by項目がありませんをクリックします。


Order by句としてsal desc fetch first 5 rows onlyを記述し、キーTOP5表示5件とします。次に、としてsal desc fetch first 10 rows onlyを記述し、キーTOP10表示10件とします。

以上を入力し、OKをクリックするとアイテム名前で指定されているページ・アイテム、今回の例ではP3_ORDER_BYが作成されます。


以上で実装は完了です。

22.1以前での実装により近づけるため、作成されたページ・アイテムP3_ORDER_BYを選択し、プロパティを少し変更します。

ラベル上位件数ソースセッション・ステートの保持リクエストごと(メモリーのみ)デフォルト静的値をTOP5からTOP10に変更します。


以上で完成です。ページを実行すると、記事の先頭のGIF動画のように動作します。

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

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


追記 - リージョンが複数あるときの対応



以下のように、チャートとレポートのリージョンを連動させる実装を考えます。


クラシック・レポートのリージョンを追加します。

ソースのSQL問合せとして以下を記述します。
select
    *
from emp_dept_v
order by sal desc fetch first :P2_TOPN rows only
送信するページ・アイテムとしてP2_TOPNを指定します。


ページ・アイテムP2_TOPNの値が変更されたときに、チャートに加えてクラシック・レポートリフレッシュするようにTRUEアクションを作成します。

以上でページ・アイテムP2_TOPNの値が変更されると、チャートとレポートのリージョンに表示される内容が更新されます。


APEX 22.1の並替え基準では、このような実装はできません。

並替え基準となるページ・アイテムはリージョンに紐付き共用できないため、それぞれのリージョンで作成する必要があります。


結果として並べ替え基準が2つになります。


複数のリージョンを同期させる場合は、22.1以前の動的アクションを使った実装を行う必要があります。