ファイルメーカーで 「初心者が迷わず使える『期間検索機能』」 を作ろう!

2020年01月16日 11:24 AM

ファイルメーカーのTips


日付を持つデータがある際に、「自分で日付を指定してその期間のデータだけを表示したい」というのはよくあるのではないでしょうか。

今回は、開始日・終了日を入力して検索実行ボタンを押すとその期間のデータのみが表示される、初心者が迷わず使える「期間検索機能」の作り方についてご紹介したいと思います。

必要となるのは
・日付を指定する検索用フィールド
・スクリプト
・レイアウト編集(検索ボタンと検索用フィールドの設定)
この3つです。

 

〇日付を指定する検索用フィールドの作成

日付を入力できるグローバルフィールドを作成します。

—グローバルフィールドとは?———————————————————————————————————————
FileMaker Pro 18 Advanced ヘルプ によると

と書かれています。

グローバルフィールドは各クライアント(セッション)毎に一時的に値を持つことができます。例えばグローバルフィールド「検索」があるときに、Aさんが”あ“という値を入力し、Bさんが”い”という値を入力したとします。どのレコード、どのテーブルにいてもAさんは「検索」に”あ”という値が入っていることを確認できます。また、Bさんからは”あ”という値は見えず、どのレコード、どのテーブルにいても「検索」に”い”という値が入っていることを確認できます。
——————————————————————————————————————————————————-

データベース管理を開きます(メニューバーのファイル>管理>データベース を選択)。

検索用のフィールド「検索_開始日」を「タイプ:日付」で作成します。

その後、オプション>タブ:データ格納にある「グローバル格納」にチェックを入れます。

同様に「検索_終了日」も作成します。


これで検索用フィールドの作成は完了です。

〇スクリプトの作成

スクリプトを作成する際は、手動でどのような操作が必要か考えると分かりやすいと思います。
「期間検索」を手動でおこなう場合、どんな操作が必要でしょうか?
1.検索ボタンを押して、検索モードに切り替える
2.期限に「検索したい期間」を入力する
3.検索実行
このような操作が必要となります。

また、今回はエラー処理も加えていきたいと思います。
例えば、検索期間が指定されずに検索実行ボタンが押された場合は、デフォルトの機能として備わっている次の画像のようなエラーメッセージが表示されます。

「パッと見て伝わるメッセージではないな」「ボタンの違いが伝わりにくいかも…」と感じる方もいらっしゃるのではないでしょうか。
もしこのメッセージが「期間を指定してください」というメッセージと「OKボタンのみ表示」だけだと分かりやすいですよね。
今回は下記2つのエラー処理を加えたいと思います。
①「検索期間が空欄の場合」にメッセージを出して検索処理を中止
②「指定した期間のデータがなかった場合」に表示されるメッセージを変更

ではこれを、スクリプトでおこなってみましょう。


◇期間検索の処理

スクリプトワークスペースを開きます(メニューバーのスクリプト>スクリプトワーク)。

左上の「新規スクリプト」から、新しいスクリプトを作成します。スクリプト名は、処理内容が一目で分かるものに変更しておきましょう。
今回は「期間検索」と名付けます。

1.検索ボタンを押して、検索モードに切り替える
まず、「検索モードに切り替え」をします。「検索モードに切り替え」というステップが既に用意されているため、指定します。
その後の処理も自動化するために[一時停止]のオプションはオフにしておきましょう。

2.期限に「期間」を入力する
値の入力は「フィールド設定」というステップでおこなうことができます。
[ターゲットフィールドの指定]で、どのフィールドに対して値を設定する必要があるのか指定します。
[計算結果]で入力する値を設定します。

今回は、「期限」というフィールドに対して、「検索_開始日」と「検索_終了日」で指定された値を設定します。
そのため[ターゲットフィールドの指定]で「期限」を選択します。

計算結果に「検索_開始日」と「検索_終了日」で指定された値を設定します。

3.検索実行
検索の実行は「検索実行」というステップが用意されているため、指定します。

「指定期間で検索をする」ということはここまでのスクリプトで可能です。


◇エラー処理

では、下記2つのエラー処理を加えていきます。
①「検索期間が空欄の場合」にメッセージを出して検索処理を中止
②「指定した期間のデータがなかった場合」に表示されるメッセージを変更

