FileMakerでメディア管理 2-3 小ネタ:快適操作

ファイルメーカーでメディア管理システムを作る話。とことん楽をしたい。それだけのために苦労して仕組みを作ります。オマケ的に、快適操作の一例を挙げてみたいと思います。

小ネタ:快適操作

レイアウトでよく使うボタンとかポップアップメニューについてです。

ボタンはボタンを配置してスクリプトを割り当てるだけなので簡単だし便利だし、放っておくとレイアウト中がボタンだらけになります。フィールドさえボタンになったりします。あまりにもボタンだらけなので「もうちょっと何とかならんのか。例えばプルダウンメニューみたいにまとめてポップアップできるとか・・・それやっ」というわけで近年はボタンに割り当てる代わりにポップアップメニューを作っています。

ポップアップメニュー

フィールドの表示スタイルにポップアップメニューあります。普通はフィールドへの入力に使いますね。でもそれとは違って、ボタンの代わりにポップアップを使うのですがそれってどういうこと?こういうことです。

あるフィールドに値一覧を割り当ててポップアップメニュー表示にして選択したら某かの処理が行われます。ボタンでの処理をメニュー方式にしただけのことです。これが省スペース的にも使い勝手的にも大変よろしいんです。

作り方

作り方は、メニューを表示するフィールドにスクリプトトリガOnObjectModifyをセットします。

材料

  • メニューを表示するフィールド
  • 表示する値一覧
  • トリガに仕込むスクリプト
  • (あとは実際に動かすスクリプト)

メニューを表示させるフィールドはグローバル格納です。データベースの大事なデータを入れるフィールドではなくて、ただのメニュー表示用、スクリプトを動かすためだけのフィールド、単なる入れ物です。

このグローバル格納フィールドをレイアウトに配置してコントロールスタイル「ポップアップメニュー」に指定。そして値一覧を表示します。値一覧には目的の文字列をあらかじめ仕込んでおくわけです。

グローバルなメニュー表示用フィールドにスクリプトトリガーOnObjectModifyに仕込みます。これはフィールドの内容が変更されれば実行されるトリガーです。値一覧で選ばれた項目名を実行させます。

以上を用意して快適メニューを作ります。

スクリプトトリガOnObjectModifyにセットするスクリプトにはパターンがあります。理屈は同じですがちょっと異なります。ポップアップメニューの目的にもよります。

  • スクリプトを直接実行させるスクリプト
  • 値に応じて特定の処理を行うためのスクリプト

こういうことです。値一覧で選んだ「項目」をトリガーで実行するわけで、その項目が何なのかということに直結します。

何のことやら判らないですね、以下で説明いたします。

スクリプトを直接実行させる

すでに作成済みのスクリプトありますね、そのスクリプト名と同じ名前を値一覧に仕込みます。

フィールドトリガーOnObjectModifyにセットするスクリプトには
「スクリプトを実行 [名前で] 」
これを書きます。これだけで基本OK。

例えば「タイトルでソート」というソートさせるスクリプトを作りますね。
値一覧に「タイトルでソート」という項目を含めます。
メニューフィールドのトリガーに「スクリプトを実行[名前で]」を仕込みます。
ブラウズモードでメニューから「タイトルでソート」を選びますね。するとタイトルでソートスクリプトが実行されますね。

フィールドで選ぶ -> 選ばれたのと同じ名前のスクリプトが実行される という流れです。

特定の汎用的な処理をさせる

少し違うパターンもあります。スクリプト名による実行ではなく、値一覧の項目名を使って特定処理をさせるパターンです。

例えばメニューで選択された項目名に応じて特定フィールドを検索・絞り込みするということもその一つ。

値一覧に、検索・絞り込みさせたい言葉を追加しておきます。
メニューのトリガーには「その言葉(フィールド内容)で検索」するスクリプトを仕込みます。

例えば「種類」フィールドがあったとします。「種類」フィールドにはレコードごとに「画像」「音楽」「動画」といった文字が入っているとします。これで検索、絞り込みを行います。
値一覧には「画像」「音楽」「動画」と仕込みます。
(または種類フィールドの値を直接値一覧に指定するもよし)

