2023年4月27日木曜日

対話グリッドの行の追加をコードから呼び出す

 対話グリッドの最終セルにてTabを入力すると、新規行が追加されます。


この動作は、対話グリッドの属性編集に含まれる空の場合に行を追加オフにすることで、抑止できます。


空の場合に行を追加オフにすると、対話グリッドの検索結果が0行のときにデータが見つかりませんと表示されるようになります。


オンライン・ヘルプには、こちらの動作が説明されています。

最終セルでのタブ入力で行が追加される動作は、Oracle APEXのJavaScriptリファレンスに記載されています。

autoAddRecord :boolean

 

Specifies if a new record should be automatically added when the model doesn't contain any data. If supported by the derived view a new record may be added when moving beyond the last record in the view while editing. Must only be true if the model and view are editable and the model allows adding records.


https://docs.oracle.com/en/database/oracle/apex/22.2/aexjs/grid.html#autoAddRecord

タブによる行の追加は抑止するが、対話グリッドに何も表示されないときは、新規行を自動的に追加する方法を考えてみました。

対話グリッドに何も表示されないときに、ボタン行の追加を押すと以下のように動作します。


この手順を、動的アクションを使って自動的に実行されるように実装します。

JavaScriptにて対話グリッドを操作する方法は、以下の記事で紹介しています。

JavaScriptのコードを書いて対話グリッドを操作する
http://apexugj.blogspot.com/2022/08/manipulate-ig-sample.html

ボタン行の追加row-add-rowというアクションとして実装されています。

https://docs.oracle.com/en/database/oracle/apex/22.2/aexjs/interactiveGrid.html

このアクションは、以下のコードで実行できます。Actionインターフェースのinvokeを呼び出します。

apex.region( "[region static ID]" ).call( "getActions" ).invoke( "[action name]" );

対話グリッドに表示される行が0行の際に、row-add-rowを実行する動的アクションを作成します。

最初に対話グリッドの静的IDを設定します。

今回はempとしました。


対話グリッドに動的アクションを作成します。

識別名前空のときに行を追加とします。タイミングイベント選択の変更[対話グリッド]です。選択タイプリージョンリージョンとして対象となる対話グリッドを指定します。


TRUEアクションとしてJavaScriptコードの実行を選択します。設定コードとして、以下を記述します。
if (this.data.model.getTotalRecords() == 0) {
    apex.region("emp").call("getActions").invoke("row-add-row");
}
実行初期化時に実行オンにします。


以上で実装は完了です。

対話グリッドの内容が0行であれば、自動的に行が追加されます。

対話グリッドの動的アクションを実装するにあたって、Marko Goričkiさんによる以下のページを参照しています。

Oracle APEX Interactive Grid Cheat Sheet

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

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