2025/03/22

@Word の活用

前回 紹介した @Word 関数の活用について考えます。

私が特に便利だと感じるのは、マスタデータの選択や検索をするシーンです。マスタデータは通常、名称だけではなく、コードや金額など付随する複数の情報を持ちます。アプリでマスタデータを選択する機能を作成する場合、名称と金額など、マスタ内の複数の項目を取得するのが一般的です。

@Word を使えば、このような機能を効率的に作成できます。


マスタデータ

まずは、単純な商品マスタをサンプルとして準備します。フォームは、商品コード、商品名、単価、カテゴリの 4 項目とします。

この文書を商品コードでソートしたビューを作成し、各項目を配置します。

ビュー名 商品マスタ01
ビュー別名vAppMst01


商品選択機能

続いて、アプリをイメージしたフォームに、商品選択機能を作成します。選択画面は @PickList で」実現し、選択した商品の 4 項目、すべての情報を取得する仕様とします。

この【商品選択】ボタンはどのような式を記述すればいいでしょうか?@関数を覚えたての方なら以下のように書くと思います。

xReturn := @PickList([Custom]:[Single]; @DbName; "vAppMst01"; "選択"; "商品を選択してください。"; 1) ;

@SetField("CD"; xReturn);
@SetField("Name"; @DbLookup("":"NoCache"; @DbName; "vAppMst01"; xReturn; "Name"));
@SetField("Category"; @DbLookup("":"NoCache"; @DbName; "vAppMst01"; xReturn; "Category"));
@SetField("Price"; @DbLookup("":"NoCache"; @DbName; "vAppMst01"; xReturn; "Price"))

まず、@PickList の戻り値で、商品コードを取得します。それ以外の項目は、@DbLookup で再検索し取得します。


@Word でアクセスを削減

上記の式でも正しく動作します。ですが、@PickList とそのあとの再検索で、同じビューに 4 回もアクセスしていて、非効率です。この機能は @Word を使えば効率的に記述できます。

まず、ビューを細工します。最後に列を追加して、次のような式を記述します。

xDelimiter := "///";
CD + xDelimiter + Name + xDelimiter + @Text(Price) + xDelimiter + Category

この式で、マスタのすべての項目が特定の区切り文字で繋げられ、1 列の中に表示されます。この列を取得すれば、必要な項目をまとめて取得できるという算段ですね。なお、この列は、選択画面には不要ですので非表示にしておきます。

※ 記事内の図や式では別のビュー『商品マスタ02 | vAppMst02』として記述しています。


続いて、【商品選択】ボタンの式を以下のように変更します。

xDelimiter := "///";

xReturn := @PickList([Custom]:[Single]; @DbName; "vAppMst02"; "選択"; "商品を選択してください。"; 6) ;

@SetField("CD"; @Word(xReturn; xDelimiter; 1));
@SetField("Name"; @Word(xReturn; xDelimiter; 2));
@SetField("Price"; @TextToNumber(@Word(xReturn; xDelimiter; 3)));
@SetField("Category"; @Word(xReturn; xDelimiter; 4))

この時活躍するのが @Word です。区切り文字で分割し、部分文字列を取得する機能がぴったりハマります。部分文字列の 1 つ目は商品コード、2 つ目は商品名、... というように順に読み込んで、フィールドに当てはめるだけです。

ポイントは、各項目に含まれない文字列を区切り文字に設定し、ビューとボタンで同じものを設定することです。区切り文字は、複数文字を指定できるので、安心ですね。

この方法であればビューの接続は 1 度だけになります。


複数値の場合は特に効果的

ノーツでは、複数値の区切り文字を改行にして、疑似的な表のように見せる技をよく使います。


この場合、【商品選択】ボタンの @PickList は [Single] キーワードを外して、複数文書選択できるようにします。

xReturn := @PickList([Custom]:[Single]; @DbName; "vAppMst02"; "選択"; "商品を選択してください。"; 6) ;

@SetField("CD"; @Word(xReturn; xDelimiter; 1));
@SetField("Name"; @Word(xReturn; xDelimiter; 2));
@SetField("Price"; @TextToNumber(@Word(xReturn; xDelimiter; 3)));
@SetField("Category"; @Word(xReturn; xDelimiter; 4))

この対応だけで、複数の商品を選択する機能が実現できます。

@PickList で複数文書を選択すると、結果はリスト値で返されます。そして、@Word は、リスト値に対応していますので、そのままのコードで都合よく処理してくれます。


まとめ

ノーツのビューは、文書数が多い、更新頻度が高いなどの理由により、レスポンスが遅くなることがあります。今回の事例のように、ビューに接続する回数を減らせば、比較的に良いレスポンスを維持することができます。

また、@Word を組み合わせれば効率的に必要なデータにアクセスでき、プログラムをシンプルに保つことができます。今回は、@PickList を例にしましたが、@DbLookup でも利用できる技です。いろいろな場面で活用できますので、是非とも覚えてください。


0 件のコメント:

コメントを投稿