フィールドスクリプトトリガーOnObjectModifyではスクリプトを以下のように仕込みます。

1 選ばれた項目を変数に格納
2 検索モードに切り替え
3 フィールド設定 [フィールド 種類 内容 変数]
4 検索実行

ポップアップメニューで選んだテキストが指定フィールドを対象に検索されるというだけです。

もうちょっと汎用性を高めましょうか。

スクリプト引数を指定する手間を惜しまなければこのスクリプトは汎用的な検索スクリプトとなります。この場合なら、スクリプトトリガーに目的のフィールド名「種類」をスクリプト引数として付与してあげます。

1 変数 $w 仕込み [メニューフィールドの内容]
2 変数 $f 仕込み [スクリプト引数]
3 検索モードに切り替え
4 フィールドを名前で設定 [ フィールド “テーブル::” & $f ] [内容 $w ]
5 検索実行

どこでも使える汎用的な検索スクリプトできました。スクリプトは放っておくと増えすぎますから、できるだけ汎用的なスクリプトを書いてあちらこちらで流用するのが望ましいですよね。

スクリプトを名前で実行させるメニューと理屈は同じですけど、スクリプトを名前で実行ばかりを作っていたらスクリプトが増えすぎて鬱陶しいので、利用目的が決まっているもの(この場合は検索)は使い回せる形にしてスクリプトが増えすぎることを防ぎます。

余談ですが、FileMakerではソートを実行させる関数がありません。例えば「$フィールド でソート」とか「$order = “”」といった書き方が存在しなくて、一個ずつソート画面を用いてのスクリプトを作らなくてはならず、汎用性を持たせられません。これ何とならんのかと長年思ってますが何ともなりませんでしたねえ。

条件に応じて切り替わる値一覧メニュー

グローバルフィールドと値一覧の組み合わせは、条件に応じて変化する親子メニューで活躍したりもします。

例えば最初のポップアップメニューで「お料理」を選んだら、その隣のメニューには「だし巻き/タコ唐揚げ/鯖の燻製」などと表示され、「ドリンク」を選んだら隣メニューに「生ビール/ワイン/焼酎」などと表示させたりするアレです。「動的値一覧」とよく呼ばれています。

このアレはFileMakerの鬼門の一つで、理解するのがとても難しいんですが、まあ、そういうこともできます。私はあほですのでこれを理解するのに長い年月が必要でした。

このアレは、大分類と小分類をリレーションしておき、値一覧に「大分類」「小分類(大分類に照合)」を仕込んで、それをグローバルメニューに代理入力させて検索・絞り込むというやり方です。丁寧に書き出すと長くなるかもしれないのでここでは割愛します。

これをポップアップメニューと組み合わせて上のようなポータルのフレキシブルな絞り込みに使ったりしています。

グローバルフィールド専用ファイル

私個人的にですが、どんなFileMaker書類を作っても、ボタンと同じくらいこうしたポップアップメニューを多用するので、結果グローバルフィールドがたくさん作られます。

このフィールドは単なる代理の入れ物でどうでもいいものです。なのにあちらこちらで同じようなものを多用するから、専用ファイルを作りました。「参照フィールド」「スクリプトメニュー用1」「検索用2」とか、そんな名前のグローバル格納のフィールドばかり集めたグローバル専用ファイル。このファイル、多くの自作ファイルメーカー書類にテーブルを読み込んで利用しています。格納がグローバルだとリレーションしなくてもどこでも使えるので、これ意外と便利です。

グローバルフィールドのついでに、よく使う汎用スクリプト、よく使うスクリプト部品やデザイン部品、そういうのも集めて、自分専用初期設定利用システムFMファイルとして重宝しております。長年使ってきて今頃こんな楽ちんな使い方を思いつくとは、おれって天才かめっちゃあほのどちらかやな。と自画自賛自暴自棄。

スクリプトについてちょっと書いてしまいましたが、次のページに続きます。スクリプトについて。

FileMakerでメディア管理 2-4 スクリプト