ファイルメーカーで検索窓の設置をよく行います。自作の検索窓レシピ、FileMaker関連の単発記事です。
オリジナル検索窓
ファイルメーカー書類に自作検索窓を用意することが一般的なのかどうか判りませんが私はよく使います。検索するだけならコマンド+Fでいいし、ツールバーにもクイック検索窓があります。なのに作ります。
通常の検索モードでは想定されるユーザーによって不親切かつ危険だし、ツールバーそのものを表示させない場合も多いですから。
ということで今日のお料理はオリジナル検索窓です。まずは完成品の例から。
・検索窓に入力して検索ボタンクリックで検索を行います
・入力してリターンしただけでも検索を行います
材料
- 検索窓フィールド …グローバルな入れ物・・・1個
- スクリプト … トリガーに仕込むスクリプト・・・2〜3個
- 検索ボタン … 検索実行するボタン・・・1個
- クリアボタン … 検索フィールドを空にするボタン・・・1個
- 他、あれば便利ないくつかのもの ・・・ 少々
検索窓フィールド
検索窓として使うテキストフィールドをひとつこしらえておきます。フィールドタイプはグローバルに設定します。グローバル格納はリレーションなしでも配置できるのでどのテーブルにあってもいいです。ただの入れ物です。
フィールドにスクリプトトリガを仕込んでおき、検索窓フィールドに文字を入力して確定すれば検索スクリプトを発動させます。
検索ボタンとクリアボタン
検索ボタンと入力をクリアするボタンをサービス的に用意します。検索は入力と確定で行いますから検索ボタンはいらないのですが、ここが検索フィールドであることを示すため、あと検索するとき丁寧に検索ボタンを押す人が結構な割合でおられますのでそのために親切として設置します。
検索ボタンの動作は、検索窓トリガーで使用する検索用スクリプトと同じものを指定すればいいと思います。
クリアボタンも特にいらないけど親切設計として用意します。検索窓フィールドを空にします(例ではメッセージ欄もついでに空にしています)クリアすると同時に「全レコード表示」にしてもいいでしょう。
スクリプト
検索窓フィールドのトリガに仕込む検索させるスクリプトを1個作ります。それ以外に少しオマケ的なスクリプトがあります。具体的には後ほど。
では作り方を見ていきましょう。
検索窓フィールドのトリガ
検索窓フィールドにスクリプトトリガーを設定します。
設定画面です。まずはOnObjectSaveです。
OnObjectSave
入力が確定しセーブされると発動するトリガーです。自作ポップアップメニューでよく使うOnObjectModify では反応早すぎてだめなんでObjectSaveを使います。
検索窓実行スクリプト
仕込むスクリプトは実にシンプル。ただ検索窓の言葉で検索するだけのスクリプトを作ります。
- 入力された内容を変数に格納
- 検索モードに切り替え
- 検索対象フィールドに変数を指定
- 検索実行
基本はこれだけです。変数に仕込む意味あんのか。もちろんあります。検索モードに切り替えますから、何が入力されたのか覚えさせておかないと。
検索フィールドに入力された内容($item)を、検索モードにした上で検索対象にしたいフィールドに設定してやるだけです。
どのフィールドを検索するかはデータベースに応じて、各自最適な対象をセットしましょう。
スクリプトステップ「クイック検索の実行」を指定してもいいと思います。
このスクリプトには最初に追加すべきスクリプトステップがあります。
このスクリプトに追加する二つのスクリプトステップ
ひとつは「検索窓フィールドが空のときは何もせずスクリプト終了する」ステップです。
事故的に検索フィールドにカーソルが行ってリターンしてしまうとか、意味なく検索ボタンをクリックしてしまうとか、あり得なくもありません。検索窓が空なのに検索されてもウザいだけです。
これを一番最初に書いておくと空欄を検索してしまう事故を防げます。
もうひとつは「検索実行のエラー処理」で、結果がなかったときの挙動を作っておくことです。検索結果がない場合のデフォルトの挙動ってウザいですよね。あれを出さないようにします。
最後の「検索実行」の前にエラー処理オンを挟んで、検索実行のあとに何をするか書きます。
Get(最終エラー)の番号ですが、問題がないときは0で、エラーに応じて番号がいろいろあります。検索結果がないときは404ですか?よく知らないのでとにかく0でなければエラーってことで雑な処理をしています。何も処理しなくてもいいです。
もうちょっと汎用的に
クイック検索をさせるならいいですがそうでない場合、検索対象を指定してしまうと汎用性が大いに損なわれます。
いろんなテーブルのいろんな局面で検索窓を使い回したいときのために、もうちょっと汎用的に作ってもいいと思います。
スクリプト引数に検索対象を記述する
一つのやりかたとして、検索窓にスクリプト引数をセットすることが考えられます。
引数に検索対象のフィールドを記しておいて、検索スクリプトでは「引数がある場合」の条件分岐と共に、検索モードに切り替えた後「フィールドを名前で設定」で get(スクリプト引数) を指定します。
以上で終わりですが、もうひとつスクリプトを作って仕込みましょう。
リターンで検索
検索語を入力して確定すると検索を開始しますが、この「確定」の挙動についてです。
通常、エンターキーを押すと確定、リターンキーだと改行になります。コンピュータタイプやキーボードによってもEnterとReturnの挙動がいろいろですし、それを使い分けるのもやや面倒な話です。検索窓に入力をするとき、改行を入れたいことなんてほぼないでしょう。入力してリターンキーをぽんと押すと検索してもらいたい。
リターンキーでもエンターキーと同じように「確定」にしたい。そこで使用するのが、トリガー OnObjectKeystrokeです。
インスペクタのデータタブにこういう設定がありますが
次のオブジェクトに行ってもらいたいわけではないので、ちょっと違うんですよね。
OnObjectKeystroke
アクティブなフィールドにいるあいだキーストロークを操れるトリガーです。このフィールドにいるときはリターンキーを「確定」にいたしましょう。
これを、フィールドのトリガ OnObjectKeystroke に仕込みます。
余談:キーストロークのキー
キーストロークは他にも使えそうなスクリプトですが、キーの番号を知ることがハードル高い部分ですよね。
関数リファレンス>テキスト関数>Code によりますと、Unicodeのコードポイントだそうです。何ですかそれ。
リファレンスから引用して自分のためにもメモしておきます。
Key Code
backspace 8 tab 9 shift-tab 9 enter 10 return 13 escape 27 left arrow 28 up arrow 29 right arrow 30 down arrow 31 space 32 delete 127 例 1
Code (“”) は空の文字列を返します。
Code (“a”) は「97」を返します。
Code (“b”) は「98」を返します。
Code (“ab”) は「9800097」を返します。
Code (“ä”) は「228」を返します。
OnObjectKeystroke または OnLayoutKeystroke スクリプトトリガでキーによる操作を行う時は、先ほど示したようにこう書いて使うわけです。
If [Code (Get (トリガキー入力)) = 13]
レコード/検索条件確定
End If
メッセージ欄
冒頭に載せたこの例↓ で、検索窓の下に「〜の検索結果」と、ムービーに映っているのでそれについて一言だけ。
検索窓の下に検索結果を表示するメッセージ欄があります。これもグローバル格納の入れ物フィールドです。検索するスクリプトの最後には、メッセージ欄フィールドに検索語を入力するような親切設計をしております。
隣に見える「タイトルで並び替え」も同じくグローバル格納フィールドを用いたスクリプトのポップアップメニュー。これについてはこちらに書いてます →FileMakerでメディア管理 2-3 小ネタ:快適操作
オマケ
あれば便利なフィールド
検索窓の話は終わりですが、検索されることを前提にしたフィールドのネタをデザートとして一席。
検索対象のインデックス用隠しフィールド
個人的に検索対象用の隠しフィールドを作っておくことをたまにやっています。
検索スクリプトに検索対象フィールドをだらだら書き綴ってもいいのですが、検索したいフィールドを一つの被検索用フィールドにまとめてもいいと思うんです。いわば検索用インデックスフィールドの作成です。
計算式で検索対象となる必要なフィールド内容をひたすら & で繋げるだけです。もちろんこのフィールドをレイアウト上に表示させる必要はありません。FileMakerにインデックスしてもらいたいので常に計算させず、何かの折(スタートアップ時とか何かが更新されたとき)にスクリプトを使って計算させます。
フリガナやローマ字変換したものを加えたりもしますし、テキスト内容を細工してスペースで分割したりもします。なんとなればポータルから転記したりもします。ここを検索対象にするだけで必要な検索をカバーできることを目的に作り込んだりします。
こういうフィールドを作っておくと検索窓スクリプトに書く検索対象がこれ一個で済みますから汎用スクリプトとして使い回しも楽々。高速で検索出来ますし。まあ必須じゃないしあくまでオマケ的な話ですけど。最近私もあまり使ってないですけど。
クイック検索
まどろっこしいことをしなくてもクイック検索で十分な場合も多いと思います。
クイック検索で検索フィールドを指定/解除する方法 … インスペクタのデータタブに「クイック検索に含める」のチェックがあります
あれば便利なテーブル
あれば便利なのがグローバルフィールドばかり作るテーブルです。
検索窓フィールドはグローバルな入れ物フィールドでした。他にもスクリプトをメニュー化したり、値一覧を割り当てたり、メッセージ欄を作ったり何かの仮置き場を作ったり、グローバルフィールドを頻繁に使います。
こういうのを大事なデータベースの本体テーブル内に作ってしまうのはあまり良くないです。ごちゃごちゃになりますし。ですのでテーブルを分けます。グローバルフィールドを集めたテーブルを作っておくと何かと便利に使えます。使い回すことも多いです。
個人的にこのテーブルはどんなFileMaker書類にもありまして、名前もいつも「System」です。FileMaker書類をまたがってスクリプトをコピペしたときなんかに破綻しないのでいい感じです。
ということでファイルメーカーの自作検索窓でした。
なお、この記事には続編があります。こういう感じの、リアルタイム風シンプル検索です。
続編記事はこちら↓