改行区切りテキスト(改行リスト)を取得する仕組み


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

# 改行区切りテキスト(改行リスト)を取得する仕組み
### 改行区切りテキスト(改行リスト)とは？
単に改行で区切られたひとかたまりのテキストなんですが、FileMakerを使いこなしていく中で大きな役割をもっています
例えばこんなの
![151223-01.png](https://qiita-image-store.s3.amazonaws.com/0/89027/50a4ce26-2870-e380-5beb-1aec0ca1b9a4.png)
フィールドの中で改行して複数の値を入れたら、もうそれは改行区切りテキスト(改行リスト)として使えます

ちなみにスクリプトの中では
![151223-02.png](https://qiita-image-store.s3.amazonaws.com/0/89027/9fd7260a-6cb4-585a-c31d-7f0667abe879.png)
のようにすると
![151223-03.png](https://qiita-image-store.s3.amazonaws.com/0/89027/94ec3b66-2604-6c42-c81b-4a3563110747.png)
こうなります

昨日[[関連レコードへ移動] スクリプトステップについて書いてみる](http://qiita.com/or2/items/db0f483b7096d6496dc9)で、フィールドの中で改行して複数の値＝改行区切りテキスト(改行リスト)を入れたら対象レコードの絞り込みに使えることに触れました

ということは改行区切りテキスト(改行リスト)どうにかすると便利に使えるということです

### 改行区切りテキスト(改行リスト)を扱える関数
改行区切りテキスト(改行リスト)を扱える関数で一番使いどころがあるのがGetValue関数です

GetValue
> 目的 
値一覧にある値番号により与えられる要求された値を返します。
構文 
GetValue ( 値一覧 ; 値番号 )
引数 
値一覧 - 改行で区切られた値の一覧
値番号 - 一覧から返される値

ここでは改行区切りテキスト(改行リスト)を値一覧と呼んでますね
あとValueCount関数でしょうか

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

他にもいろいろとあるのでしょうが..

## 引き続き「Session Filter」スクリプトを見ていく
### 次のブロックを見てみる
[「FMC2Goスケジューラーにおける絞込み検索機能」のつづき](http://qiita.com/or2/items/08423025ea14936a125f)から引き続いてスクリプトを見てみる

![151223-04.png](https://qiita-image-store.s3.amazonaws.com/0/89027/fd1f371d-9fcf-c1de-b945-205ff022ee03.png)
いきなり見慣れない関数「ExecuteSQL」が出てきました

ExecuteSQL
> 目的 
指定したテーブルオカレンスに対する SQL クエリーステートメントを FileMaker Pro データベース内で実行します。
構文 
ExecuteSQL ( SQL クエリー; フィールド区切り; 行区切り { ; 引数... } )
引数 
SQL クエリー - SQL クエリーステートメント。ステートメントには、２つのクエリーの結果を組み合わせた Union 句を含むことができます。ステートメントには、オプションの引数がクエリーのどこで使用されるかを示す、プログラムに基づいて生成された SQL（ダイナミックパラメータ）を含むことができます。ダイナミックパラメータを指定する場合は疑問符（?）を使用します。
フィールド区切り - 計算結果のフィールド間の区切りとして使用される文字列。空の文字列が指定されると、区切りはコンマになります。フィールド区切りは、計算結果の最終フィールドの後には表示されません。
行区切り - 計算結果の中のレコード間の区切りとして使用される文字列。空の文字列が指定されると、区切りは改行になります。行区切りは、計算結果の最終行の後には表示されません。
引数- クエリーステートメントのダイナミックパラメータの値として評価、使用される式。
戻り値のデータタイプ 
テキスト

いきなり
> 行区切り - 計算結果の中のレコード間の区切りとして使用される文字列。空の文字列が指定されると、区切りは改行になります。行区切りは、計算結果の最終行の後には表示されません。

で**空の文字列が指定されると、区切りは改行になります。**って書かれています

ということはExecuteSQL関数は、デフォルトで**改行区切りテキスト(改行リスト)が取ってこれる関数**になっているようです

#### SQLとは
詳しくは
[SQL - ウィキペディア](https://ja.wikipedia.org/wiki/SQL)
を参照

GUIでデータベース問い合わせを行わないデータベースシステムでは、一般的にSQLという問い合わせ言語を使って問い合わせの内容を書きます
GUIでデータベース問い合わせを行うものであっても、GUI操作の結果SQL文(SQLで書いた問い合わせの内容)を生成して実行しているものも多いです

ExecuteSQL関数は、FileMakerの外の世界では極一般的なやり方をFileMaker(12から)でも一部(簡単な問い合わせのみ)扱えるようにしたものです

### 「Session Filter」スクリプトのExecuteSQLを見てみる
このブロックでは

```
ExecuteSQL ( "Select \"__kp_Schedule_ID\" from Schedule" & $where ; "" ; "" )
```

なSQL問い合わせをしています
3つめの引数(行区切り)で""(空の文字列)が指定されているので、結果は改行区切りテキスト(改行リスト)で返ってきます

例えば「曜日」の「木曜日」を押した時、このブロックの中で使用されている各々の変数には

- $IDs：問い合わせに該当するセッションIDが入る→該当するセッションIDの改行区切りテキスト(改行リスト)→[関連レコードへ移動] スクリプトステップで対象レコードを絞り込むための元ネタ
![151223-05.png](https://qiita-image-store.s3.amazonaws.com/0/89027/9e2fcf68-b363-6c2b-c147-d0df038f5ac2.png)


- $where：SQLのwhere句という抽出条件を指定するものが入っている

```
 where Date_DayName in ('木曜日')
```

- $$IDs：今回問い合わせに使用したSQL文が入っている

```
Select "__kp_Schedule_ID" from Schedule where Date_DayName in ('木曜日')
```

### まとめ
今まで見てきた「Session Filter」スクリプトでは
- [関連レコードへ移動] スクリプトステップで対象レコードを絞り込みたい

ために
- 条件に該当するセッションIDを改行区切りテキスト(改行リスト)で取ってきたい

ために
- ExecuteSQLでデータベースへの問い合わせを行う

という流れになっているようです