はじめに
システム開発担当の「ほうがん」です。FileMakerでポータルにフィルタ機能があるのはご存じだと思います。
前回はこのポータルのフィルタ機能の代わりに多対多のリレーションシップを使って複数の都道府県を選択した場合の高速表示可能なフィルタ機能を作成しました。
今回は、数値範囲、期間範囲のポータルフィルタをリレーションシップで実現します。
1, ポータルのフィルタで数値範囲の絞込
前回と同じく、一般的な住所録(ダミーデータ5000件)のFileMakerファイルを使用します。
比較のためにポータルフィルタ機能を使って2つの数値範囲の絞込を行うポータルフィルタを作成してみます。ここで言えば、特定の年齢以上(G_年齢上限 数値グローバル)から特定の年齢以上(G_年齢下限 数値グローバル)をフィルタするポータルという事になります。
1,ポータルに住所録全レコードを表示するリレーションシップを作成します。
Utility 「G_1(数値1)」と住所録「C_1(計算値1)」でリレーションシップを作成してUtilityテーブルに全住所録データ全件を表示させるポータルを作成します。
このリレーションシップを使ってUtilityレイアウト上に住所録一覧を表示するポータルを作成します。
親側G_1(グローバルフィールド 値は1)と子側 住所録もC_1(計算フィールド 値は1)のリレーションシップなので、ポータル内に全件の住所録を表示するというポータルになります。
上部にUtilityテーブルにある「G_年齢下限」と「G_年齢上限」フィールドを置きました。ここで入力された値を使ってポータルレコードのフィルタを作成します。年齢下限のみが入力された際には、その年齢下限以上の年齢の方を表示、年齢上限のみを入力された際にはその年齢以下の方を表示とします。
レイアウトモードに戻り、フィルタ部分を作成していきます。
ポータルのダブルクリックで「ポータル設定」ダイアログを表示させ、「ポータルレコードのフィルタ」を設定します。
ポータルフィルタの設定内容は以下の通りです。
Case (
//「G_年齢下限」と「G_年齢上限」が入力されていない時 全表示
IsEmpty ( Utility::G_年齢下限 ) and IsEmpty ( Utility::G_年齢上限 ) ; 1 ;
//「G_年齢下限」のみが入力されている場合は年齢下限以上を表示
not IsEmpty ( Utility::G_年齢下限 ) and IsEmpty ( Utility::G_年齢上限 ) and
Utility::G_年齢下限 ≤ Utility_住所録::年齢 ; 1 ;
//「G_年齢上限」のみが入力されている場合は年齢上限以下を表示
IsEmpty ( Utility::G_年齢下限 ) and not IsEmpty ( Utility::G_年齢上限 ) and
Utility::G_年齢上限 ≥ Utility_住所録::年齢 ; 1 ;
//「G_年齢下限」「G_年齢上限」両方が入力されている場合は年齢下限以上、年齢上限以下を表示
Utility::G_年齢下限 ≤ Utility_住所録::年齢 and Utility::G_年齢上限 ≥ Utility_住所録::年齢
)
この式は、
「G_年齢下限」「G_年齢上限」共に値が入っていなければ、全レコードを表示する
「G_年齢下限」のみに値が入っていればその年齢以上の方のみ表示する
「G_年齢上限」のみに値が入っていればその年齢以下の方のみ表示する
「G_年齢下限」「G_年齢上限」共に値が入っていればその年齢下限以上、年齢上限年齢以下の方を表示する
となっています。
前回も説明しましたが、このポータルフィルタ設定だけではポータルフィルタは自動的に更新されません。
● フィルタを設定するポータルに名前を付ける。
● スクリプトで該当ポータルの「ポータルの更新」処理を行う
が必要です。
まず、ポータルをクリックして名前を付けます。
ポータルが選択された状態で「位置タブ」の「名前」に同レイアウトで他のオブジェクトと被らない名称を入力します。今回は「住所録一覧」としました。
※この「ポータル」の「名前」はレイアウトごとに単一であれば良いので、他のレイアウトで同名称があっても問題ありません
次にポータル更新用のトリガスクリプトを作成します。
スクリプト名「住所禄一覧更新」
1, ウインドウの固定
2, ポータルの更新[オブジェクト名 : “住所録一覧”]
レイアウト上の「G_年齢下限」と「G_年齢下限」の値が変更された際にポータルを更新したいので、レイアウト上の「G_年齢下限」と「G_年齢下限」のスクリプトトリガに作成したスクリプトを割り当てます。
これで準備完了です。動作を確認してみます。
ブラウズモードに戻ります。「G_年齢下限」「G_年齢上限」が共に空ですので、住所録一覧が全5,000件表示されます。
では、このポータルフィルタ機能を確かめるために上部の「G_年齢下限」に「40」を入力してみます。
年齢が40歳以上の方を表示するという動作です。
40歳以上の方がフィルタされ対象数が3,323件なりました。
次に「G_年齢上限」にも「45」と入力します。
年齢下限、年齢上限ともに入力されたので、年齢40~45の範囲の方を表示させる動作です。
40~45の年齢の範囲の方だけが表示され、対象が522件となりました。
今度は「G_年齢下限」を空白にします。
年齢上限以下のみに値がありますので45歳以下が表示される動作です。
これで45歳以下の方が表示され2,199件となりました。
対象期間のポータルフィルタ
年月日を対象とした期間のフィルタ機能も同様に作成できます。生年月日を期間でフィルタする機能を想定します。Utilityに生年月日下限「G_生年月日下限 日付グローバル」と生年月日上限「G_生年月日上限 日付グローバル」を追加して、「G_生年月日下限以上」、「G_生年月日上限以下、G_生年月日下限以上の期間」と「G_生年月日上限以下」の3条件でフィルタを作成します。
数値範囲と考え方は同じですので、ポータルフィルタ条件だけ記載します。
ポータルフィルタ内容
Case (
//「G_生年月日下限」と「G_生年月日上限」が入力されていない時 全表示
IsEmpty ( Utility::G_生年月日下限 ) and IsEmpty ( Utility::G_生年月日上限 ) ; 1 ;
//「G_生年月日下限」のみが入力されている場合は生年月日下限以上を表示
not IsEmpty ( Utility::G_生年月日下限 ) and IsEmpty ( Utility::G_生年月日上限 ) and
Utility::G_生年月日下限 ≤ Utility_住所録::生年月日 ; 1 ;
//「G_生年月日上限」のみが入力されている場合は生年月日上限以下を表示
IsEmpty ( Utility::G_生年月日下限 ) and not IsEmpty ( Utility::G_生年月日上限 ) and
Utility::G_生年月日上限 ≥ Utility_住所録::生年月日 ; 1 ;
//「G_生年月日下限」「G_生年月日上限」両方が入力されている場合は生年月日下限以上、生年月日上限以下を表示
Utility::G_生年月日下限 ≤ Utility_住所録::生年月日 and
Utility::G_生年月日上限 ≥ Utility_住所録::生年月日
)
こちらを設定して、「G_生年月日下限」と「G_生年月日上限」に先ほど作成したスクリプト「住所禄一覧更新」をトリガとし、対象ポータルを更新する事で以下の様に目的のポータルフィルタ機能が実現できます。
※今回作成したデモファイルは自由にダウンロードいただけるようにしています。アクセス制限は掛けていませんので、ファイルをダウンロードいただければ内部の詳細な設定など自由にご覧いただけます。
2,リレーションシップを用いた数値範囲のフィルタ機能
それではリレーションシップを用いて数値範囲ポータルフィルタと同等機能を実装します。
このフィルタ機能のために追加で3つのリレーションシップを設定します。
● Utilityの「G_年齢下限」と住所録の「年齢」をリレーションシップ( <= )で繋ぎます。
● Utilityの「G_年齢下限」と住所録の「年齢」をリレーションシップ( <= )と
Utilityの「G_年齢上限」と住所録の「年齢」をリレーションシップ( >= )で繋ぎます。
● Utilityの「G_年齢上限」と住所録の「年齢」をリレーションシップ( >= )で繋ぎます。
次の図の「Utility_住所録#リレーション年齢下限以上」「Utility_住所録#リレーション年齢範囲」「Utility_住所録#リレーション年齢下限以上」が上記のそれぞれのテーブルオカレンスで、各条件でフィルタするポータル部分という事になります。
このリレーションシップを利用して年齢範囲ポータルフィルタと同様の画面を作成します。
一旦動作が分かりやすいように、1画面に以下の様に4つのポータルを配置し、それぞれのポータルごとに該当フィールドを配置します。また、各ポータルには「名前」を付けておきます。
「全レコード表示(Utility_住所録)」 名前: 住所録一覧1
「G_年齢下限以上(Utility_住所録#リレーション年齢下限以上)」 名前: 住所録一覧2
「G_年齢範囲(Utility_住所録#リレーション®年齢範囲 )」 名前: 住所録一覧3
「G_年齢下限以下(Utility_住所録#リレーション年齢上限以下)」 名前: 住所録一覧4
を作成して、
この4つのポータル表示を「次の場合にオブジェクトを隠す」で年齢の下限上限の入力の状態に応じて隠してポータルフィルタと同様の画面にすれば完成となります。
それぞれのポータルの「次の場合にオブジェクトを隠す」の式は以下の通りです。
「全レコード表示(Utility_住所録)」(G_年齢下限とG_年齢上限が空白)
not ( IsEmpty ( Utility::G_年齢下限 ) and IsEmpty ( Utility::G_年齢上限 ) )
「G_年齢下限以上(Utility_住所録#リレーション年齢下限以上)」(G_年齢下限のみ値あり)
IsEmpty ( Utility::G_年齢下限 ) and not IsEmpty ( Utility::G_年齢上限 )
or
( IsEmpty ( Utility::G_年齢下限 ) and IsEmpty ( Utility::G_年齢上限 ) )
or
(not IsEmpty ( Utility::G_年齢下限 ) and not IsEmpty ( Utility::G_年齢上限 ) )
「G_年齢範囲(Utility_住所録#リレーション®年齢範囲 )」(G_年齢下限とG_年齢上限に値あり)
IsEmpty ( Utility::G_年齢下限 ) or IsEmpty ( Utility::G_年齢上限 )
「G_年齢下限以下(Utility_住所録#リレーション年齢上限以下)」(G_年齢上限のみ値あり)
( not ( IsEmpty ( Utility::G_年齢下限 ) ) and IsEmpty ( Utility::G_年齢上限 ) )
or
( IsEmpty ( Utility::G_年齢下限 ) and IsEmpty ( Utility::G_年齢上限 ) )
or
(not IsEmpty ( Utility::G_年齢下限 ) and not IsEmpty ( Utility::G_年齢上限 ) )
と設定します。
ブラウズモードに変更して、オブジェクトを隠すが機能するか確認します。
年齢下限に50、年齢上限に60を入れるとそれぞれのポータルに目的のフィルタ状態が成立しているのが確認できます。
この4つのポータルをまったく同じ位置に配置すれば、目的のポータルフィルタ機能のリレーションシップ代替機能が完成します。
リレーションシップを使った期間指定フィルタ
同じ手順で、リレーションシップを利用して生年月日を対象とした期間指定のフィルタ機能を作成します。
リレーションシップは以下の通りです。
他も同じように設定してリレーションシップのフィルタ機能を作成します。
こちらがリレーションシップを利用した期間指定フィルタの完成画面です。詳細はデモファイルを参照ください。
まとめ
前回も記載しましたが、ポータルに表示させるレコード数が多くなるとポータルフィルタ機能で表示させた場合に表示速度が低下していきます。大量のポータルレコードに対してフィルタ表示させる必要があるなら、その速度低下の対策として、今回紹介しましたリレーションシップを使用したフィルタは非常に有効です。
※前回の都道府県のポータルフィルタ、リレーションシップを利用した複数都道府県の選択フィルタ、今回作成したポータルフィルタ機能とリレーションシップフィルタ機能をまとめた簡易デモファイルを置いておきます。以下のリンクから自由にダウンロードいただけます。
前の記事へ → FileMaker リレーションシップを用いたポータルフィルタ1