少しダイナミックなメニューを作る_FileMaker

FileMakerでメニュー項目を作る際によく使うのが「値一覧」ですが,様々な利用方法があります。ここでは,利用回数に応じて項目内容が変わる「値一覧」の作り方を紹介します。ただし,利用回数が変化する部分については割愛し,サンプルでは直接手入力することでそれ以降の機能の確認ができるようになっています。

まず始めに,完成例を示します。図1が元になるデータです。各レコードに停留所情報があり,その中に選択履歴回数が入っています。本来は,ここもプログラムで作られるべき部分ですが,今回は手入力します。入力後,「メニュー更新」ボタンを選ぶと,スクリプト「メニュー作成」により図2のように,停留所名を履歴回数の多い順番で値一覧としてメニューにします(図2)

図1:停留所履歴を表示。4箇所の停留所の利用履歴情報を管理しています。今回はサンプルデータなので,履歴回数は自分で手入力します。

図2:メニューサンプル。ここでは,「研究棟」という停留所が一番多く使われたので,「1」という添字と共にメニュー表示されています。

FileMakerの「値一覧」を使うことで,簡単にメニューを作ることができます。一般的な手順は,以下の通りです。

先ず,テキストフィールドを作成し,選択状態でインスペクタのフィールドからコントロールスタイルをポップアップメニューなどに指定します。さらに,コントロールスタイルの「値一覧」を選び,何を一覧表示したいかを作成,定義します。ここは重要で,必ず「値一覧」に指定のスタイルが選ばれている必要があります。今回は「項目」という名前の一覧を選んでいます。

図3:menuフィールドの定義状態。メニュー表示するために,ここでは「ポップアップメニュー」スタイルを定義しています。

「値一覧」(ここでは「項目」)は以下のように定義しています。最も簡単な「値一覧」のコントロールスタイルは直接項目を改行で入力する方法,「カスタム値を使用」ですが,今回は「フィールドの値を使用」を選んでいます。フィールドの指定…は下図のように定義しています。「最初のフィールドを使用」では「順位」フィールド(数値)を指定しています。最も利用履歴の多いレコードでは,「順位」は「1」になります。「順位」はスクリプトで作っています(後ほど示しますが,極めてローテクなスクリプトです(笑))。2個目のフィールドとして「停留署名一覧」フィールド(テキスト)を指定しています。

図4:値一覧の定義。メニュー項目を二つ定義しています。

以上の定義により,4つの停留所の利用状況に応じて「1****」,「2****」のようにメニューが表示されます。「停留署名一覧」フィールドだけだと項目は正しく選ばれますが,メニュー内での表示順が文字コードの順番になってしまいます。そこで,項目前に「1」,「2」などの番号を付けるようにしています。

ここで,私が迷ったのは,メニュー項目は「値一覧」のコントロールスタイルを,直接項目を改行で入力する方法「カスタム値を使用」のように一覧表にする必要はなく,図1の例のように(ここでは4つの停留所情報が4レコードになっている),それぞれレコードに入っていても一覧にしてくれるという点です。最初はこれがわからず,全ての項目をスクリプトで1つのフィールドに作ってしまいました(笑)。

スクリプトを図5に示します。このスクリプトは選択履歴の多い順番で並べ替えられた停留所情報のうち,一番先頭のレコードから順番に「順位」フィールドに1,2,3,4と値を入れています。本来は4レコード分の処理ですから,4回のループ処理を行えば良いのですが,ここではローテクで1行づつ処理しています(笑)。最後から2行目はメニューを配置したレイアウトに移動しています。

最後の1行「フィールドへ移動」は結構重要です。上記までのスクリプトで基本的にはメニューは出来上がるのですが,この1行が無い状態ですと,手動でメニューを開かない限り,先頭の項目が選ばれません。この「フィールドへ移動」を指定することで,手動操作無しでフィールドがアクティブになり,結果的に先頭メニューが表示された状態になります。

最後に,停留所情報のレイアウトにはあらかじめ図6のようなソート条件を記憶定義しているので,「選択履歴」の値に応じて自動的に並べ替えが実行されます。

図5:スクリプト「メニュー作成」

図6:ソート条件をレイアウトに定義済み。

今回は,スクリプトはボタンから起動するようにしていますが,本来はファイルを開いたタイミングで起動するなど(スクリプトトリガー)すべきでしょう。

他にもFileMakerでダイナミックにメニューを作る方法はあります。項目に応じて次のメニュー作るリレーションシップを活用した方法などもあります。色々と調べてみると良いでしょう。