タグ: 次の場合にオブジェクトを隠す

FileMakerの計算式の中で、/* */で囲まれた部分はコメントとして扱われます。計算式を/* */で囲んでコメント化すると、ただの文字列とみなされて計算処理は行わません。
ただし、「次の場合にオブジェクトを隠す」に記述した条件式をコメント化する場合は、少し注意が必要です。

1.はじめに (「次の場合にオブジェクトを隠す」とは)

FileMakerでオブジェクトの表示・非表示の設定を行う際は、「次の場合にオブジェクトを隠す」を使用します。ここに真(True)か偽(False)かを返す条件式を記述し、結果が真(True)であれば非表示となります。

 

例えば、会員レイアウトにおいて、備考フィールドの「次の場合にオブジェクトを隠す」に

IsEmpty ( 会員::氏名 )

と記述すると、氏名フィールドが空の時に真(True)と判定され、備考フィールドが非表示になります。

 

 

2.現象

さて、この条件式を一時的に無効にしたい(また使うかもしれないので消さずに残しておきたい)という場合、どうすればよいでしょう。式を/* */で囲ってコメント化する、という方法を思いつくのではないでしょうか。

/*IsEmpty ( 会員::氏名 )*/

確かにこの例の場合、氏名フィールドが空であってもなくても、備考フィールドは表示されるようになります。

 

ところが、この方法を使っても備考フィールドが表示されないケースがあります。

例えば、条件式が

IsEmpty ( 会員::住所1 )

の場合、これをコメント化して

/*IsEmpty ( 会員::住所1 )*/

としても、住所1フィールドが空かどうかに関わらず、備考フィールドは表示されません

 

この違いは一体なんなのでしょうか。

 

3.原因

実は、先程のように「次の場合にオブジェクトを隠す」の条件式全体をコメント化すると、自動的に" "で囲まれます。つまり、コメントではなくテキストデータとして扱われます。
FileMakerでは、真偽判定の条件式にテキストデータが与えられた場合、この文字列から数字のみを抜き出して判定に利用します。0または空であれば偽(False)、それ以外は真(True)です。

"/*IsEmpty ( 会員::氏名 )*/"

この場合、数字がありませんので、空、すなわち偽(False)と判定されます。
一方、

"/*IsEmpty ( 会員::住所1 )*/"

こちらの場合は、文字列から数字(1)が抜き出され、真(True)と判定されます。そのため、備考フィールドは表示されないのです。

 

条件式にコメントを記載しているときも注意が必要です。

/* 2022-05-20 氏名未入力時、非表示にする */
IsEmpty ( 会員::氏名 )

この場合、条件式の部分を/* */で囲ってコメント化すると、

"/* 2022-05-20 氏名未入力時、非表示にする */¶
/* IsEmpty ( 会員::氏名 ) */"

のように、1行目のコメント文を含めた全体が" "で囲まれ、テキストデータ扱いとなります。そして、ここから数字(20220520)が抜き出され、真(True)と判定されます。

 

「次の場合にオブジェクトを隠す」の条件式をコメント化した場合、計算処理は行われませんが、真偽判定が行われないわけではありません。条件式欄に何か書いている限り真偽判定は行われる、ということになります。

 

4.解決策

一時的にコメント化しておきたい場合は、その前か後ろに False(もしくは0) または True(もしくは 1)を書いておきましょう。
そうするとコメント化した条件式が" "で囲まれることはなく、コメントとして残ります。

/* IsEmpty ( 会員::住所1 ) */
False

 

5.補足

真偽判定の条件式を記述する場所としては、他にも
・ポータル:「ポータルレコードのフィルタ」
・データベースの管理:「入力値の自動化」の「計算式で制限」
などがありますが、これらは上記内容とは動きが異なります。

これらの条件式は/* */で囲っても、自動的に" "で囲まれることはなく、あくまでコメント文として残ります。その結果、空ではない、つまり真(True)と判断されます。

