the missing filemaker 12 executesql reference...the missing filemaker 12 executesql reference...

31
The Missing FileMaker 12 ExecuteSQL Reference The Missing FileMaker 12 ExecuteSQL Reference 19 OCT 2012 Beverly Voth Japanese translation by Naomi Fujimoto (JAN 2014) 1

Upload: others

Post on 26-Mar-2020

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 2: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

FMP12のExecuteSQL()はSELECTのみテーブル内のすべてを表示するテーブルの特定のフィールドを検索するORDER BY = ExecuteSQLを使ったソートSELECT文での結合と計算

SELECT演算子文字列リテラルを追加する

SQL関数を使用するSystem関数DateTime関数変換関数文字列関数集計関数数学関数

SQL論理関数ExecuteSQLメタ関数

検索条件はWHERE句に入れる比較演算子特別な比較演算子

ワイルドカードでLIKEを使うWHERE ... IN ( { SELECT ... } )

サブクエリSELECT DISTINCTHAVINGは集計フィールド用の特別なWHERE

JOINとUNION暗黙のJOINデカルト結合内部結合外部結合UNION

ティップス、参考情報、リソースFileMaker公式サイト一般的なSQLチュートリアルExecuteSQL関連のブログと記事役に立つデータベースとカスタム関数FileMaker SQLプラグインティップス

トラブルシューティング

2

Page 3: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い方に対する質問が多くあるようです。このチュートリアルでは、SQL文を初めて書く人のためにSQLの用語を解説します。ExecuteSQLのクエリの書き方についてはすでに多くの例があるので、この記事の最後にリンクをまとめました。用語の説明が不要な場合は、直接サンプルデータベースのセクションに進んでください。クエリを作成したり動作を試したりするためのソリューションへのリンクがあります。

この記事はSQLの包括的なガイドではありません。他のデータベースは違う文法を使用します。この記事は、FileMakerとSQLに関する包括的なガイドでもありません。FileMakerはODBCソースにもなりえますが、そこで使われるSQLクエリはExecuteSQL()で使用される用語とは異なります。「インポート」、「SQLを実行」などのスクリプトステップやExecuteSQL()関数やESSを使う場合、この記事はFileMakerのESSでSQL呼び出しを使用するための完全なガイドではありません。その他のデータソースとの接続に必要なすべての情報をカバーしていません。この記事は、待ち望まれていたExecuteSQL()関数のリファレンスです。

FileMaker 12 ODBC/JDBCガイドは便利ですが、ExecuteSQL()関数に関連のない使用方法も含まれています。この記事では、リファレンスと実際の機能の違いについてもできる限り示しています。

ExecuteSQL関数の概要を知るためには、まずFM12のヘルプトピックのExecuteSQLの項を参照してください。ExecuteSQL(SQLクエリ文; フィールド区切り; 行区切り {;引数…})という関数に「?」という引数を使用してクエリ文にパラメータが渡されます。「?」はSELECT文のどの部分でも使えますが、一般的にはWHERE句で検索条件を渡すために使われます。

3

Page 4: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

FMP12のExecuteSQL()はSELECTのみ

現時点では、FileMaker 12のExecuteSQL関数を利用してSQL句のSELECTで、区切り文字で区切られた結果をフィールドか変数に返すことができます。(その時にオプションで以下の機能を利用できます。)

● 検索[find] (条件をつけることも可)● 定数と文字列リテラルを使用(結果として、あるいは比較条件として)● 文字列の結合[concatenate]、計算、集計(結果として)● 並び替え(結果として、複数のフィールド/カラムにより)● テーブルの結合[join] (結果として、(自己結合を含む)一時的なリレーションを生成する)● 表の統合[union] (複数の表からのSELECTの結果を積み上げる)● 結果をグループ化する

ODBCとJDBCガイド, 36ページ「第7章 サポートされている標準」に以下の用語が定義されています。

SELECT [DISTINCT] {* | 列式 [[AS] 列エイリアス ],...} フィールド、定数、計算、関数を用いますFROM テーブル名 [ テーブルエイリアス ], ... [ JOIN table_name ON matches ] テーブルあるいは明示的なリレーションのリスト[ WHERE 式 1 リレーショナル演算子 式 2 ] ANDとORを用いた比較 LIKE、IN、BETWEEN..ANDを用いた比較 INの後ろにネストされたSELECTを含むことができる[ GROUP BY { 列式 , ...} ] 集計関数にないすべてのフィールドを指定する[ HAVING 式 1 リレーショナル演算子 式 2 ] 集計関数を用いた比較[ UNION [ALL] (SELECT...) ] それぞれのSELECTは同じ列数を返さなくてはいけない[ ORDER BY { 列式 [DESC | ASC]}, ...] カンマ区切りのソート順リスト

テーブル内のすべてを表示する

もっとも基本的な構文では、SQLのSELECT文は一つのテーブルからすべてのカラム(フィールド)を検索します:

SELECT * FROM mytable

検索する対象(SELECT *)とテーブル(FROM «mytable»)を指定します。ExecuteSQLのクエリにはリレーションシップグラフで定義されたテーブルオカレンス(T.O.)を使用しますが、それらはあたかも元のテーブルが選択されたかのように振る舞います。リレーションやコンテキ

4

Page 5: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

ストによって対象レコードが絞り込まれることはありません。テーブルオカレンスは、ExecuteSQLが実行されるファイルのリレーションシップグラフの中に存在している必要があり、データソースが不明なまま検索を行なうことはできません。何らかの結果を返すためには、テーブルに1件以上のレコードが存在している必要があります。

注: リレーションシップグラフ上のFileMakerのテーブルオカレンスとExternal SQL Sources (ESS)のテーブルオカレンスは区別なく扱われます。ただし、SQL関数の中には期待通りに動作しないものがあります。

