FMC2Goスケジューラーの絞り込みの条件を覚える仕組み



[FileMaker Advent Calendar 2015](http://www.adventar.org/calendars/865)の24日目

# FMC2Goスケジューラーの絞り込みの条件を覚える仕組み
もう少し「Session Filter」スクリプトを見てみる

## 一番最初のブロック
![151224-01.png](https://qiita-image-store.s3.amazonaws.com/0/89027/d509948c-2325-badc-db53-e6485fc862c9.png)
このブロックでユーザーがどんな絞り込みの条件にしているかを保持、管理しているようです

以前に書いた[「FMC2Goスケジューラーにおける絞込み検索機能」のつづき](http://qiita.com/or2/items/08423025ea14936a125f)で、「Session Filter」スクリプトが呼び出されるときに絞り込み条件がスクリプト引数で渡されることは確認した
![151221-01.png](https://qiita-image-store.s3.amazonaws.com/0/89027/544c30cb-b1cd-43e4-7fc3-9805a71ba3fc.png)

それを踏まえてスクリプトを見ていく

0. ローカル変数「$param」にGet(スクリプト引数)＝絞り込み条件を入れる
1. カスタム関数「AddRemoveFromList」で処理した結果を「Utility」テーブルの「gScheduleFilter」フィールドに入れる
2. 「gScheduleFilter」フィールドに入っている絞り込み条件をValueCount関数で数える
3. 絞り込み条件の件数が0件ならすべてのレコード(セッション)を対象にしてスクリプトを終了する

ざっくりとこういう流れになっているようです

## カスタム関数「AddRemoveFromList」は何をしているか
![151224-02.png](https://qiita-image-store.s3.amazonaws.com/0/89027/5e2881c3-1874-49ec-44b7-6d9851ada0a2.png)

AddRemoveFromList

```
Case( 
ValueCount( FilterValues ( ValueList ; Value ) ) ; 
Let( 
[ValueList = ¶ & ValueList & ¶ ; 
ValueList = Substitute( ValueList ; ¶ & Value & ¶ ; ¶ );
ValueList = Middle ( ValueList ; 2 ; Length(ValueList) - 2 )
]
;
ValueList
);
 
If ( not IsEmpty(ValueList) ; ValueList & ¶ )  & Value

)
```

うぅーむ FileMakerにカスタム関数のデバッガが欲しい

### 簡単に流れを追ってみる
この「AddRemoveFromList」は引数が2つ

- ValueList：改行区切りテキスト(改行リスト)
- Value：今回処理したいItem

#### 初回の実行
ValueListはからっぽ
Valueには「水曜日」＝「水曜日」が押された
とする

1.FilterValues関数でValueListをValueでフィルタする

FilterValues
> 目的 
フィルタ値で指定した値のみを含むテキスト結果を、フィルタするテキストに入力されている順序で返します。
構文 
FilterValues ( フィルタするテキスト ; フィルタ値 )
引数 
フィルタするテキスト - テキスト式またはテキストフィールド
フィルタ値 - 指定されたテキスト内の保持する値

2.FilterValues関数はフィルタした結果を改行区切りテキスト(改行リスト)を返すので、ValueCount関数で数えると既にValueがValueListに含まれているかわかる

ValueCount
> 目的 
テキスト内の値の合計数を返します。
構文 
ValueCount ( テキスト )
引数 
テキスト - 任意のテキスト式またはテキストフィールド

3.今回はValueListはからっぽなので、ValueCount関数は0を返す
4.not IsEmpty(ValueList)は0になるのでValueListはValueになる

実行された結果

- ValueList：水曜日
- Value：水曜日

#### 2回目の実行
ValueListは水曜日
Valueには「金曜日」＝「金曜日」が押された
とする

初回と同様に
1.FilterValues関数でValueListをValueでフィルタする
2.今回はValueListは水曜日なので、ValueCount関数は0を返す
3.not IsEmpty(ValueList)は1になるのでValueListはValueListの末尾に改行を付加したものにValueを加えた値になる

実行された結果

- ValueList：水曜日[改行]金曜日
- Value：金曜日

#### 3回目の実行
ValueListは水曜日[改行]金曜日
Valueには「水曜日」＝「水曜日」が再び押された
とする

今までと同様に
1.FilterValues関数でValueListをValueでフィルタする
2.ただしValueListは水曜日[改行]金曜日なので、ValueCount関数は1を返す
3.ValueListの前と後ろに改行を付ける

- ValueList：[改行]水曜日[改行]金曜日[改行]
- Value：水曜日

4.ValueListの値でValueの前と後ろに改行を付けたものと一致するものを改行で置換する(Substitute関数)
※[改行]水曜日[改行]金曜日[改行で[改行]水曜日[改行]を[改行]で置換する

- ValueList：[改行]金曜日[改行]
- Value：水曜日

5.Middle関数を使って先頭と末尾の改行を取り除く
Middle
> 目的 
テキストの先頭文字位置で指定された文字から、文字数で指定された文字数分のテキストを抽出します。
構文 
Middle ( テキスト ; 先頭文字位置 ; 文字数 )
引数 
テキスト - 任意のテキスト式またはテキストフィールド
先頭文字位置 - 任意の数値式、または数値を含むフィールド
文字数 - 任意の数値式、または数値を含むフィールド

Length
> 目的 
フィールド内の文字数を返します。 これにはスペース、数字、特殊文字もすべて含まれます。
構文 
Length ( フィールド )
引数 
フィールド - 任意のテキスト、数字、日付、時刻、タイムスタンプ、またはオブジェクトのフィールド、あるいは任意のテキスト式または数値式


※Middle ( [改行]金曜日[改行] ; 2 ; Length([改行]金曜日[改行]) - 2 )

0. Length([改行]金曜日[改行])は5
0. Middle ( [改行]金曜日[改行] ; 2 ; Length([改行]金曜日[改行]) - 2 )は2文字目から5-2＝3文字取り出すので、金曜日だけ残る

実行された結果

- ValueList：金曜日
- Value：水曜日

これらによって現在指定されている絞り込み条件を「Utility」テーブルの「gScheduleFilter」フィールドで保持、管理しているようだ

また「Utility」テーブルの「gScheduleFilter」フィールドに絞り込み条件を保存しておくことによって、[FMC2Goスケジューラーにおける絞込み検索機能](http://qiita.com/or2/items/271ac5a84aaee7708a5d)で確認した各ボタンの条件付き書式が動作するようになっている

> 左側の○には
![151220-07.png](https://qiita-image-store.s3.amazonaws.com/0/89027/588bea80-ceea-ae51-c9cf-5e95b6a3e409.png)

> 右側の表示項目には
![151220-08.png](https://qiita-image-store.s3.amazonaws.com/0/89027/be066408-47a4-a8f5-049c-e5c1dd003cfa.png)

PatternCount
> 目的 
テキストに、検索テキストで指定された文字列がいくつ含まれているのかを返します。
構文 
PatternCount ( テキスト ; 検索テキスト )
引数 
テキスト - 任意のテキスト式またはテキストフィールド
検索テキスト - 任意のテキスト式、または検索する文字の集合を表すテキストフィールド


今日はここまで