(※このトピックスは、Valence開発元(米CNX社)のブログ記事を翻訳・再編集したものとなります。原文記事は、コチラとなります。)
Valence App Builder の人気のある機能の 1 つは、IBM i 開発者が編集グリッドの形でファイル保守アプリを迅速に展開する機能です。開発者は、目的のファイルに関するデータソースを作成し、それをEdit Gridウィジェットにマップするだけで、実質的に時間をかけずに、完全に機能するメンテナンス・アプリを作成することができるのです。
この迅速で簡単なプロセスは、維持する必要があるすべてのフィールドがユーザーから見えるファイルでは、素晴らしく機能しますが、ユーザーには設定または変更されたくない「舞台裏」のフィールドがファイルに含まれている場合がよくあります。例えば、ファイルには「最終更新者」という文字フィールドと「最終更新日時」というタイムスタンプフィールドが含まれていることがあります。明らかな理由により、これらのタイプのフィールドをユーザーが調整することを望まないでしょう。
幸いなことに、非常に単純なRPGプログラム(バックエンド検証の適用に使用するものと同じ)を使用して、これらの非ユーザー編集可能フィールドを初期化または更新することができ、そのフィールドがグリッド自体に含まれているかどうかは問題ではありません。実際、フィールドがデータ・ソースに含まれている必要すらありません。
例として、Valenceに含まれるDEMOCMAST(顧客マスターファイル)上で簡単なデータソースとEdit Gridアプリを作成します。このプロセスにまだ慣れていない場合は、この前のブログ投稿に含まれるハウツー・リンクを参照してください。デモのために、「最終活動日」フィールド(CLASTACT)と「年間累計売上」フィールド(CYTDSALES)を意図的に削除しておきます。作成されたEdit Gridウィジェットは、App Builder 編集画面で以下のように表示されるはずです。
CLASTACTとCYTDSALESが基礎となるデータソースに含まれているかどうかに違いはありません。このケースでは、CLASTACTはデータソースに含まれていますが、CYTDSALESは含まれていません。
つまり、ユーザーが DEMOCMAST に新しいレコードを追加するたびに、CLASTACT を今日の日付に設定し、CYTDSALES を -1 に設定して、他のプログラムまたはルーチンに新しく追加されたレコードであることを示すとします。ユーザーはアプリでこれらのフィールドを自分で設定することはないので、それを処理する簡単なRPGプログラムを作成する必要があります。そのために、まずQRPGLESRCにあるEdit Gridの検証プログラムテンプレート(EXNABVAL)のコピーを作成することから始めます。
このソースには、データの編集チェックと、追加/編集/削除が行われた後のタスクを実行するための、多数のプレースホルダーがあります。前者は ProcessAdd/ProcessEdit/ProcessDelete プロシージャで、後者は PostAdd/PostEdit/PostDelete プロシージャで処理されます。
編集確認用データ
フィールド値の設定について掘り下げる前に、編集チェックについて少し脱線して、Valence 6.0の最新ビルド(6.0.20220119.0)で追加された新機能を紹介します。以前は、ユーザーが編集ウィンドウで誤った入力をした場合、追加/編集プロセスを中断し、どのフィールドが誤りであるかを示すポップアップメッセージをユーザーに表示することができました。これは、ProcessAddまたはProcessEditプロシージャ内の次のような簡単なコードブロックによって処理されます。
if GetValue('DEMOCMAST':'CSTATE') = 'NY';
SendError('No customers allowed in New York. Try another state.');
endif;
もちろん、この編集チェックが追加と編集の両方に適用される場合は、独自の別のプロシージャを作成して、ProcessAddとProcessEditの両方から呼び出すようにすれば、コードの重複を避けることができます。その結果、以下のようなポップアップメッセージが表示されます。
この場合、ユーザーは「OK」をクリックしてウィンドウを閉じ、次にエラーのあるフィールドを探して修正する必要があります。Valence 6.0の最新ビルドをインストールすると、特定のフィールドをエラーとしてマークでき、エラーメッセージは、ユーザーが解除しなければならないポップアップウィンドウではなく、エラーフィールドの下に直接表示されるようになりました。
if GetValue('DEMOCMAST':'CSTATE') = 'NY';
SendError('No customers allowed in New York. Try another state.':'CSTATE');
endif;
第2パラメータを指定すると、次のようなインラインのエラーメッセージが表示されます。
GetValueやSendErrorなど、検証プログラムが利用できるすべての手続きは、ソース上部のコメント欄で説明していることに注意してください。 検証プログラムをコンパイルしたら、最後のステップとして、編集グリッドウィジェットの検証プログラムフィールドにプログラム名を入力します。 これは画面の右上、編集タブ内に位置しています。
フィールドの値を “裏で “設定する
ここで、ユーザーがファイルに新しいレコードを追加するたびにCLASTACTとCYTDSALESを初期化するという、当初の目的に戻ります。前述のように、これらのフィールドはどちらも編集グリッドには存在せず、CYTDSALESは基礎となるデータソースにさえ存在しません。しかし、データソースで指定されたファイルに属する任意のフィールドの値を設定することができるので、それは問題ではありません。
したがって、ProcessAdd プロシージャの最後に、SendError() レスポンスを返すデータ入力エラーが見つからなければ、SetValue を使用して、好きなだけ多くのフィールドに特定の値を割り当てるよう App Builderに指示できます。 ユーザが指定した可視フィールド値を上書きすることも可能です。このような使用例としては、外部の検証ルーチンを使用して、郵送先住所の形式を「きれいに」することができます。また、実用的なジョークとして、特定のユーザーのエントリを操作するために使用することもできます。
GetValueが常にフィールド値の文字列相当値を返すように、SetValueは文字列相当値を渡す必要があります。したがって、DEMOCMAST オブジェクトのコードは、ProcessAdd プロシージャの最後に次のように表示されます。
SetValue('DEMOCMAST':'CLASTACT':%char(%date()));
とします。
SetValue('DEMOCMAST':'CYTDSALES':'-1')
これで、素早く簡単に編集グリッドを作成できるようになりました。