2018年2月10日土曜日

@Transform と @Nothing をビューで使う場合、念のため @Trim を忘れずに

トラブルシュートしていたときに遭遇したことについて情報共有したいと思います。

1つのフィールド(フィールド名 "MailAddress")に複数のメールアドレスを記入できるのですが、そこにインターネットメールアドレスを含んでいるかどうかを調べようとしていました。

インターネットメールアドレスは "@" 記号を含んでおり、Notes メールアドレスには含まないという前提です。

次の式を用意しました。
@Transform( MailAddress; "x"; @If( @Contains( x; "@" ); x; @Nothing ) )

説明すると、MailAddress アイテムのリスト要素の1つを変数 x に代入し、変数 x が "@" 記号を含めば値を保持し、そうでなければ値を除去する(要素を減らす)、ということをリストの要素の数だけ繰り返します。

例えば、MailAddress アイテムに次の2つアドレスが入っていたとします。
"hoge taro/acme" : "hoge.jiro@acme.com"

この時、式は "@" 記号を含まない "hoge taro/acme" を除去しますので、返ってくる値は通常 1 つのアドレス "hoge.jiro@acme.com" になります。

@Nothing は リスト要素を返さない、つまり要素を1つ減らすのです。


そう、ビューでなければ。


ビューの列に先ほどの式を設定したところ、要素が減るものと、要素の数は減らず値がなくなるものの2パターン現れました。先の MailAddress アイテムの場合、1つのアドレス(要素)を返すものと、空っぽの要素+1つのアドレス(要素)を返すものがあったのです。
要素数が1になった値     "hoge.jiro@acme.com"
要素数が2のままの値     "" : "hoge.jiro@acme.com"

これと同様のことはビューの選択式でも確認しており、@Transform と @Nothing を使った次の式を記述すると期待した結果にならないことがありました。
SELECT @Elements( @Transform( MailAddress; "x"; @If( @Contains( x; "@" ); x; @Nothing ) ) ) > 0


このように @Nothing が要素を減らさない場合があることがわかりました。
また、ビューを Shift + F9 で再構築すると結果が変化する場合もありました。

なお、これらは Notes 9.0.1 に FP9 を適用した環境で確認しました。

もしこのような現象が確認できた場合、次の式のように @Trim を組み合わせて回避しましょう。
SELECT @Elements( @Trim( @Transform( MailAddress; "x"; @If( @Contains( x; "@" ); x; @Nothing ) ) ) ) > 0