2023/09/21

リスト値を@関数でアクセス

ノーツでは、Excel シートのように複数の項目(列)を複数行入力するような画面をリスト値で表現することがよくあります。

このような構造に対して、@関数でアクセスする方法をまとめます。


まず、次のようなフォームがあり、交通機関(Type)と金額(Cost)のフィールドはリスト値を持つ設定だったとします(区切り文字は改行)。

このフォームを使用して作成した以下の文書をサンプルデータとして使用します。


特定の要素の金額を取得

例えば、”阪神” の金額を取得するには次のように記述します。

xSchType := "阪神";
xIndex := @Member(xSchType; Type);
xCost := @If(xIndex = 0; 0; Cost[xIndex]);
@Prompt([Ok]; ""; xSchType + " = " + @Text(xCost))

まず、検索文字列を xSchType にセットし、それが交通機関に含まれるか検索します。検索は、@Member で行い、見つかった場合はその要素番号を返します(1 ~)。見つからない場合は 0 を返します。

金額の取得は、[ ] の演算子を使用して、フィールド Cost を配列としてアクセスし、必要な要素の値を取得しています。

実行すると次のようにメッセージが表示され、正しく金額が取得できることがわかります。

なお、@Member で指定した交通機関が見つからない場合は、金額を 0 としています。

また、取得できる要素番号は 1 がスタートです。これを 1-based indexing と呼びます。ちなみに、LotusScript のデフォルトは、0-based indexing です。


ループを使用したアクセス

続いては、ループ処理を記述できる @For という関数を使用して、すべての要素にアクセスする方法です。

ヘルプによると構文は、次の通りです。

@For( initialize ; condition ; increment ; statement ; ... )

引数は、1つ目がループ変数の初期条件、2つ目が継続条件式(True の場合ループ処理を継続)、3つ目がループ変数の変更式、それ以降がループ処理の本体で、最大 252 個の処理が記述できます。

例がないとわかりにくいので、サンプルコードを示します。この式はリスト値の値を順にメッセージボックスで表示します。

xMax := @Elements(Type);
@For(n := 1; n <= xMax; n := n + 1;
   xMsg := Type[n] + " = " + @Text(Cost[n]);
   @Prompt([Ok]; ""; xMsg)
)

変数 n がループ変数で、n は 1 から始まり、リスト値の要素数まで、1つずつ加算しなら、ループを処理します。実行する処理は、インデントした部分の2行で、メッセージボックスに表示する文字列を生成し、それを@Prompt で表示しています。

実行すると次のようになります。

0 件のコメント:

コメントを投稿