初中級の Notes/Domino 技術者向けを目指してスタートしたこのブログなのですが、ここ最近の記事は WebAPI や Excel 連携、DXL など、少々複雑なアプリ開発がメインテーマとなっていました。その反省もあり、今後は、@関数の使い方など基本的な機能についても触れていきたいと思います。
今回は、このブログですでに何度も登場している @If についてです。
構文
@If は条件分岐のための命令です。説明するまでもないですね...
ヘルプによると文法は次の通りです。
@If(condition1; action1; condition2; action2; ... ; condition99; action99; else_action) |
condition1 が条件で、その条件を満たす場合 action1 が実行されます。条件を満たさない場合は次のステートメントである condition2 の条件が判定されます。これを繰り返し、どの条件も満たさない場合 else_action が実行されます。
condition と action は対に指定する必要があり、最後に else_action が必要となりますので、@If 内のステートメントは必ず 奇数 となります。condition と action の組み合わせは 99 個という制限があります。また、condition2 ~ action99 は省略可能となっており、次のように 3 つのステートメントが最小構成となります。
@If(condition; action; else_action) |
LotusScript のように Else を省略できない点に注意が必要ですね。
戻り値
@If は ”関数” なので戻り値があります。
実行した action ステートメントの結果が戻り値として返されます。例えば、以下の式では、フィールド Align の値が "L" の場合 "Left"、 "R" の場合 "Right"、どちらでもない場合は "Unknown" を返します。
@If(Align = "L"; "Left"; Align = "R"; "Right"; "Unknown") |
戻り値は変数に代入できます。以下のように記述すると @If の結果が xReturnValue 変数に代入されます。
xReturnValue := @If(Align = "L"; "Left"; Align = "R"; "Right"; "Unknown") |
サンプル
例えば、カテゴリ1~3のフィールドがあり、入力に応じて表示用の ”カテゴリ” を作成するとします。入力されたカテゴリまでを " - " でつなぎます。もし上位のカテゴリが未入力の場合は "(未設定)" と表示することを条件とします。もし、すべて未入力の場合には、それがわかるよう "(未設定)" と表示します。
これを実現する式は次のようになります。
xC1 := @If(Cat1 = ""; "(未設定)"; Cat1); xC2 := @If(Cat2 = "" & Cat3 != ""; "(未設定)"; Cat2); @Implode(@Trim(xC1:xC2:Cat3); " - ") |
カテゴリ1が未入力の場合は "(未設定)" に変換、カテゴリ2が未入力の場合はカテゴリ3が入力されている場合だけ "(未設定)" に変換しています。それぞれの結果は変数 xC1 と xC2 にいったん代入しています。
この結果とカテゴリ3を : 演算子でリスト値として連結、@Trim で空の要素を排除しています。この操作で下位のカテゴリが未入力だとリストから削除されるということですね。
最後に @Implode でリスト値を " - " で連結しています。
カテゴリ2の演算で & 演算子を使用して『カテゴリ2が未入力でカテゴリ3が入力されていたら』という条件を作成しています。この条件は @If 文をネストすることでも実現できます。
xC2 := @If(Cat2 = ""; @If(Cat3 != ""; "(未設定)"; ""); Cat2); |
カテゴリ2が未入力の場合に実行するステートメントに @If 文が記述されていて、カテゴリ3が未入力でない場合は "(未設定)" 、入力されている場合は ""(この時点でカテゴリ2は未入力だから)となっています。
@If は整理して書こう
実際のアプリで @If を利用すると条件や実行する式が長くなりがちです。特に条件が多いときは顕著です。だらだらと記述すると condition と action の判別が難しくなり、式が解読しづらくなります。私は @If を記述する場合、よほど単純でない限り、改行とインデントを利用して、記述しています。
@If( Align = "L"; "Left"; Align = "R"; "Right"; "Unknown" ) |
@If の後で改行し、condition をインデントして記述、action と else_action はもう一段インデントします。最後につける閉じる括弧は @If とインデントレベルを合わせます。こうすることで @If の範囲と条件、実行される式を明確に分離します。
カスケードされた @If の場合でも同じルールでインデントします。インデントを見ればカスケードレベルも含めて式の役割を明示できます(サンプルの式がシンプルすぎて体感しづらいですが...)。
xC2 := @If( Cat2 = ""; @If( Cat3 != ""; "(未設定)"; "" ); Cat2 ); |
0 件のコメント:
コメントを投稿