ExecuteSQL 第4引数 ? の便利さ

投稿が滞っているので、少し小ネタを。

ExecuteSQL関数がver12から新設されました。計算式の指定にSQLのSELECT文で指定できるというのは非FileMaker開発者にとってはありがたいのかもしれないが、FileMakerを中心としている開発者にとってはそれよりも、従来のFileMakerの定番を超える値の取得ができるというのが最大のメリット。

その定番とは、FileMakerの常識では、グローバルフィールド以外は、このコンテキストとリレーションがつながっているTOの範囲までしか値の取得はできないことだ。( ちなみにFileMakerでは現在表示中レイアウトのテーブルオーカレンス( 以下 TO という)又は、データベース定義のフィールド内の計算式では「次のコンテキストからこの計算式を評価する」で選択するTO のことをコンテキストという。余談 : グローバルフィールドに関してはこのコンテキストとは無縁でいつでもどこでも値が取得できます。)

さて、そのExecuteSQL関数を使用するときに気をつけたいうっかりポイントが、SELECT文内に値を渡すときの形式だ。例えば

ExecuteSQL ( SELECT * FROM “TO01名” WHERE “フィールド名01” = ‘3’ ; “” ; “¶”)

はフィールド名01がフィールドタイプがテキストの時のみ有効で、フィールドタイプが数字だったらエラーとなる。同様にもしフィールドタイプが日付のときだったら、

ExecuteSQL ( SELECT * FROM “TO名” WHERE “フィールド名02” = DATE ‘2015-01-19’ ; “” ; “¶”)

という式になる。DATEという文字を入れなければならない上に、年月日の区切りを-にする必要がある (とマニュアルには書いてはあるが実際は DATE ‘2015/1/19’ でも可能) 。

これは面倒である。TO名やフィールド名はGetFieldName関数を使えば後で変更されても式を変更しなくてもいい。しかしフィールドタイプが数字からテキストに変更するということは開発途中ならあり得ること。丁寧に書こうとすると、渡す値はフィールドタイプを先に取得して条件分岐して記述する必要がでてくる。

しかしExecuteSQL関数はオプションとして第4引数以降を与えることができ、この悩みを自動的に解決してくれるというのが今回の目玉。上記の式は次のように書くとFileMakerから扱いやすい。

ExecuteSQL ( SELECT * FROM “TO01名” WHERE “フィールド名01” = ? ; “” ; “¶” ; “3” )

ExecuteSQL ( SELECT * FROM “TO01名” WHERE “フィールド名01” = ? ; “” ; “¶” ; 3 )

ExecuteSQL ( SELECT * FROM “TO01名” WHERE “フィールド名01” = ? ; “” ; “¶” ; コンテキストTO::数字フィールド )

ExecuteSQL ( SELECT * FROM “TO名” WHERE “フィールド名02” = ? ; “” ; “¶” ; Date ( 1 ; 19 ; 2015 ) )

ExecuteSQL ( SELECT * FROM “TO名” WHERE “フィールド名02” = ? ; “” ; “¶” ; “2015/01/19” )

ExecuteSQL ( SELECT * FROM “TO名” WHERE “フィールド名02” = ? ; “” ; “¶” ; コンテキストTO::日付フィールド  )

要は文中の値の指定に?クエスチョンマークを入れ、第4引数に値を与える。フィールドタイプを意識しなくても、また変換しなくても、FileMaker的な与え方で式を完成させることが出来ます。

最後に補足として、
・SELECT文内に?をいくつでも記載し、その順番や数に応じた第5、第6、~ と連続して引数を渡すことも可能です。
・結果が日付やタイムスタンプの場合は、年月日の区切りは-ハイフン区切りになっています。そのままでもFileMakerは日付として受け入れします。しかし日付を/スラッシュ文字などを目印にして抜き出すなどのテキスト関数を使っている場合は、GetAsDate関数を使っても/スラッシュ区切りに変換してくれません。ご注意ください。