先日『@If の使い方』についてまとめました。@If の構文は以下の通りでしたね。
@If(condition1; action1; condition2; action2; ... ; condition99; action99; else_action) |
条件に一致した場合に実行される action には、ステートメントを一つしか書けません。ただ、実際にアプリを開発していると、複数のステートメントを書きたくなることがあります。
例えば、@If で紹介した例を拡張して考えます。今回のフィールド構成は次の通りです。
Type と Title フィールドが追加されており、Type の指定に応じて Category 値を変化させる仕様とします。
Type | Category |
"Title" | Title フィールドを表示 未入力の場合は "(無題)" とする |
"Category" | 入力されたカテゴリまでを " - " でつなぐ 上位のカテゴリが未入力の場合は "(未設定)" と表示 すべて未入力の場合には、"(未設定)" と表示 |
上記以外 | "(未定義のタイプ)" と表示 |
"Category" 選択時の仕様に変化はないので、その時作成した式を利用したいですよね。
xC1 := @If(Cat1 = ""; "(未設定)"; Cat1); xC2 := @If(Cat2 = "" & Cat3 != ""; "(未設定)"; Cat2); @Implode(@Trim(xC1:xC2:Cat3); " - ") |
こんな時に効果があるのが @Do です。
@Do を使えば、複数のステートメントを 1 つにまとめることができます。これを利用すると Category フィールドの計算式は次のように記述できます。
@If( Type = "Title"; @If(Title = ""; "(無題)"; Title); Type = "Category"; @Do( xC1 := @If(Cat1 = ""; "(未設定)"; Cat1); xC2 := @If(Cat2 = ""; @If(Cat3 != ""; "(未設定)"; ""); Cat2); @Implode(@Trim(xC1:xC2:Cat3); " - ") ); "(未定義のタイプ)" ) |
@If から見ると Type = "Category" の時に実行する action は 1 ステートメントに見えるということですね。
実際アプリを見ていると、@Do を知らないのか、無理やり 1 ステートメントでまとめてある式を見ることがあります。
@If( Type = "Title"; @If(Title = ""; "(無題)"; Title); Type = "Category"; @Implode(@Trim(@If(Cat1 = ""; "(未設定)"; Cat1):@If(Cat2 = ""; @If(Cat3 != ""; "(未設定)"; ""); Cat2):Cat3); " - "); "(未定義のタイプ)" ) |
この式でも仕様通り動作しますが、非常に分かりにくいですよね。まるで暗号化されたように見えます...。このような記述は、将来この式をメンテする人(自分を含む)を混乱させるだけですので、やめましょう。
0 件のコメント:
コメントを投稿