FileMaker オリジナル検索窓

ファイルメーカーで検索窓の設置をよく行います。自作の検索窓レシピ、FileMaker関連の単発記事です。

FileMaker 検索窓

オリジナル検索窓

ファイルメーカー書類に自作検索窓を用意することが一般的なのかどうか判りませんが私はよく使います。検索するだけならコマンドFでいいし、ツールバーにもクイック検索窓があります。なのに作ります。

ツールバーのクイック検索は検索対象が広範囲すぎて書類によってはとても遅いし、ツールバーそのものを非表示にすることも多いのです。※

※ クイック検索についてぜんぜん知りませんでした。検索対象を指定できるしスクリプトステップにもあるし、こいつは割と使えるやつです

今日のお料理はオリジナル検索窓です。まずは完成品の例から。

材料

  • 検索窓フィールド …グローバルな入れ物・・・1個
  • スクリプト…トリガーに仕込むスクリプト・・・2個
  • 検索ボタン…いらないけど一応つけておく・・・1個
  • クリアボタン…検索フィールドを空にする簡単なボタン・・・1個
  • 他、あれば便利ないくつかのもの・・・少々

検索窓フィールド

格納をグローバルに設定した検索窓として使うテキストフィールドをひとつこしらえておきます。グローバル格納はリレーションなしでも配置できるので、大事なデータベースのテーブル内でなくてもどこにあってもいいです。ただの入れ物です。

検索窓フィールドに文字を入力して確定したら検索させます。フィールドトリガーを仕込んで動かします。

検索ボタンとクリアボタン

検索ボタンと入力をクリアするボタンをサービス的に用意します。検索は入力と確定で行いますから検索ボタンはいらないのですが、ここが検索フィールドであることを示すため、あと検索するとき丁寧に検索ボタンを押す人が結構な割合でおられますのでそのために親切として設置します。

検索ボタンの動作は、検索窓トリガーで使用する検索用スクリプトと同じものを指定してあげればいいと思います。

クリアボタンも特にいらないけど親切設計として用意します。検索窓フィールドを空にするだけの機能です(例ではメッセージ欄もついでに空にしています)

スクリプト

検索窓フィールドにトリガーで仕込む検索させるスクリプトを1個作ります。それ以外に少しオマケ的なスクリプトが一つあります。では作り方を見ていきましょう。

検索窓フィールドのトリガー

検索窓フィールドにスクリプトトリガーを設定します。

フィールドにスクリプトトリガー
フィールドにスクリプトトリガーを設定
スクリプトトリガ設定
スクリプトトリガ設定

設定画面です。まずはOnObjectSaveです。

OnObjectSave

入力が確定しセーブされると発動するトリガーです。自作ポップアップメニューでよく使うOnObjectModify では反応早すぎてだめなんでObjectSaveを使います。

検索窓実行スクリプト

仕込むスクリプトは実にシンプル。ただ検索窓の言葉で検索するだけのスクリプトを作ります。

  1. 入力された内容を変数に格納
  2. 検索モードに切り替え
  3. 検索対象フィールドに変数を指定(必要フィールドごとに複数)
  4. 検索実行

これだけです。変数に仕込む意味あんのか。もちろんあります。検索モードに切り替えますから。

スクリプトステップ1
変数に格納
スクリプトステップ2
検索モードでフィールド指定。この例ではtitleフィールド

検索フィールドに入力された内容($item)を、検索モードにした上で検索対象にしたいフィールドに設定してやるだけです。

もっと簡単にスクリプトステップ「クイック検索の実行」を指定してもいいと思います。

複雑な検索が必要ならそれなりのスクリプトを書きます。新規検索条件追加で複数のフィールドを指定したり、細かな検索条件があれば追加したりです。画像の例は、どのテーブルでも「title」フィールドを指定できる書き方です。

それとは別に上記スクリプトには追加したほうがいいスクリプトステップがあります。

このスクリプトに追加する二つのスクリプトステップ

ひとつは「検索窓フィールドが空のときは何もせずスクリプト終了」です。事故的に検索フィールドにカーソルが行ってリターンしてしまうとか、意味なく検索ボタンをクリックしてしまうとか、あり得なくもありません。検索窓が空なのに検索されてもウザいだけです。

FMスクリプト
もし検索窓が空なら終了、何もしません

これを一番最初に書いておくと空欄を検索してしまう事故を防げます。

もうひとつは「検索実行のエラー処理」で結果がなかったときの挙動を作っておくことです。検索結果がない場合のデフォルトの挙動ってウザいですよね。あれを出さないようにします。

FMスクリプトエラー処理
何もしていないに等しいですがエラー処理

最後の「検索実行」の前にエラー処理オンを挟んで、検索実行のあとに何をするか書きます。

Get(最終エラー)の番号ですが、問題がないときは0で、エラーに応じて番号がいろいろあります。検索結果がないときは404ですか?よく知らないのでとにかく0でなければエラーってことで雑な処理をしています。

以上で終わりですが、少し欲が出てきますので味付けとしてもうひとつスクリプトを作って仕込みましょう。

リターンで検索

検索語を入力してエンターキーを押すと確定して検索開始しますが、リターンキーだと改行になります。検索窓で改行を入れたいことはほぼないでしょう。入力してリターンキーをぽんと押すと検索してもらいたい。そこでOnObjectKeystrokeです。

OnObjectKeystroke

アクティブなフィールドにいるあいだキーストロークを操れるトリガーです。このフィールドにいるときはリターンキーを「確定」にいたしましょう。

FMスクリプト リターンで確定
もしリターン(13番)が入力されたら確定

そういえばファイルメーカーのスクリプトはコピーしてもテキストにペーストできません。面倒なのでキャプチャ画像でやってますが。

