2022年9月1日木曜日

対話グリッドの特定のセルを読み取り専用にする

Twitterを見ていたらカナダのInsum Solutionsより、Elisabeth Ashleyさんが"How to Set Specific Cells of Oracle APEX Interactive Grids to Read Only"という記事を書きましたよ、とツイートがありました。そのツイートに対話グリッドを開発しているJohn Snydersより、check callbackを使った方が簡単では?と返信が付いていました。

John Snydersが紹介しているCheckCalbackを使って、Insum Solutionsの記事にある実装を書き換えてみました。

記事とは条件を変えています。対話グリッド上で、上司のいない従業員の給与と手当を変更不可にします。

サンプル・データセットEMP/DEPTに含まれる表EMPをソースとして、対話グリッドを作成します。その対話グリッドに静的IDとしてempを設定します。

対話グリッドの属性詳細JavaScript初期化コードとして、以下を記述します。


設定は以上です。

動作を確認してみます。


Managerが設定されている行は、Salary、Commissionともに編集できます。Managerが設定されていないKINGのHiredは変更できますが、SalaryとCommissionは変更できません。ただし、一時的にManagerに値を設定するとSalaryとCommissionに値を入力でき、データベースに保存することもできます。これは、読取専用にしているのはあくまで対話グリッド上のセルであって、サーバー側には制限がかかっていないためです。

新規業の場合は、Managerに値がなくてもSalaryとCommissionを設定できます。

おおむね想定どおりの実装ができています。

対話グリッド上で一時的にManagerを変更しSalaryやCommissionを変更するという抜け道を禁止するには、対話グリッドでManagerの変更を禁止するという方法もありますが、サーバーに検証を作成する方が確実です

検証を作成し、名前を給与の変更禁止とします。検証編集可能リージョンとして対話グリッドのリージョンを選択します。タイプとしてファンクション本体(ブールを返す)を選択し、PL/SQLファンクション本体として以下を記述します。

エラーエラー・メッセージは「上司のいない従業員の給与は変更できません。」とします。関連付けられた列としてSALを選択します。


同様に検証として手当の変更禁止を作成します。

エラーエラー・メッセージ関連付けられた列は、給与、SALから手当COMMに変更します。


以上でManagerが設定されていない従業員の給与と手当を更新しようとすると、サーバー側でエラーが発生するようになりました。


以上でアプリケーションは完成です。

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

Oracle APEX JavaScript APIリファレンスのmodelインターフェスが、主に関連する部分です。
https://docs.oracle.com/en/database/oracle/apex/22.1/aexjs/model.html#.CheckCallback
https://docs.oracle.com/en/database/oracle/apex/22.1/aexjs/model.html#check
https://docs.oracle.com/en/database/oracle/apex/22.1/aexjs/model.html#.RecordFieldMetadata

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