2022年8月19日金曜日

クラシック・レポート上でクリックした行を特定する

 スマート・フィルタによる検索結果をクラシック・レポートで表示している際に、レポート上でクリックした行を特定してみます。検索結果をカードにしているときは、アクションを実装するだけなので、もっと簡単です。


サンプル・データセットに含まれる表EMPを、スマート・フィルタのソースとして使用します。

以下より、サンプル・アプリケーションの作成手順を紹介します。

アプリケーション作成ウィザードを起動します。

アプリケーションの名前スマート・フィルタを使った行選択とします。デフォルトで作成されているページのホームは、編集を開いて削除します。

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


スマート・フィルタを選択します。


ページ名レポートの行選択とし、レポートを選択します。としてEMPを選択します。フォームは使わないので、フォームを含めるにはチェックを入れません

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


ページが追加されました。アプリケーションの作成を実行します。


スマート・フィルタとレポートのページは、ページ番号に実装されています。

このページをページ・デザイナで開きます。


クラシック・レポートのリージョン検索結果の列EMPNOは、主キーであるためデフォルトでタイプ非表示になっています。今回、行をクリックしたときに主キーの値を取得するには、レポートにデータとして含まれている必要があります。そのため、列のタイプ非表示からプレーン・テキストに変更します。


リージョン検索結果詳細静的IDempとします。動的アクションの設定で、リージョンを特定する際に使用します。


動的アクション・ビューを開きます。

クリック上で動的アクションの作成を実行します。

識別名前クリックして行を特定とします。タイミングイベントクリック選択タイプとしてjQueryセレクタを選択し、jQueryセレクタとしてtbody trを指定します。レポートのデータ部分(tbodyタグ中)の行(tr)が選択されます。選択された行(tr要素)が動的アクションのthis.triggeringElementとして渡されます

詳細イベント有効範囲動的を選択し、静的コンテナ(jQueryセレクタ)として#empを指定します。クリックの有効範囲がリージョン検索結果に制限されます。


TRUEアクションとしてJavaScriptの実行を選択します。設定コードに以下を記述します。
let msg = "選択した従業員の番号は" + this.triggeringElement.firstChild.textContent + "です。";
apex.message.confirm( msg );
this.triggeringElementとして渡されたTR要素より従業員番号を取り出し、ダイアログに表示しています。


一般的にはthis.triggeringElement.firstChild.textContentを、別のページ・アイテムに設定することが多いと思います。

ページ・アイテムP1_EMPNOを作成し、選択した従業員番号をP1_EMPNOに設定してみます。

識別名前P1_EMPNOタイプテキスト・フィールドラベルEmpnoとします。


TRUEアクションを作成します。

識別アクション値の設定とします。設定タイプの設定JavaScript ExpressionJavaScript Expressionとしてthis.triggeringElement.firstChild.textContentを指定します。影響を受ける要素選択タイプアイテムアイテムP1_EMPNOになります。これで、this.triggeringElement.firstChild.textContentP1_EMPNOに設定されます。

実行オプション初期化時に実行OFFにしておきます。


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

カード・リージョンを表示に使える場合は、表示されているカードにたいしてアクションが設定できるため、this.triggeringElement.firstChild.textContentのような回りくどい方法で主キーの値を取得しなくてすみます。

しかし、カードのアクションとして動的アクションを作成することはできません。

Oracle APEX 22.1より、インターフェースactions.actionに実装されたファンクションを、カードから呼び出すことができるようになりました。この新機能を使った実装を紹介します。

ページ作成ウィザードを起動し、スマート・フィルタを選択します。


ページ定義名前カードとします。データ・ソース表/ビューの名前としてEMPを選択します。

へ進みます。


表示形式としてカードを選択し、後はデフォルトのまま変更しません。

へ進みます。


カード・レイアウトとして水平を選択し、カード属性タイトル列ENAME(Varchar2)本体列JOB(Varchar2)を指定します。

ページの作成をクリックします。


スマート・フィルタとカードのページが作成されます。

レポートのページと同様に、ページ・アイテムP2_EMPNOを作成します。


ページ・プロパティのJavaScriptページ・ロード時に実行で、以下のアクションを登録しておきます。アクションの名前show-selected-empnoとします。確認のためのダイアログが開くので、そこでOKをクリックするとページ・アイテムP2_EMPNOに選択した従業員番号が設定されます。
apex.actions.add([
{
    name: "show-selected-empno",
    action: function( event, element, args) {
        let msg = "選択した従業員の番号は" + args.id + "です。";
        apex.message.confirm( msg, (okPressed) => {
            if (okPressed) {
                apex.items.P2_EMPNO.setValue(args.id);
            }
            else
            {
                apex.items.P2_EMPNO.setValue(null);
            }
        } );
    }
}
]);

このアクションshow-selected-empnoを呼び出すカードのアクションを作成します。

リージョン検索結果アクション上でアクションの作成を実行します。

作成されたアクションの識別タイプとしてカード全体を選択します。リンクタイプとしてURLにリダイレクトを選択し、ターゲットとして

#action$show-selected-empno?id=&EMPNO.

を指定します。これでshow-selected-empnoと命名されたアクションが呼び出されます。idとして&EMPNO.を渡しているため、show-selected-empnoのアクションのargs.idとして従業員番号が渡されます。


以上で実装は完了です。

ページを実行すると以下のようになります。カードの表示形式をまったく調整していないので寂しい感じになっていますが、カードが一番表示形式を変えられるコンポーネントなので見栄えについては色々と改善できます。


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

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