ファイルメーカーを使っていて、フィールド内での改行に少々イラッとくることも多いのです。このシンプルなスクリプトは検索窓に限らず、改行が不要なフィールドにじゃんじゃん使っています。

キーストロークは他にも使えそうなスクリプトですが、キーの番号を知ることがハードル高い部分ですよね。

関数リファレンス>テキスト関数>Code によりますと、Unicodeのコードポイントだそうです。何ですかそれ。

面倒くさそうなのでリファレンスから引用して自分のためにもメモしておきます。このあたりが判っていれば割と十分じゃないでしょうか。

backspace8
tab9
shift-tab9
enter10
return13
escape27
left arrow28
up arrow29
right arrow30
down arrow31
space32
delete127

FileMaker Pro 17 リファレンス Code

 

メッセージ欄

冒頭に載せたこの例↓ で、検索窓の下に「〜の検索結果」と、ムービーに映っているのでそれについて一言だけ。

検索窓の下に検索結果を表示するメッセージ欄があります。これもグローバル格納の入れ物フィールドです。検索するスクリプトの最後には、メッセージ欄フィールドに検索語を入力するような親切設計をしております。

隣に見える「タイトルで並び替え」も同じくグローバル格納フィールドを用いたスクリプトのポップアップメニュー。これについてはこちらに書いてます →FileMakerでメディア管理 2-3 小ネタ:快適操作

オマケ

あれば便利なフィールド

検索窓の話は終わりですが、検索されることを前提にしたフィールドのネタをデザートとして一席。

検索対象のインデックス用隠しフィールド

個人的に検索対象用の隠しフィールドを作っておくことをたまにやっています。

検索窓フィールドを作ると、特定フィールドだけじゃなくいろんなフィールドを対象とする言葉を検索したいですよね。

そういうとき、検索スクリプトに必要な検索対象をだらだら書き綴ってもいいのですが、検索したいフィールドを一つの被検索用フィールドにまとめてもいいと思うんです。いわばフィールドをまたがる検索用インデックスフィールドの作成です。

作成するインデックスフィールドは計算フィールドです。検索対象となる必要なフィールド内容をひたすら & で繋げるだけです。もちろんこのフィールドをレイアウト上に表示させる必要はありません。

カスタムとしてローマ字にしたものを加えたりもしますし、テキスト内容を細工して分割したりもします。なんとなればポータルから転記したりもします。ここを検索対象にするだけで必要な検索をカバーできることを目的に作り込んだりします。

こういうフィールドを作っておくと検索窓スクリプトに書く検索対象がこれ一個で済みますから汎用スクリプトとして使い回しも楽々。高速で検索出来ますし。まあ必須じゃないしあくまでオマケ的な話ですけど。

※ FileMakerのクイック検索でも検索対象とするフィールドを手動で管理できるみたいです。そっちが使い勝手よければそれでいいと思います(知らなかった)

クイック検索で検索フィールドを指定する方法 … インスペクタのデータタブに「クイック検索に含める」のチェックあります

検索対象フィールドがひとつで済むことや、インデックスに相応しいカスタムをガッチリ行うことに関してはインデックスフィールドの自作が有効かなと思います。

あれば便利なレイアウト

検索絡みのネタ、あれば便利なレイアウトです。それは検索用レイアウトです。

ちょっと複雑なレイアウトを作ってると、レイアウトトリガーやレコードトリガーがセットされると思います。レイアウトやレコードがロードされる度に発動するスクリプトが仕込んであることでしょう。

検索実行したときにもトリガーが発動します。検索時にはこれいらない場合が多いと思います。たとえ必要でも、検索実行のときにエラー処理を挟んでいると上手くいかないことがあります。検索実行でエラーが出てるのに、「Get(最終エラー)」が動くより先にレコードトリガーが発動してしまい、エラーがいつの間にかどっかいっちゃうてことが起こり得ます。

そんなわけで検索専用レイアウトを用意します。このレイアウトは無骨にフィールドがあるだけで装飾やボタン類やレイアウトトリガーやレコードトリガーは一切含めません。

検索するスクリプトを書くとき、検索語を変数に入れたら速攻で検索用レイアウトに移動してそっちで検索、実行後は速やかに元のレイアウトに戻します。

これで検索実行とエラー判断の間を邪魔するスクリプトを発動させずに済みます。基本的なTipsかなと思いますが私はこういうことに何十年も気づかずにいましたので他にもそういう人いるかもしれないと思って書いときました。

あれば便利なテーブル

検索窓フィールドはただの入れ物フィールドでした。よく使うポップアップメニューもただの入れ物フィールドを使用します。ソートメニューなんかもただの入れ物フィールドを使います。あと親切な「メッセージ欄」みたいなグローバルなフィールドも使います。変更できないように設定したフィールド内容を「コピー」したいときにコピペ用グローバルフィールドを使います。現在のウインドウ位置やサイズやレイアウト名を仮に保存しておくためのシステマチックな入れ物フィールドを使ったりもします。

羅列してもキリがないですが、そんな感じで、グローバル設定の入れ物フィールドを多用します。こういうのを大事なデータベースの本体テーブル内に作ってしまうのは良くないです。ごちゃごちゃになりますし。

ですのでテーブルを分けます。グローバルなフィールドはリレーション設定しなくてもどこにでも配置できますから、グローバルな入れ物フィールドばかり集めた専用のテーブルを作って、入れ物はそっちから配置します。こういうテーブルまたはファイルでもいいですね、作っておくと何かと便利に使えます。使い回すことも多いです。

 

Digital Boo Pennguin Icon

ということでしつこいオマケもありましたがファイルメーカーの自作検索窓でした。

 

広告
カテゴリーFileMaker
このエントリーをはてなブックマークに追加

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください