前回 紹介した @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] @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 件のコメント:
コメントを投稿