これらの項目は、条件式の適用・不適用をチェックボックスで制御できます。
一時的に無効にしたい場合も、(わざわざコメント化せずとも)チェックボックスをOFFにするだけで良いという点が、「次の場合にオブジェクトを隠す」と動きが異なる要因だと思われます。

 

詳細

FileMaker Ver13~16と、17の違い

FileMakerのVer13で登場した「次の場合にオブジェクトを隠す」は、条件式を満たす場合に該当オブジェクトを非表示にする機能です。
「条件を満たすまでボタンを押されたくない」「権限のある人にだけ値を見せたい」といった仕様を実現することができます。

 

その「次の場合にオブジェクトを隠す」機能の仕様が、Ver17から下記のように変わりました。
「条件式がエラーと評価された場合、オブジェクトは必ず非表示になる」
では、Ver16以前はエラーを含む場合でも表示されていたのかというと、必ずしもそうではありません。

 

様々なエラーを含む条件式を設定し、Ver16(以前)とVer17とで動きを確認してみましょう。

サンプルファイル: hide_object.fmp12

 

準備

「sample」テーブルを作成し、「Field1」「Field2」という名前のフィールドを作成します。

リレーションシップグラフで、「sample 2」「sample 3」というテーブルオカレンスを作成します。

sampleテーブルオカレンスを紐づけたレイアウトを作成し、ボタンオブジェクトを7つ配置します。
それぞれのボタンの「次の場合にオブジェクトを隠す」に、条件式を入力します。

A.sample::Field2

B.sample 2::Field1

C.sample 3::Field1

D.(1/0)

E.(1/0) = 2

F.(1/0) ≠ "?"

G.(1/0) = "?"

sampleテーブルからField2フィールドを削除します。

リレーションシップグラフからsample 3テーブルオカレンスを削除します。

 

結果

Ver16以前

Ver17

 

1.式内のフィールドが参照できない場合(A,B,C)

フィールドを削除した場合や、現在のレイアウトから参照できないテーブルオカレンスを参照している場合など。
Ver17では非表示なのですが、16以前では隠されません。

 

2.式全体がエラーとなる場合(D)

例えば条件式を「1/0」(ゼロ除算)とすると、式はエラーとなります。
この場合、Ver17でもVer16以前でもオブジェクトは非表示となります。

 

3.式の一部にエラーを含む場合1(E,F,G)

条件式を「(1/0) = 2」とすると、左辺がエラーとなります。
式にエラーを含んでいますので、Ver17ではオブジェクトは非表示となります。
一方Ver16以前ですが、左辺は"?"を返します。
その結果、「"?" = 2」という式になります。
この式は成立しないため、式全体としてはFalse(偽)を返します。
その結果、オブジェクトは隠されません。
どちらも非表示となりますが、その過程が異なるのです。

では、「(1/0) ≠ "?"」という条件式だとどうなるでしょうか。
もちろんVer17では非表示となります。
Ver16以前では「"?" ≠ "?"」となり、式全体としてはFalse(偽)を返します。
その結果、オブジェクトは隠されません。

さらに「(1/0) = "?"」の場合。
Ver17では非表示。
Ver16以前では「"?" = "?"」となり、式全体としてはTrue(真)。よってオブジェクトは隠されます。

 

まとめ

  削除したフィールドを参照 他のリレーショングループを参照 削除したテーブルオカレンスを参照 1/0 (1/0)=2 (1/0)≠"?" (1/0)="?"
Ver.17 非表示 非表示 非表示 非表示 非表示 非表示 非表示
Ver.13~16 表示 表示 表示 非表示(※1) 表示 表示 非表示(※2)

※1:式全体がエラーのため ※2:式が成立するため

 
こうしてみると、Ver16以前の判定はややこしく感じますね。
Ver17でスッキリ整理された、ということになるかと思います。

なお、既存のFileMakerファイルのVerを上げた際、表示・非表示の状態が変わってしまう可能性がありますので、しっかり確認しておきましょう。

詳細