ExecuteSQLが結果を返すために、レイアウトやリレーションシップは必須ではありません。検索条件を指定するためにフィールドを使用する場合、「計算式の指定」のダイアログで目的のフィールドが表示されるレイアウト上にいる必要があります。ExecuteSQL関数では“該当レコード”は使用しません。全レコードに対して(与えられたアクセス権にしたがって)検索を実行することができます。

“*”(アスタリスク)は“すべてのフィールド/カラム”を意味し、ここではWHERE句を使用していないので、指定されたテーブルオカレンスから全レコードの全フィールドが返されます。

ExecuteSQL ( " SELECT * FROM mytable " ; "" ; "" ) // デフォルトの区切り文字を使用

テーブルオカレンス名にスペースなどの特別な文字(訳注:日本語の2バイト文字を含む)を使用していてエラーが返される場合には、ダブルクォート(")で囲みます。

ExecuteSQL ( " SELECT * FROM \"my table\" " ; "" ; "" )

SQLのテーブルとカラムの名称は大文字・小文字を区別しません。“MyTable”は“my table”と同じです。SQL文のコマンドも大文字と小文字が区別されません。 ”SELECT * FROM ”は”select * from “と同じです。私自身は、SQLのキーワードには大文字を使用して、スクリプトや計算の中で見分けやすいようにしています。

テーブルの特定のフィールドを検索する

フィールド名を指定して、返される検索結果をそれらに限定します。レイアウトは使われないので、テーブルオカレンスのすべてのフィールドを使用することができます。スペースや2バイト文字(訳注:日本語の2バイト文字を含む)などエラーを返す特別な文字を使用している場合は、フィールド名をダブルクォートで囲みます。フィールド名に予約語を使用している場合もダブルクォートで囲む必要があります。

5

Page 6: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

ExecuteSQL ( " SELECT FirstName, LastName, State, Zipcode FROM myContacts " ; "" ; "" )

ExecuteSQL ( " SELECT \"First Name\", \"Last Name\", State, Zipcode FROM myContacts " ; "" ; "" ) // フィールド名にスペースが含まれている場合

ExecuteSQL ( " SELECT \"date\", amount FROM sales WHERE \"date\" >= '2012-01-01' AND amount > 500 " ; "" ; "" ) // dateは予約語

フィールド名やテーブル名の変更によってSQLクエリが動作しなくなるのを防ぐ方法が参考情報に記載されています。"Robust Coding"のブログ記事やカスタム関数は、クエリを”動的”に書く上でのヒントになるでしょう。

ORDER BY = ExecuteSQLを使ったソート

コンタクト情報のリストができあがりました。さて、ソートをすることは可能でしょうか? はい、SQLではORDER BY句がソートのためのしくみです。フィールド/カラムをカンマ区切りで並べてソート順を指定します。オプションでDESCを付ければ降順にソートされます。ASC(昇順)はデフォルトのため特に指定する必要はありません。ORDER BYは常にSQL文の最後に来るということを覚えておいてください。

次の例ではLastNameフィールドを降順でソートし、次にFirstNameフィールドを(デフォルトのASC昇順で)ソートします。FileMakerのソートダイアログでも同じような方法でソート順を指定します。

ExecuteSQL ( " SELECT FirstName, LastName, State, Zip FROM myContacts ORDER BY LastName DESC, FirstName " ; "" ; "" )

6

Page 7: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

SELECT文での結合と計算

‘フィールド+(カンマ/タブ)+フィールド’という通常の形式以外で結果を返すことができれば、いろいろと便利な場合があります。結合[concatenation]は、複数のフィールドを結合して一つのカラムにします。ExecuteSQLで使用されるクエリでは、“+”あるいは“||”を利用することができます。調べた結果、“||” (パイプ2本) はすべての場合で動作しましたが、“+”では特殊な動きをするケースがありました。

/* "+"で結合するテスト */

Let ( [ $query = " SELECT LastName+', '+FirstName FROM myContacts WHERE LastName LIKE ? AND FirstName LIKE ? "

; $result = ExecuteSQL ( $query ; "" ; "" ; "Ab%" ; "A%" )

]; $result) // SUCCESS: Abanour, Alyce

7

Page 8: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

/* 結合し、フィールドの間に改行を置く */

Let ( [ $query = " SELECT FirstName + ' ' + LastName , Address , City + ', ' + State + ' ' + Zip , '---' FROM myContacts WHERE LastName LIKE ? AND FirstName LIKE ? ORDER BY state, zip "

; $result = ExecuteSQL ( $query ; Char(13) ; Char(13) ; "Ab%" ; "A%" )

]; $result) // SUCCESS - ラベル用にフォーマット

/*Alden Abee1301 Century CirWasilla, AK 99654---Asa AbriolaGarden Oaks ShoppingCamden, AR 71701---Ambrose Abrego220 W 5th StHope, AR 71801---*/

8

Page 9: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

/* "||"で結合するテスト */

Let ( [ $query = " SELECT LastName||', '||FirstName FROM myContacts WHERE LastName LIKE ? AND FirstName LIKE ? "

; $result = ExecuteSQL ( $query ; "" ; "" ; "Ab%" ; "A%" )

]; $result) // SUCCESS: Abanour, Alyce

カラムで計算を実行し、結果が別名の新規のカラムに返されます。

/* qty x price を計算する - 注: 4つのカラムが返される */

Let ( [ $query = " SELECT productID , qty , price , qty*price AS extendedPrice FROM lineItems WHERE orderID = ? "

; $result = ExecuteSQL ( $query ; char(9) ; "" ; orders::orderID )

]; $result) // no example in sample database

SELECT演算子ExecuteSQL()では以下の演算子を利用できます。数学的エラー(ゼロによる除算など)はExecuteSQL()では無効です。また当然のことですが、これらの演算子は数値を返すフィールド/カラムで使用するためのものです。

9

Page 10: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

+ 加算 (文字列の結合と混同しないよう注意)- 引算* 乗算/ 除算% 剰余 (LIKEワイルドカードと混同しないよう注意)() 意味を明確にするためにカッコを使うことができる

文字列リテラルを追加する

上の例の結合テストにおけるスペースは文字列リテラルを使用しています。文字列はすべてシングルクォートに入れます。数値はクオートで囲む必要はありません。定数は文字列リテラルのもう一つの形式で、WHERE句の検索条件で使用されます。SQL関数もクエリに含むことができます。

/* 文字列リテラルのテスト */

Let ( [ $query = "SELECT 'ABC123-' || zip || ' ' AS lit_text, 123, CURRENT_DATE AS cur_date FROM myContacts WHERE State = ? ORDER BY zip DESC "

; $result = ExecuteSQL ( $query ; Char(9) ; "" ; "WA" )

]; $result) // SUCCESS

10

Page 11: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

SQL関数を使用する

System関数SQLではクエリに関数を利用できます。各種のSQLデータベースはそれぞれ独自の関数群を持っています。最後の例のクエリには、System関数の“CURRENT_DATE”が含まれていて、“YYYY-MM-DD”形式の日付が返されます。ExecuteSQLで利用できるその他のSystem関数には以下があります。

● CURRENT_TIME = "hh:mm:ss" (24時間表記)● CURRENT_TIMESTAMP = "YYYY-MM-DD hh:mm:ss" (24時間表記)● CURRENT_USER = FileMakerのGet ( AccountName )関数と同じ値を返します。

(USERとUSERNAMEも同じ値を返します)

DateTime関数Date、Timeの各関数はExecuteSQL()で利用でき、上記のSystem関数あるいは日付フィールドや正しい形式で記述されたDate/Timeテキスト(シングルクォートの'YYYY-MM-DDhh:mm:ss'形式)と共に使用されます。

COALESCE(日付,’’) Date +/- (加算, 除算) 日数 DATE()CURDATE CURTIME CURTIMESTAMPMONTHNAME() DAYNAME() DAYOFWEEK()MONTH() DAY() YEAR()HOUR() MINUTE() SECOND()STRVAL() TIME() TODAYEXTRACT(part FROM..)

/*指定されたフィールドを基準にして重複を取り除いて、日付フィールドから年の部分のみを抽出する*/

Let ( [ $query = " SELECT DISTINCT YEAR(s.\"date\") FROM sales_related_sales AS s WHERE s.amount > ? ORDER BY s.amount DESC "

; $result = ExecuteSQL ( $query ; "" ; "" ; 450 )

]; $result)

DAYNAME() は“Monday”、“Tuesday”などを返し、DAYOFWEEK() は数値(Sunday = 1)を返します。COALESCE(), STRVAL(), NUMVAL()の変換関数で日付をフォーマットできます。日付に対し加算・除算を行なうことができます(+/- 日数)。

11

Page 12: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

変換関数CAST()はフィールドのデータ型を変換するためのSQL関数です。例えば数字型を文字列型に変換する場合は CAST(m.number AS VARCHAR) とします。「ODBCとJDBCガイド」の第8章 「FileMakerフィールドタイプのODBCデータタイプへのマッピング」を参照してください。

テキスト型 数字型 日付型 時刻型 タイムスタンプVARCHAR DOUBLE DATE TIME TIMESTAMP

COALESCE(), STRVAL(), NUMVAL() は、他の関数と合わせて使用される場合に違う型の値を返すため、型変換関数とみなすことができます。COALESCEを日付、時間、タイムスタンプと共に使用すると、yyyy-mm-dd hh:mm:ss形式ではなく、mm/dd/yyyy h:mm:ss Aを返します。カンマとシングルクォート2つ(,’’)を関数に含めるのを忘れないよう注意してください。

STRVAL(CURRENT_TIMESTAMP)は、COALESCE()を日付フィールドとSQL日時関数を合わせて使用した場合と同じ結果を返すようです。STRVALを数字に対して使用した場合にテキストを返しますが、ExecuteSQL()が元々テキストを返すのでこれは冗長です。

NUMVAL()は日付を日数に変換します。これはFileMaker関数のGetAsNumber(Get(CurrentDate))に似ています。時間の場合はNUMVAL()が秒数に変換します。これはFileMaker関数のGetAsNumber(Get(CurrentTime))に対応します。NUMVAL('数値を表す文字列')は数値を返します。

文字列関数LOWERやUPPERなどの文字列関数は、WHERE句のLIKEで比較評価に利用するためにフィールド内の文字の大文字・小文字を入れ替える場合などに便利です。比較は大文字・小文字を区別するため、 ” LIKE ‘A%’”の検索は大文字の“A”で始まるカラム/フィールドのみを返します。“a”で始まるフィールドは結果に含まれません。文字列関数は、SELECT句の中で結果の大文字・小文字の変換にも利用されます。

/* upperとlowerのテスト */

Let ( [ $query = " SELECT LOWER(FirstName), LastName FROM myContacts WHERE UPPER(LastName) LIKE ? "

; $result = ExecuteSQL ( $query ; Char(9) ; "" ; "AA%" )

]; $result) // SUCCESS - christen Aalund

12

Page 13: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

/* LOWER()のテスト */

Let ( [ $query = " SELECT LOWER(lastname+', '+firstname) FROM mycontacts WHERE lastname LIKE ? AND firstname LIKE ? "

; $result = ExecuteSQL ( $query ; "" ; "" ; "Ab%" ; "A%" )

]; $result) // SUCCESS: abbott, ashley

この記事のためにテストできなかったSQLの文字列関数が多くあります。いくつかの文字列関数はテストしましたが期待通りに動作しませんでした。SQLの文字列関数の中で、ExecuteSQLで正しく動作したものは以下の通りです:

CHR() COALESCE() LEFT() LENGTH() LOWER()LTRIM() MID() RIGHT() RTRIM() SPACE()SUBSTR() SUBSTRING() TRIM() UPPER()

/* SUBSTRING()のテストこの関数はFileMakerのMiddle()関数に対応する */

Let ( [ $query = " SELECT SUBSTRING(lastname,1,4), firstname FROM mycontacts WHERE lastname LIKE ? AND firstname LIKE ? "

; $result = ExecuteSQL ( $query ; "" ; "" ; "Ab%" ; "A%" )

]; $result) // SUCCESS

COALESCE()は特別な文字列関数で、NULLおよび結合されたテキストを返す代わりに、結合用文字列を取り除きます。COALESCE()関数は、最初のNULLではない引数のコピーを返すか、すべての引数がNULLの場合はNULLを返します。少なくとも2つ以上の引数をとります。以下の例でLastNameがNULL(空)の場合、FirstNameだけが返されます。

COALESCE( Lastname || ’, ‘,’’ ) || FirstName

13

Page 14: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

集計関数ExecuteSQLで利用できる集計SQL関数は、FileMakerの集計フィールドと同じ結果を返します。フィールドが(集計関数で使われる以外で)結果として返される場合、クエリでGROUP BY句を使用してその他のフィールドを指定します。

AVG() カラムの平均値を計算するCOUNT() NULLではないフィールドで指定された行を数えますCOUNT(*) 指定されたフィールドですべての行を数えますMIN() 列の最小値を検索しますMAX() 列の最大値を検索しますSUM() 列の値の合計を計算しますSTDEV() 全ての値の統計的標準偏差STDEVP() 全ての値の母標準偏差

/*SQL SUM関数 - 他のフィールドが指定された場合、それらがGROUP BY句の中に列挙されている必要がある。集計結果を比較する場合、集計関数もHAVING句で使用される。SUMは合計を返し、カラムに別名が設定されソートで使用される*/

Let ( [ $query = " SELECT '#'||s.salespersonID , SUM( s.amount ) AS sum_amount FROM sales_related_sales AS s GROUP BY s.salespersonID ORDER BY sum_amount DESC "

; $result = ExecuteSQL( $query ; ", "; "" )

]; $result) // SUCCESS

数学関数ExecuteSQLで動作しない可能性のあるSQL 数学関数(この記事用にテストを実施):

ABS() √ ASIN() X ATAN() √ ATN2() XCEILING() √ COS() √ COT() X DEGREES() √EXP() √ FLOOR() √ LOG() √ LOG10() XPI() √ POWER() X RADIANS() √ RAND() XROUND() √ SIGN() √ SIN() √ SQRT() √TAN() √ CEIL() √ LOG2() X TRUNCATE() X

14

Page 15: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

/* SQL関数のROUND(数値,小数点の場所)エラーを返さないが、結果の数字の形式が変換されない*/

Let ( [ $query = " SELECT s.\"date\", ROUND(s.amount,2) AS amt_fmt FROM sales_related_sales AS s WHERE s.salespersonID = ? AND s.amount >= ? ORDER BY s.amount DESC "

; $header = "date" & char(9) & "amount¶"

; $result = TextStyleAdd($header;Bold) & ExecuteSQL ( $query ; char(9) ; "" ; salesperson::salespersonID ; 100 )

]; $result)// 小数点以下2桁で四捨五入されないが、エラーにもならない

SQL論理関数

SQL関数のCASEは、FileMakerのCase()関数と同じく、複数の評価に基づいて結果を返し、オプションとしてデフォルト値を指定できます。ExecuteSQLで使われるSQL CASE関数には2つの書き方があります。

1. 単純CASE式 - inputに式が入り、その結果の値がWHENで評価されます。

CASE input WHEN value1 THEN result1 { WHEN value2 THEN result2 } { ... } { ELSE result3 }END

2. 検索CASE式 - それぞれの評価式に違う内容を設定できます。

CASE WHEN expr1 THEN result1 { WHEN expr2 THEN result2 } { ... } { ELSE result3 }END

15

Page 16: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

一部のSQLシステムで利用されるその他の論理関数として、IIF [あるいはIF] と CHOOSEがあります。どちらもExecuteSQL()では動作しないので、サンプルでは代わりにCASEを利用する方法を示しています。

/*CASEは動作し、IIFとIFは動作しない..*/

Let ( [ $query = " SELECT p.name, CASE WHEN p.salespersonID > 3 THEN 'x' ELSE 'o' END, p.salespersonID FROM salesperson AS p "

; $result = ExecuteSQL ( $query ; ", " ; "" )

]; $result) // SUCCESS

/*CHOOSE ( index, val_1, val_2 [, val_n ] )- 値のリストから指定された場所にある項目を返す。動作しないためCASEに変更*/

Let ( [ $query = " SELECT s.year_month, s.salespersonID, s.amount, CASE MONTH(s.\"date\") WHEN 1 THEN 'JAN' WHEN 2 THEN 'FEB' WHEN 3 THEN 'MAR' WHEN 4 THEN 'APR' WHEN 5 THEN 'MAY' WHEN 6 THEN 'JUN' WHEN 7 THEN 'JUL' WHEN 8 THEN 'AUG' WHEN 9 THEN 'SEP' WHEN 10 THEN 'OCT' WHEN 11 THEN 'NOV' WHEN 12 THEN 'DEC' END FROM sales_related_sales AS s

16

Page 17: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

WHERE LEFT(s.year_month,4) = '2010' AND s.salespersonID = 1 "

; $result = ExecuteSQL ( $query ; ", " ; "" )

]; $result) // CHOOSE()関数は動作しないため、// CASE関数で書き換え

ExecuteSQLメタ関数

これらの関数はExecuteSQLで使用し、データベースを検索できます。

関数 返されるカラムFILEMAKER_TABLES 1. TableName

2. TableID3. BaseTableName4. BaseFileName5. ModCount

FILEMAKER_FIELDS 1. TableName2. FieldName3. FieldType (SQLのデータ型。FileMakerのデータ型ではない)4. FieldID5. FieldClass (Normal, Summary, Calculated)6. FieldReps7. ModCount

Let ( [ $query = " SELECT * FROM FileMaker_Tables "

; $header = "TableName, TableID, BaseTableName, BaseFileName, ModCount¶"

; $result = $header & ExecuteSQL ( $query ; ", " ; "" )

]; $result

) //

17

Page 19: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

検索条件はWHERE句に入れる

SQLの検索条件で使用する場合、値は大文字・小文字を区別する必要があります。これは、フィールドオプション、格納方法、索引、デフォルト言語を変更しても変わりません。SQLクエリを作る場合、"A"は"a"と同じではありません。

比較演算子比較演算子はWHERE句で使われます。リレーションシップグラフで2つのフィールドを結合するときと同じように、フィールドとフィールド、フィールドと変数、フィールドと定数を比較するために使用されます。

= 等しい< より小さい<= より小さいか等しい> より大きい>= より大きいか等しい<> 等しくない

特別な比較演算子SQLには特別な比較演算子があります。

19

Page 20: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

BETWEEN (ANDと共に)範囲指定に使用されるLIKE (ワイルドカードとともに)単語や数字の部分を検索するのに使われるIN (カンマで区切られ)値のリストを検索するのに使われるNOT 結果の集合から排除する場合の用語NULL NULLの検索時に用いられる定数。ただしフィールド/カラムが空でない場合

のみAND 全ての式が真の場合に、ブール値のTRUEを返すOR 式のいずれかが真の場合に、ブール値のTRUEを返すANY サブクエリと共に使用され、いずれかの組み合わせ(スカラー式 x; xは1カ

ラムの集合の値)がTRUEの場合にTRUEを返す。そうではない場合にはFALSEを返す。

ALL サブクエリと共に使用され、すべての組み合わせ(スカラー式 x; xは1カラムの集合の値)がTRUEの場合にTRUEを返す。そうではない場合にはFALSEを返す。

EXISTS サブクエリに対して、行が存在するかどうかを評価する

AND、OR演算子は、組み合わせて選択をしぼるのに使用されます。2つ以上のリクエストをする場合、1つのWHERE句に複数のANDとOR演算子を使います。これらのリストはネストすることもでき、意味を明確にするためにカッコをつけます。

WHERE ( x = 1 OR y = 2 ) // いずれかが真であればOK AND ( z = 3 ) // これは必ず真

IS “=”と同じ意味IS NULL 値が空かどうかを評価する! NOTのショートカットとして使われる場合がある!= “<>”と同じ

WHERE s.sales_date IS NOT NULLまたは WHERE s.sales_date != NULL

Let ( [ $query = " SELECT s.salesPersonID, s.\"date\", s.amount FROM sales_related_sales AS s WHERE s.\"date\" BETWEEN ? AND ? ORDER BY s.salesPersonID DESC, s.\"date\" "

; $header = "Sales Between 2010-01-01 and " & Date(7; 0 ; 2010 ) & "¶" ; $header = $header & "ID" & char(9) & "sales¶"

; $result = ExecuteSQL ( $query ; char(9) ; "" ; "2010-01-01"

20

Page 21: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

; Date(7; 0 ; 2010 ) )

]; TextStyleAdd($header;Bold) & $result) // 日付はyyyy-mm-dd形式のリテラルとFileMakerの日付関数で与えられる

ワイルドカードでLIKEを使う

WHERE句のLIKEキーワードでは、FileMakerの検索条件で使用する記号と似たワイルドカード文字を使用することができます。ExecuteSQLで使える記号は、"%" (パーセント。1文字以上を意味する)と"_"(アンダースコア、1文字を意味する)の2つで、比較する文字列内のいずれの場所でも使うことができます。ワイルドカードの"%"はこの記事のいくつかの他の例で使われています。

/* LIKEでワイルドカードの"_"を使う */Let ( [ $query = " SELECT firstname, lastname FROM mycontacts WHERE lastname LIKE ? ORDER BY lastname "

; $result = ExecuteSQL ( $query ; "" ; "" ; "A_a%" ) // 大文字のA // の後ろに任意の一文字が続き // さらに小文字のaが続く文字列と比較する ]; $result) // SUCCESS

WHERE ... IN ( { SELECT ... } )

WHERE句で使われるINキーワードは、カンマ区切りのリストをとり、それぞれの値で検索(OR検索)を行ないます。リストが数字で構成されている場合は、単にカンマで区切られるだけです。リストがテキストの場合、それぞれの値はシングルクォートで括られます('abc','def','ghi','jkl')。内側に別のSELECTをネストした場合、これらの値は必要に応じて自動的にクォートで括られます。ネストされたSELECT文は結果として1カラムのみを返すようにします。

21

Page 22: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

/* WHERE ... IN 静的な場合 */

Let ( [ $query = " SELECT firstname,lastname,city,state FROM myContacts WHERE state IN ('MI','IN','OH') AND LOWER(lastname) LIKE 'z%' AND LOWER(firstname) LIKE 'a%' ORDER BY state, city, lastname "

; $result = ExecuteSQL ( $query ; ", " ; "" )

]; $result) // SUCCESS

/*SELECT WHERE ... IN () で?引数を使う*/

Let ( [ $query = " SELECT firstname,lastname,city,state FROM myContacts WHERE state IN (?, ?, ?) AND LOWER(lastname) LIKE 'z%' AND LOWER(firstname) LIKE 'a%' ORDER BY state, city, lastname "

; $result = ExecuteSQL ( $query ; ", " ; "" ; "MI" ; "IN" ; "OH" )

]; $result) // 上と同じクエリだが、INの中に引数が複数設定されている

サブクエリネストされたSELECTの例では2つのテーブル(リレーションはないが共有のキーを持つ)が使用されます。これはJOINを使ってもできるのですが、WHERE...INで1つのカラムを検索するデモとしてここに示しました。この例では、salesテーブルのレコードから重複を排除したsalespersonIDを検索結果として返します。そこからさらに2009年に売り上げがあった人を検索します。リストはINキーワードに渡され、外側のSELECTで使われます。結果として2009年に売り上げがあったsalespersonのリストが返されます。

22

Page 23: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

/*WHERE句でSELECTをネストする*/

Let ( [ $query = " SELECT s.name FROM salesperson AS s WHERE s.salespersonID IN ( SELECT DISTINCT sales.salespersonID FROM sales_related_sales AS sales WHERE YEAR(sales.\"date\") = ? ) ORDER BY s.name "

; $result = ExecuteSQL ( $query ; ", " ; "" ; 2009 )

]; $result) //

ALL, ANY (あるいはSOME), EXISTSを使用したWHERE句の比較をサブクエリで使用し、選択を絞り込むことができます。

SELECT DISTINCT

SELECTとともにDISTINCTキーワードを使用することで重複を排除した値が返されます。SQL関数の中にもDISTINCTキーワードを使用するものがあるかも知れないが、この記事ではその確認はしていません。DISTINCT使い方のサンプルが、ここやその他の記事にあります。SELECT文で複数のフィールドを使用した場合、DISTINCTはそれらすべてを考慮して重複を排除します。

23

Page 24: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

/*リストされたフィールドに基づいて重複を排除する*/

Let ( [ $query = " SELECT DISTINCT s.amount FROM sales_related_sales AS s WHERE s.amount >= ? ORDER BY s.amount DESC "

; $result = ExecuteSQL ( $query ; "" ; "" ; 490 )

]; $result)

/*リストされたフィールドに基づいて重複を排除する*/

Let ( [ $query = " SELECT DISTINCT lastname FROM myContacts WHERE LOWER(lastname) LIKE ? ORDER BY lastname "

; $result = ExecuteSQL ( $query ; "" ; "" ; "ab%" )

]; $result) // distinct lastname では192レコードが返される。// distinct lastname, firstnameを使用すると// 2100レコードが返される。

HAVINGは集計フィールド用の特別なWHERE

sumやcountなどの集計結果に基づいて検索結果を絞り込む場合は、HAVING句を使用します。SQLシステムの一部では、SELECT文で作成した集計に別名を与えて新規の列とすることができます。これは、HAVING句で別名だけで指定することが可能です。しかし、ExecuteSQLではこれは許されていないようなので、下の例のようにHAVING句で再度集計を繰り返す必要があります。

24

Page 25: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

/*HAVINGでフィルタリング*/

Let ( [ $query = " SELECT s.salespersonID , AVG( s.amount ) AS avg_amt FROM sales_related_sales AS s GROUP BY s.salespersonID HAVING AVG( s.amount ) > ? "

; $result = ExecuteSQL ( $query ; ", "; "" ; 300 )

]; $result) // SUCCESS - SELECT句で、定数に"?"を使用

/*HAVINGを使う*/

Let ( [ $query = " SELECT '#'||s.salespersonID , SUM( s.amount ) AS sum_amount FROM sales_related_sales AS s GROUP BY s.salespersonID HAVING SUM( s.amount ) > 150000 "

; $result = ExecuteSQL( $query ; ", "; "" )

]; $result) // HAVING句で集計を繰り返す

25

Page 26: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

JOINとUNION

JOINは、FileMakerのリレーションシップグラフで2つのテーブルオカレンスを2つのフィールドで結合するのと同じ働きをします。SQLでは単に2つのテーブルを指定し、WHERE句でリレーションを定義します。テーブルの別名は、JOINを使用する場合によく使用されます。同じ名称のフィールドが複数存在する場合、それぞれのフィールドがどのテーブルのものかを指定します。そうしないとSQLの構文エラーが発生します。

暗黙のJOIN

FROM salesperson AS s, sales_related_sales AS sales WHERE s.salespersonID = sales.salespersonIDまたは FROM salesperson, sales_relates_sales WHERE filter_date = year_month // フィールド/カラム名がユニークな場合は、WHERE句で別名を使用しなくてもよい

これは暗黙のJOINです。すべてのテーブルがリストされ、"JOIN"が暗に指定され、WHERE句で単純な等式が指定されています。ANDとORと組み合わせて、すべての比較演算子を使うことができます。WHERE句をまったく指定しなかった場合は、デカルト結合の結果が得られます。デカルト結合が必要な場合はあまりないと思いますが、そのような場合(あるとすればグローバルフィールドを返すため?)の例を示します。

デカルト結合

/*JOIN - デカルト結合 - グローバルフィールド*/

Let ( [ $query = " SELECT s.name , s.salespersonID , global_num_g , global_txt_g FROM salesperson AS s, dev "

; $result = ExecuteSQL ( $query ; ", " ; "" )

]; $result) // テーブル間にリレーションがないので、両方のテーブルからすべてのレコードが返される

26

Page 27: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

内部結合内部結合(INNER JOIN)は暗黙の等価結合と同じです(上の例ではWHERE句で“=”による結合)が、記法が少し違います。

FROM salesperson AS s JOIN sales_related_sales AS sales ON s.salespersonID = sales.salespersonIDまたは FROM salesperson JOIN sales_related_sales ON filter_date = year_monthまたは FROM salesperson AS s INNER JOIN sales_related_sales AS sales ON s.salespersonID = sales.salespersonIDまたは FROM salesperson INNER JOIN sales_related_sales ON filter_date = year_month

いずれも正常に動作します。3つ以上のテーブルがある場合に違いが明らかで、それらを正確に結合しなくてはいけません。顧客、請求書、請求明細を例にします。FileMakerのリレーションシップグラフでリンクを作成するのと同じように、SQLではJOINで結合します。

FROM Clients AS c JOIN Invoices AS inv ON c.clientID_pk = inv.clientID_fk AND ( c.state = 'WA' OR c.state = 'ID' ) JOIN Invoice_items AS itm ON inv.invoiceID_pk = itm.invoiceID_fk AND inv.invoice_date = '2009-10-13'または FROM Clients AS c JOIN Invoices AS inv ON c.clientID_pk = inv.clientID_fk JOIN Invoice_items AS itm ON inv.invoiceID_pk = itm.invoiceID_fk WHERE ( c.state = 'WA' OR c.state = 'ID' ) AND inv.invoice_date = '2009-10-13'または(暗黙に) FROM Client c, Invoices inv, Invoice_items inv WHERE c.clientID_pk = inv.clientID_fk AND inv.invoiceID_pk = itm.invoiceID_fk AND ( c.state = 'WA' OR c.state = 'ID' ) AND inv.invoice_date = '2009-10-13'

利点は、明確に区別されるため何を検索しているか明確になることです。いずれにしろ、これらはすべて同じ結果が返されます。

外部結合外部結合(OUTER JOIN)は明確に異なります。リレーションシップの左側のテーブルはすべて

27

Page 28: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

を表示して、右側にはそれに関連するレコードを表示したいという場合に使用します。これはレイアウトにポータルを表示するのと似ています。すべてのレコードを表示すると、ポータルが空のものもあります。これはLEFT OUTER JOINです。OUTER JOINを使う場合はLEFTあるいはRIGHTを指定する必要があります。OUTER JOINに関する記事があります。以下を参照してください。

FROM Clients AS c LEFT OUTER JOIN Invoices AS inv ON c.clientID_pk = inv.clientID_fk AND ( c.state = 'WA' OR c.state = 'ID' ) LEFT JOIN Invoice_items AS itm ON inv.invoiceID_pk = itm.invoiceID_fk AND inv.invoice_date = '2009-10-13'// "JOIN"のみあるいは"INNER JOIN"の場合と違う結果を返す場合がある

UNION

UNIONは、複数のテーブルがそれぞれのSELECT文に同じ数のフィールドを持っている場合に、それらを1テーブルに統合します。別テーブルに過去のレコードをアーカイブしていて、1つのレポートに現在のレコードとアーカイブのテーブルを合わせて集計しなくてはいけないという場合などに使用します。

SELECT A, B, C, D FROM current_classes WHERE classID = 123UNION ALLSELECT a AS A, b AS B, c AS C, D FROM archive_classes WHERE classid = 456ORDER BY D, B// カラム/フィールド数が同じ// カラム名を揃えるためにエイリアスを使う(必須ではない)// 検索条件(WHERE)は別々でもOK// ソート(ORDER BY)は最後の句に入れる

UNIONは重複レコードを排除し、UNION ALLは全レコードを残します。

28

Page 29: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

ティップス、参考情報、リソース

FileMaker公式サイト● ExecuteSQL, FM12ヘルプトピック● FileMaker 12 ODBCとJDBCガイド (pdf)

一般的なSQLチュートリアル● SQL.org Tutorial● MySQL 5.6 Manual - 13.2.9. SELECT Syntax MySQL向けのすべての用法が

ExecuteSQLで使えるわけでないですが、参考になります。● w3schools - SQL Tutorial● SQL Tutorial - SQL Query Reference● sqlzoo - Interactive SQL tutorial Examples● Built-in Functions (Transact-SQL) - MS SQL● Chapter 4 SQL Functions - SQL in a Nutshell, O'Reilly● "Sams Teach Yourself SQL in 10 Minutes" - Forta.

ExecuteSQL関連のブログと記事● FM 12 ExecuteSQL, part 1 - Kevin Frank, 2012/4/16● FM 12 ExecuteSQL, part 2 - Kevin Frank, 2012/4/22● Outer Joins in FileMaker 12 - Part 1 - Kevin Frank, 2012/10/2● Outer Joins in FileMaker 12 - Part 2 - Kevin Frank, 2012/10/2● FM 12 ExecuteSQL: Dynamic Parameters, part 1 - Kevin Frank, 2012/5/2● FM 12 ExecuteSQL: Dynamic Parameters, part 2 - Kevin Frank, 2012/5/8● FM 12 ExecuteSQL: Robust Coding, part 1 - Kevin Frank, 2012/5/13● FM 12 ExecuteSQL: Robust Coding, part 2 - Kevin Frank, 2012/5/21● FM 12 ExecuteSQL "Unconference" Session - Kevin Frank, John Ahn,

2012/7/19 (2012/9/11: ConditionalVL_SQL demoを更新)● ExecuteSQL Function Notes - Kentuckiana FMpug● Using ExecuteSQL to Query the Virtual Schema/System Tables - Andrew

Duncan● FileMaker 12: Why SQL? (Context Independent) - Seedcode, 2012/4/6● ExecuteSQL - Date Formats - Seedcode, 2012/4/21● Seedcode - search 'ExecuteSQL' - Beeswax● FileMaker 12 SQL: Crafting Structural Beauty - BrianがExecuteSQLの構造化記法

を紹介

役に立つデータベースとカスタム関数● Skeleton Key webinar プレゼンテーションのYouTubeビデオとサンプルファイルのダ

ウンロードサイトへのリンク YouTube● SeedCode - SQLexplorer, FM12のSQLを学習できる無料ツール。ドキュメントとデ

モビデオが含まれている。● Tip file: duplicating master and related records using ExecuteSQL and FM12 - G.

Pupita マスターレコードとその関連レコードを同時に複製するというのはよくある手順ですが、FileMakerに標準で備わっている機能にはありません。そこでこれを実現するスクリプトが求められます。FileMaker 12で導入されたExecuteSQL関数により、完全にモジュール化された手順を作成できるようになりました。どこからでもテーブル名とフィールド名を渡すだけで再利用できます。

29

Page 30: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

● SQL Builder Eden Morris - さらに野心的なSQLジェネレータ。SQLでできることをすべて見せることを狙っているため、難易度は高い。

● sql.debug - Andries Heylen - カスタム関数● FileMaker Pro 12 Adds Native SQL Queries - Anders Monsen, Mighty Data● SQL.debug "?"の代わりにエラーを返すカスタム関数 - Andries Heylen● Handy Custom Functions by Dan Smith - FMforums

FileMaker SQLプラグインSQLやプラグインで追加できるコマンドの知識をさらに広げたい場合は、以下を試してみてください。

● Dracoventions SQL Runner - SQL RunnerはフリーのFileMaker ProとServer用のプラグインで、強力な新しい方法でFileMakerに対してデータを読み書き

● Youseful SQL Plugin - FileMakerデータベースに対して直接SQLクエリを実行● 360Works JDBC plugin - 複数のJDBCデータベースに対して任意のSQL文を実行で

き、結果セットに対して繰り返し処理が可能で、JDBCをサポートするあらゆるDBからインポートが可能

● 360Works Script Master - ScriptMaster 4 AdvancedでFileMaker SQLエンジンに直接アクセスすることにより、スクリプトから直接SQLコマンドを実行

● myFMbutler DoSQL plug-in - WindowsとMacintosh用のFileMaker Proプラグイン。FileMakerの計算フィールドから FileMakerデータの操作が可能

● MBS SQL Connections - SQLデータベースサーバに直接アクセスするための関数を含む

● Goya - BaseElements Plugin - BE_FileMakerSQL● CNS - MMQuery - MMQuery_ExecuteSQL: この関数を使って、SQL文を使用して現

在のデータベースファイルに対してクエリを実行できるMMQuery_ExecuteSQLEx: この関数はFileMaker Pro 11以降でのみ利用可能。拡張版では別ファイルのデータベースを指定することができる

● SmartPill PHP edition - 内部でSQL関数を使用(fm_sql_executeとor fm_sql_select)

ティップス● ExecuteSQLでカラム/フィールドの区切りとしてChar(9)を使用している場合、結果

フィールドにフォーマットで「タブ位置」を設定しましょう。あらかじめカラム数とおおよその幅がわかっているのであれば、レイアウトモードでインスペクタを使用してタブ位置を設定できます。またはブラウズモードでフィールド内で「すべてを選択」し、タブ位置を調整できます。これらを確認するためには「ルーラを表示」をオンにします。

● 区切り文字は、どのような文字でも指定できます。サンプルファイルの中にはHTMLラグを区切り文字にしているものがいくつかあります。これは、ExecuteSQL()をFileMaker Webビューアで評価させる場合に便利です。デフォルトの区切り文字はカンマと改行です。デモファイルには文字列結合と改行をフィールド/カラムの区切りとして使用している例があります。これによってラベル形式の出力を生成することができます。

● ExecuteSQLにはTOP, LIMIT, ROWNUMはありません。クエリの結果はすべて返されます。行の区切りとしてデフォルトの改行記号のChar(13)を使用しているのであれば、GetValue($result; 1)を使って1行目のみを表示するという方法があります。

30

Page 31: The Missing FileMaker 12 ExecuteSQL Reference...The Missing FileMaker 12 ExecuteSQL Reference FileMaker 12のExecuteSQL関数に関連して、SQL (Structured Query Language)の使い

The Missing FileMaker 12 ExecuteSQL Reference

トラブルシューティング

クエリの解析中あるいは実行中にエラーが発生した場合、FileMaker Proは“?”を返します。 これは引数ではなく、エラーを意味しています(クエリを絶対正しく入力した!と主張できない限りは)。エラーコードはFileMakerヘルプのトピックで参照できます。FileMaker Pro 12 ErrorCode Reference Guide

1. まずクエリをサンプルデータベースのいずれかで試してします。2. クエリをデータビューア(FileMaker Pro Advanced 12)に貼り付け、エラーが発生する

かどうか確認します。3. クエリを、データビューアかフィールド設定で"EvaluationError ( Evaluate ( $query

) )"の中に入れて、返されるエラーコードを確認します。4. エラーは発生しないが、期待する結果にならないという場合もあります。例えば、ある

SQL関数が現時点ではExecuteSQLでは使用できないというような場合です。5. フォーマット上のエラーで直接解決できないという場合があります。あるいは区切り文

字を変更しなくてはいけないという場合があります。6. クエリをLet()ステートメントに入れて、必要に応じ変数を割り当てます。これを

「フィールドを設定」スクリプトステップで使用する場合、データビューアで変数を確認できます。

7. 2つの特別なエラーコードが生成される場合があります。これらはプラグイン開発者が見つけたもので、“8309” = 意味上のエラー(論理的な) と “8310” = 文法エラー (コードの誤り)があります。

/* リンク先のデモファイルで使用したクエリのサンプル */

Let ( [ $query = “ // ここにクエリを挿入 “

; $result = ExecuteSQL ( $query ; “” ; “” ; “” //追加の引数 )

]; $result) // ここにメモを挿入 - 最後の$resultにその他の変数を加えることもできます

デモファイル: SQL4_fmdev2.fmp12, related_sales.fmp12コンタクト情報のデモには100万レコードが入った大きなファイルを使用しました。容量の都合でアップロードできなかったので、より少ない件数のこのレコードをインポートしてください。 4145Names

31