2024年2月8日木曜日

対話グリッドに保存される各行を対象に検証を行う

対話グリッドの値を変更したのち、選択した行に限り変更を許可し、その他の行に変更があった場合はデータの保存を拒否する実装を行います。

以下の動画では、最初にSCOTTの給与を更新しています。選択された従業員がSCOTTの状態で保存をクリックすると、変更した給与が保存されます。

続いてCLARKの給与を変更した後に、FORDを選択します。この状態で保存をクリックすると変更された行がFORDではなくCLARKであるためエラーが発生します。




以下より、上記のような検証の作成方法を紹介します。

最初に対話グリッドでの選択行を1行に限定するために、行セレクタ複数選択の有効化オフにします。ただし、複数選択が有効であっても検証は行えます。その場合は、ページ・アイテムに1行を対象とするデータではなく、複数行の主キーの値をカンマで連結するなどします。


対話グリッドで行の選択を変更したときに、選択された行に関する情報をページ・アイテムに設定します。


ページ・アイテムへ選択行の設定を行うために、以下のJavaScriptのコードを実行します。



対話グリッドの動的アクションのJavaScript中でapex.items.P1_ENAME.setValue()を呼び出していますが、引数をひとつしか渡していません。setValueの第3引数はpSuppressChangeEventで、このデフォルトはfalseなので値を設定したページ・アイテムP1_ENAME変更イベントが発生します。

ページ・アイテムP1_ENAME変更イベントを受け取って、設定された値をセッション・ステート、つまりデータベースに保存する動的アクションを作成します。


セッション・ステートへページ・アイテムの値を保存するために、サーバー側のコードを実行します。ただし、PL/SQLコードの記述はnull;だけでよく、送信するアイテムP1_ENAMEを指定します。これで、データベースにページ・アイテムの値が送信されて、セッション・ステートに保存されます。


セッション・ステートとして値を保存するページ・アイテムのセッション・ステートストレージには、セッションごと(永続)を設定します。


以上の情報を使った検証を作成します。

左ペインでプロセス・ビューを開き、検証中より検証を作成します。

検証編集可能リージョンとして対話グリッドを選択します。タイプファンクション本体(ブールを返す)を選んでいます。実際の検証ロジックはPL/SQLで記述します。検証処理は、変更された対話グリッドの行毎に呼び出されます。コード中では、対話グリッドの列名ページ・アイテム名バインド変数とすることにより、それらの値を参照することができます。

今回は以下のコードを記述しています。列ENAMEの値がページ・アイテムP1_ENAMEと一致していない時はエラーとしています。
if :ENAME = :P1_ENAME then
    return true;
else
    return false;
end if;


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

簡単なアプリケーションですが、上記のサンプル・アプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/validate-saving-ig-rows-with-page-item-value.zip

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