対話グリッドの値を変更したのち、選択した行に限り変更を許可し、その他の行に変更があった場合はデータの保存を拒否する実装を行います。
以下の動画では、最初にSCOTTの給与を更新しています。選択された従業員がSCOTTの状態で保存をクリックすると、変更した給与が保存されます。
続いてCLARKの給与を変更した後に、FORDを選択します。この状態で保存をクリックすると変更された行がFORDではなくCLARKであるためエラーが発生します。
以下より、上記のような検証の作成方法を紹介します。
最初に対話グリッドでの選択行を1行に限定するために、行セレクタの複数選択の有効化をオフにします。ただし、複数選択が有効であっても検証は行えます。その場合は、ページ・アイテムに1行を対象とするデータではなく、複数行の主キーの値をカンマで連結するなどします。
対話グリッドの動的アクションの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のアプリケーション作成の参考になれば幸いです。
完