処理としては
1.デフォルトのエラーメッセージを表示させないようにする
2.エラーがあった場合にメッセージを表示させる
となります。

1.デフォルトのエラーメッセージを表示させないようにする
「エラー処理」というスクリプトステップが用意されているため、先頭に追加します。
「エラー処理」を[オン]にすることで、デフォルトのメッセージを抑制することができます。

2.エラーがあった場合にメッセージを表示させる
「~の場合」という条件分岐は「If」ステップ、メッセージを出すのは「カスタムダイアログを表示」ステップを使用します。

①「検索期間が空欄の場合」にメッセージを出して処理を中止
「検索期間が空欄」というフィールドの値が空欄かどうか判断するには「IsEmpty」関数を使います。

今回、期間が空欄の場合に検索処理を中止したいので、「検索モードに切り替え」の前に「If」ステップを追加し、以下の式を指定します。
式:IsEmpty(タスク::検索_開始日)and IsEmpty(タスク::検索_終了日)

これで、「検索期間が空欄の場合」にという条件の設定はできたので「メッセージを出して処理を中止」させます。
メッセージを出すのは「カスタムダイアログを表示」、処理を中止するには「現在のスクリプト終了」のスクリプトステップを使用します。

カスタムダイアログの内容は、歯車マークから表示内容やボタンのカスタマイズができるので、”エラー”、”検索条件を入力してください。”といったタイトル・メッセージを入力します。ボタンは今回は[OK]のみで[キャンセル]は必要ないため、[キャンセル]は削除します。

「現在のスクリプト終了」というステップを入れて、検索の処理を中止します。

 

②「指定した期間のデータがなかった場合」に表示されるメッセージを変更
エラーがあったかどうかの判断は「Get(最終エラー)」関数を使用します。
「Get(最終エラー)」は、直前に実行したスクリプトステップでエラーが発生した場合にそのエラー番号を取得できます。
例えば、「指定した期間のデータがない場合」は401という値が取れます。
※他のエラーコードについても知りたい、という方はFileMaker エラーコードの一覧
がヘルプに載っていますのでご確認ください。

「検索実行」の後に「If」ステップを追加し、Get(最終エラー)を指定します。

エラーがあった場合にメッセージを表示させるため、If [Get(最終エラー) ] の下に「カスタムダイアログを表示」スクリプトステップを追加します。
カスタムダイアログの内容は、”メッセージ”、”該当するデータが見つかりませんでした。”といったタイトル・メッセージを入力します。ボタンは[OK]のみで[キャンセル]は必要ないため、[キャンセル]は削除します。

スクリプトはこれで完成なので、スクリプトを保存します(ファイル>スクリプトの保存)。

 

〇レイアウト編集(検索ボタンと検索用フィールドの設定)
画面上で期間を入力して検索を実行するために、レイアウトに検索用フィールドとボタンを配置し、作成したスクリプトを指定する必要があります。
右上の「レイアウトの編集」よりレイアウトモードに切り替えます。

検索用のフィールド「検索_開始日」と「検索_終了日」を画面の適当な箇所に配置します。

フィールドのリストが表示されない!という方は、右上にある四角に左縦線の入ったボタンをクリックすると表示されます。

画面の適当な箇所にボタンを配置します。
青枠のアイコンを選択し、レイアウト上で四角を書いて作成し、分かりやすいボタン名を付けます。
そして、「処理」から「スクリプト実行」を選択するとスクリプト一覧が表示されるため、先ほど作成したスクリプト「期限検索」を指定します。

何の期間を検索するのか分かりやすいように「期限検索」「~」といったテキストを追加してあげるとより良いかもしれません。
「T」のアイコンをクリックすると、レイアウト上でテキスト入力をすることができます。

また、以下の画像のように、データ入力時にカレンダーから選択できると便利です。

カレンダー表示の設定をするには、「検索_開始日」を選択します。その上でデータタブ(円柱のようなマーク)にあるコントロールスタイルを「ドロップダウンカレンダー」に指定します。

これで設定は完了です。右上の「レイアウトの終了」を押してレイアウトを保存しましょう。

検索を実行してください。日付が空欄の場合や指定期間のデータなければエラーが表示され、対象のデータがあればそのデータが表示されます。

いかがでしょうか。
スクリプトやグローバルフィールドを是非、ご活用ください。

この機能を実装したサンプルのダウンロードはこちら↓

samplefile_task_.zip (316KB)