FileMakerでポータルの行を選択したとき、その行にだけ何かを表示したいことがあります。いつも使うのにその都度「はて。どうやるんだっけ」と忘れるので、己のために簡単なメモを残しておくのです。
ポータルのアクティブな行にだけ表示する
ポータルで、選択した行にだけ何かが表示されるようにしたい。例えば削除ボタンとか。遙か昔から何度も繰り返している作業ですが、そのたびにインスペクタの「隠す」に何を書くか忘れていて「えーと、えーと」と考え込みます。
間違いや忘却というのはフロイト先生のいにしえの研究により深層心理的な原因があると判っています。ここの筆者が「隠す」の記述を苦手とする原因も、きっと幼少期のリビドーに関係してるに違いありません。そんなわけあるか。つまらない話はいいとして、多分、いろんなやり方をその都度採用して脈略がないから記憶に残らないんです。フィールドを使ったり、グローバル変数を使ったり、アクティブポータル行番号を使ったりいろいろです。
アクティブ行以外では隠す
アクティブな行にだけ表示することは、逆接的にアクティブでない行では隠すということです。インスペクタの「隠す」を前にしてモヤるのは、表示する条件ではなくて隠す条件を書かねばならないからです。「隠す」という淫靡な世界に足を踏み入れる背徳感と申しましょうか。
さて「どうやるんだっけ」といつも忘れる理由の一つは、ポータルに表示するテーブルのタイプによって異なる措置を必要とするからだと思い当たりました。改めて考えると、二種類あります。
ポータルに表示するテーブルに、フィールドを追加できるかできないかの違いです。
可能な場合は、レコード番号のフィールドを使って「隠す」を指定できます。可能じゃない場合はちょっと厄介で、スクリプトにトリガにグローバル変数と、仕込みの手間が発生します。
レコード番号フィールドを作って利用するケース
テーブルにフィールドを作成できる環境ではとても簡単です。
ポータルに表示するテーブルに、レコード番号のフィールドを用意します。計算結果を保存しないオプションを付けて、 Get ( レコード番号 ) を指定します。
ポータルを作り、アクティブな行にだけ表示させたいオブジェクトを配置、隠す設定を施します。
Get ( アクティブポータル行番号 ) ≠ ポータルテスト2::RN
※ テーブル名をポータルテスト2、レコード番号フィールドを RN としています
これが最もシンプルな方法ではないかと。
どこかの行をクリックしてアクティブにするとアクティブポータル行番号に行が入ります。図では1行目をクリックした状態。当然、レコード番号とも一致しますね。それ以外は隠す設定にしておくという簡単な理屈です。
尚、レコード番号フィールドを作らず、代わりに Get(レコード番号) を使ってみたら上手く動きませんでした。
フィールドを作成できないケース
問題はここからですが、テーブルにフィールドを作成できないケースがあります。例えば、ポータルに配置するのが ODBC 接続のテーブルであるとか。先方様のデータベースを勝手に弄くることはできませんし、そもそもFileMaker のデータベースではないので Get(レコード番号)なんてありません。
フィールドが作れないので今ある状態で何とかしなければなりません。
ちょっと手間がかかりますが仕方ない。次のような方法をよく使います。
レコード固有の値を持つフィールド
ポータルに配置するテーブルに、レコードを特定できる固有の値を持つフィールドがあることが条件です。例えば ID とか 主キーとか、それ以外にも明確にレコード固有のユニークデータでありさえすれば何でもいいです。大抵のテーブルにそれはあると思います。
スクリプトを一つ作る
ちょー簡単なスクリプトを一つ作っておきます。
変数を設定 [ $$portalKey ; 値: Get( スクリプト引数) ] ウインドウ内容の再表示
スクリプト引数からグローバル変数を作ってウインドウを再表示するだけのスクリプトです。
再表示がないと、最初の一発目とか、ときどき表示に反映されません。
ちょっと余談ですが、グローバル変数の値に応じて表示をコントロールするとき、どうしてもウインドウ内容の再表示が必要になります。これが我慢ならない場合、グローバル変数の変わりにフィールド(グローバル)を使います。フィールドを使用すればウインドウの再表示をしなくても即座に反映されるんです。
フィールド設定 [ GLB::portalKey ; Get( スクリプト引数) ]
ポータルにスクリプトトリガを設置
作ったスクリプトを、ポータルのスクリプトトリガに設置します。OnObjectEnter と OnObjectExit の二箇所にセットしましょう。
OnObjectEnter にのみ、スクリプト引数をセットします。ポータルに表示するテーブルの、固有フィールドを指定します。
テーブル::固有フィールド
スクリプト引数にはこのように普通に目的のフィールドを指定します。値がほしいんだから ” ” で括ってはいけませんよ。
スクリプトの動き
ポータル(ポータルの行)に触れてアクティブにすると、そのレコードの固有フィールドの値がグローバル変数に記録され、離れると空になります。
ポータルの行を移動するときも OnObjectEnter が走りますので、アクティブな行にいる間はグローバル変数にそのレコードのユニークな値が入った状態になります。
隠す設定
隠したいオブジェクトの「隠す」設定にはこう書きます。
$$portalKey ≠ テーブル::固有フィールド
グローバル変数と固有フィールドの内容が異なっていれば隠します。
スクリプトは作るわトリガはセットするわグローバル変数は使うわで、面倒で鬱陶しいように思いますが、結局これが最適解じゃないかなと思います。
アクティブな行にだけオブジェクトを表示させる件についてでした。もっと簡単でシンプルな良いやり方をご存じならぜひ教えてください。