2020年4月7日火曜日

対話グリッドの自動行追加

海外のブログ記事で"Auto New Line Generation in Interactive Grid Oracle APEX"というのを読みました。役立ちそうだったので、自分でも試してみました。結果からいうと、広く有効、というよりは、特定のケースで有効、という感じです。

対話グリッドを使用するケースは、大抵の場合でデータ入力を効率的に行いたいという強い要望があるように思います。そのため、汎用的に使える画面ではなく、データに特化したカスタマイズを行いたいケースも十分考えられます。ですので、対話グリッドの動的アクションを使う方法を理解しておくのは有効でしょう。

対話グリッドに動的アクションを追加することで、行の最後のセルにデータを入力しEnterを入力すると、新規行が追加されるようにします。

より正確に実装内容を説明すると、最後のセルであるDeptnoのデータが変更されたタイミングで、行の追加を実行します。

この例では、自動行追加という名前の対話グリッドを対象に実装を行います。最初に、対話グリッドのリージョンに静的IDを設定します。ここではEMPとしています。

対話グリッドに動的アクションを登録します。対話グリッド上でコンテキスト・メニューを開き、動的アクションの作成を選択します。

作成された動的アクション(当初は新規という名前になっています)の名前を、自動行追加とし(名前は任意に設定して構いません)、タイミングイベント変更選択タイプリージョン自動行追加(動的アクションを作成する対話グリッドのリージョン名です)、DEPTNOとします。(イベントのタイミングにDEPTNO列を指定した結果、動的アクション自体はDEPTNOに割り当たります)。

Trueアクションは、識別JavaScriptコードの実行コードとして以下を設定します。
apex.region("EMP").widget().interactiveGrid("getActions").invoke("selection-add-row")

これで完了です。

実際に動かしてみて、以下の感想を持ちました。
  1. 途中の行のDeptnoを変更した場合でも、その行の次に空行が挿入される。
  2. Deptnoを変更しないと(単にセルをフォーカスしてEnterを入力しても)空行が挿入されない。
  3. 対話グリッドをカスタマイズしてDeptnoが最終列でなくなると適切に機能しなくなる。
実際は、対話グリッドのセルのフォーカスは、Tabを入力することで移動させることができます。そして、表示されている対話グリッドの最も右下のセルでTabを入力すると、新規に行が追加されます。この、標準で提供されている方法では、上記の3点の問題は発生しません。

では、Tabで良いかというと、ひとつひとつ大量にデータを入力するような場合は、Enterの入力で新規行を追加した方が自然に入力できると思います。入力時間を短縮するためのカスタマイズを対話グリッドに実装すること自体は、利用者にとって利益のあることですし、カスタマイズ自体もメンテナンス不能になるほど規模が大きくなるようなものでもないので、積極的に考えてもよいでしょう。

対話グリッドのJavaScript APIの説明は、Oracle Application Express JavaScript API Referenceにあります。対話グリッドに関するセクションはその中の、ここ(Widgetのgridの説明)ここ(WidgetのinteractiveGridの説明)になります。

対話グリッドの解説として、最も充実しているのはJohn Snyders(開発している中の人)のブログで、対話グリッドで可能な多数の実装例については、このブログのエントリAPEX IG Cookbook Update for 19.2で紹介されているサンプル・アプリケーションを実行して確認するのが最も有効かと思います。