みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
Mac OS14 FM18を利用しています。
SQLに関して全く初心者で、使い方を勉強し始めたんですが、ファイルメーカー関数での書き方に四苦八苦しています。
ステップ1:
TO内の「TableB」にあるフィールド:「レコードID」を抽出できました。
ExecuteSQL計算式は式内に日本語が入ると、\"で囲むという情報をリファレンスで確認済み。
ExecuteSQL ( "SELECT \"レコードID\" FROM TableB " ; "" ; "" )
上の式で、テーブル内のレコード全てのIDを改行でリスト化することができました。
ステップ2:
次に、上の式にフィールド:「内容」の値が"new"のレコードだけ抽出という条件を加えました。
ExecuteSQL ( "SELECT \"レコードID\" FROM TableB WHERE \"内容\" = new" ; "" ; "" )
この式の結果が、The column named "new" does not exist in any table in the column reference's scope.
となっています。実際には、この「内容」の値が"new"というレコードは、5件あります。
式の書き方のご教授いただけないでしょうか。よろしくお願いします。
Offline
自分の場合は、"New"を調べたい場合、シングルクォーテーションでくくるか、
イコールの後を?にして、最後に条件を入れて表示させてます。
Offline
>Chikutakuさん
こういうことでしょうか?
何れにしても、データビューアでこのような結果が帰ってきます。
ExecuteSQL ( "SELECT \"レコードID\" FROM TableB WHERE \"内容\" = ?new" ; "" ; "" )
結果:There is an error in the syntax of the query.
ExecuteSQL ( "SELECT \"x_レシートID\" FROM GOSYNC WHERE \"内容\" = "new"" ; "" ; "" )
結果:<テーブルが見つかりません>
Offline
>Chikutakuさん
こういうことでしょうか?
何れにしても、データビューアでこのような結果が帰ってきます。
ExecuteSQL ( "SELECT \"レコードID\" FROM TableB WHERE \"内容\" = ?new" ; "" ; "" )
結果:There is an error in the syntax of the query.ExecuteSQL ( "SELECT \"x_レシートID\" FROM GOSYNC WHERE \"内容\" = "new"" ; "" ; "" )
結果:<テーブルが見つかりません>
ExecuteSQL (
"SELECT \"レコードID\"
FROM \"TableB\"
WHERE \"内容\"= ? ";
"" ;
"" ;
"new"
)
?の方が覚えるには後々いいと思うので、こういった形で覚えた方がいいかもしれません。
?の後には何も入れずに最後に持ってきます。
言葉足らずで申し訳ございません。
ExecuteSQL (
"SELECT \"x_レシートID\"
FROM \"GOSYNC\"
WHERE \"内容\"= ? ";
"" ;
"" ;
"new"
)
ちなみにシングルクォーテーションの場合は、
イコールのあとに直打ちします。
これだと汎用的にならないので、少々面倒です。
ExecuteSQL (
"SELECT \"レコードID\"
FROM \"TableB\"
WHERE \"内容\"= 'new' ";
"" ;
""
)
Last edited by Chikutaku (2020-07-14 16:26:39)
Offline
>Chikutakuさん
式の通り試したらできました。ありがとうございます。
なぜ、条件が最後になるかが疑問ですが、どこかで参考になる資料はあるでしょうか。
ちなみに現在、Filemaker16SQLリファレンスガイドというものを読んでいるのですが、具体的な式の記述方法は載っていないので、困っています。
追加質問
ステップ3:
次に、フィールド「タイムスタンプ」の値が、グローバル変数値:「$$TS」以降のレコードだけ抽出という条件、条件が複数になった場合は、どうなるのでしょうか?
ExecuteSQL ( "SELECT \"レコードID\" FROM TableB WHERE \"内容\" = ? \"タイムスタンプ\" > ? " ; "" ; "" ; "new" ; $$TS )
こんな感じでしょうか?
そしてそれをタイムスタンプ降順で並べる場合の ORDER BYは、どの箇所におくと良いのでしょうか?
Last edited by jose (2020-07-14 16:39:47)
Offline
具体的に載っているやつですか...
パッと出てこないんですけど。ExecuteSQLで出てきたものは、大体同じような事かいてあるので。。
ステップ3に関しては、内容フィールドと、タイムスタンプフィールドは違うフィールドなので、ANDとかORを付け加えないといけないです。
同条件で表示させたい場合は、
ExecuteSQL ( "
SELECT \"レコードID\"
FROM \"TableB\"
WHERE \"内容\" = ?
AND \"タイムスタンプ\" >= ?
" ;
"" ;
"" ;
"new" ;
$$TS
)
Offline
テストのため、データビューアタイムスタンプを定数にして、結果を見ると、
ExecuteSQL ( "
SELECT \"x_レシートID\"
FROM GOSYNC
WHERE \"s_シンク内容\" = ? AND \"y_シンク作成日\" > TIMESTAMP '2020-07-08 13:54:00'
" ;
"" ;
"" ;
"new"
)
評価あり
ExecuteSQL ( "
SELECT \"x_レシートID\"
FROM GOSYNC
WHERE \"s_シンク内容\" = ? AND \"y_シンク作成日\" > ?
" ;
"" ;
"" ;
"new" ;
TIMESTAMP '2020-07-08 13:54:00'
)
<テーブルが見つかりません>
このようになるのはどうしてでしょうか?また、ORDER BYを取り入れたい(タイムスタンプの降順)どの場所に記入すると良いのでしょうか?
Offline
テストのため、データビューアタイムスタンプを定数にして、結果を見ると、
ExecuteSQL ( "
SELECT \"x_レシートID\"
FROM GOSYNC
WHERE \"s_シンク内容\" = ? AND \"y_シンク作成日\" > TIMESTAMP '2020-07-08 13:54:00'
" ;
"" ;
"" ;
"new"
)
評価ありExecuteSQL ( "
SELECT \"x_レシートID\"
FROM GOSYNC
WHERE \"s_シンク内容\" = ? AND \"y_シンク作成日\" > ?
" ;
"" ;
"" ;
"new" ;
TIMESTAMP '2020-07-08 13:54:00'
)
<テーブルが見つかりません>このようになるのはどうしてでしょうか?また、ORDER BYを取り入れたい(タイムスタンプの降順)どの場所に記入すると良いのでしょうか?
ExecuteSQL ( "
SELECT \"x_レシートID\"
FROM GOSYNC
WHERE \"s_シンク内容\" = ? AND \"y_シンク作成日\" > ?
" ;
"" ;
"" ;
"new" ;
TIMESTAMP '2020-07-08 13:54:00' ←時間だけで大丈夫です。
)
ExecuteSQL ( "
SELECT \"x_レシートID\"
FROM GOSYNC
WHERE \"s_シンク内容\" = ? AND \"y_シンク作成日\" > ?
" ;
"" ;
"" ;
"new" ;
"2020-07-08 13:54:00"
)
ORDER BY って自身では使った事ないんですけど、
ExecuteSQL ( "
SELECT \"x_レシートID\"
FROM GOSYNC
WHERE \"s_シンク内容\" = ? AND \"y_シンク作成日\" > ?
ORDER BY \"y_シンク作成日\"
" ;
"" ;
"" ;
"new" ;
"2020-07-08 13:54:00"
)
これでいいと思います。
Offline
>Chikutakuさん
タイムスタンプは、日時だけの表示で良いのですね。ちなみに、この後テスト用に設定したG変数にも対応できているのを確認しました。
ありがとうございます。
さて、ORDER BYの項目ですが、実は降順に並べたいと思っています。
参考書を見ると、[DESC]が降順とのことですが、うまく表示されません。
ExecuteSQL ( "
SELECT \"x_レシートID\" , \"y_シンク作成日\"
FROM GOSYNC
WHERE \"s_シンク内容\" = ? AND \"y_シンク作成日\" > ?
ORDER By \"y_シンク作成日\" [DESC]
" ;
"" ;
"" ;
"new" ;
"2020-07-08 13:54:00"
)
There is an error in the syntax of the query.
という評価です。
Offline
[DESC]ではなく、DESC と表記します。
リファレンスガイドの記述式ですが [ ] で囲われているものは省略可能なコードです。
そのまま打つという意味ではありません。
FileMaker 16 SQL リファレンスガイド
こちらを参考にしているようですが SQL 全般なので ExecuteSQL では仕様が違うこともあります。
ExecuteSQL に関してはこちらの「The Missing FileMaker 12 ExecuteSQL Reference」がおすすめです。
The Missing FileMaker 12 ExecuteSQL Referenceの日本語訳
Offline
>Mozさん
ありがとうございます。
「The Missing FileMaker 12 ExecuteSQL Reference」もダウンロードしたので、参考にさせてもらいます。
ここに書かれているように、ファイルメーカーでのSQL実行は、selectのみ対応ということでしょうか?
素人ながらSQLで情報抽出ができるようになったおかげで、スクリプトステップの簡略化に成功しました。
Chikutakuさん、Mozさん、いつもありがとうございます。
Offline
ここに書かれているように、ファイルメーカーでのSQL実行は、selectのみ対応ということでしょうか?
書かれているとおりです。レコードを弄るようなことはできません。
テキストで返ってくるので後処理は必要ですが、
ExecuteSQL を利用した検索は標準で完全一致のため通常の検索に比べて高速です。
(索引を使うので非保存の場合に受ける影響は検索と同様です)
Offline
追記:
iOSのtableBのレコードから任意のレコードだけexecuteSQLでレコードIDを取り出し、その情報をサーバーのtableCにアップロードしたいと思っています。
「変数を設定」:executeSQLで抽出したTableBのレコードID(リスト化)
「ループ+ レコードを作成」を使用:変数の1行目だけを取り出し、tableCのフィールド1に登録
「フィールド設定」tableCの他複数フィールドに関連テーブルや計算式から値を登録。
この手順でスクリプトステップを作ったのですが、どうしてもレイアウトの移動やフィールド設定のステップがフィールド数によって増えるため、ステップの処理時間が増えてしまっています。
iOSのローカルファイルから、サーバーにレコードをアップする時、または、ループ処理をする時にパフォーマンスを上げる方法などありますでしょうか?
Offline
Pages: 1
[ Generated in 0.005 seconds, 9 queries executed - Memory usage: 558.88 KiB (Peak: 579.79 KiB) ]