対話グリッドの値を変更したのち、選択した行に限り変更を許可し、その他の行に変更があった場合はデータの保存を拒否する実装を行います。
以下の動画では、最初にSCOTTの給与を更新しています。選択された従業員がSCOTTの状態で保存をクリックすると、変更した給与が保存されます。
続いてCLARKの給与を変更した後に、FORDを選択します。この状態で保存をクリックすると変更された行がFORDではなくCLARKであるためエラーが発生します。
以下より、上記のような検証の作成方法を紹介します。
最初に対話グリッドでの選択行を1行に限定するために、行セレクタの複数選択の有効化をオフにします。ただし、複数選択が有効であっても検証は行えます。その場合は、ページ・アイテムに1行を対象とするデータではなく、複数行の主キーの値をカンマで連結するなどします。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let selectedRecords = this.data.selectedRecords; | |
if (selectedRecords.length > 0) { | |
let r = selectedRecords[0]; // 設定よりつねに選択されるのは1行。 | |
let model = this.data.model; | |
apex.items.P1_ENAME.setValue(model.getValue(r, "ENAME")); | |
}; |
対話グリッドの動的アクションのJavaScript中でapex.items.P1_ENAME.setValue()を呼び出していますが、引数をひとつしか渡していません。setValueの第3引数はpSuppressChangeEventで、このデフォルトはfalseなので値を設定したページ・アイテムP1_ENAMEで変更イベントが発生します。
ページ・アイテム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のアプリケーション作成の参考になれば幸いです。
完