みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
お世話になります。
表題の通り、ExecuteSQL関数を計算フィールドの定義に用いる際、参照先TO名・フィールド名の変更にも対応できるようにしたいと考えています。
例としてセールスサマリーDBから、自身のロケーションIDフィールドと、参照先である店舗DB上の店舗ロケーションIDフィールドが一致するレコードの店舗コードを取得する場合、以下のように計算フィールドの定義をしてみましたが、結果は ? と表示されます。
Let (
[
TO = "\\\"" & GetValue ( Substitute ( GetFieldName ( 店舗::店舗コード ) ; "::" ; "¶" ) ; 1 ) & "\\\""
;
F1 = "\\\"" & GetValue ( Substitute ( GetFieldName ( 店舗::店舗コード ) ; "::" ; "¶" ) ; 2 ) & "\\\""
;
F2 = "\\\"" & GetValue ( Substitute ( GetFieldName ( 店舗::店舗ロケーションID ) ; "::" ; "¶" ) ; 2 ) & "\\\""
;
SQL = "SELECT @@F1@@ FROM @@TO@@ WHERE @@F2@@ = ?"
;
SQL = Substitute ( SQL ; [ "@@TO@@" ; TO ] ; [ "@@F1@@" ; F1 ] ; [ "@@F2@@" ; F2 ] )
]
;
ExecuteSQL (
SQL
; "" ; "" ; ロケーションId )
)
この計算式で修正するべきところをご指摘いただけますでしょうか。
もしくは、よりシンプルで汎用性の高い計算式をご教授いただけると有り難いです。
私が参考にしましたのは、こちらの動画になります(計算フィールド定義ではなく、スクリプト上でのテクニックになりますが)。
https://www.youtube.com/watch?v=9iFSle64iCs
よろしくお願いいたします。
Offline
SQL = "SELECT \"@@F1@@\" FROM \"@@TO@@\" WHERE \"@@F2@@\" = ?"
もしくは
SQL = Substitute ( SQL ; [ "@@TO@@" ; Quote(TO) ] ; [ "@@F1@@" ; Quote(F1) ] ; [ "@@F2@@" ; Quote(F2) ]
としたらどうでしょう。
両方ではなくどちらかで。
Offline
>結果は ? と表示されます。
実行しているSQL文を確認すればわかるでしょう。
>TO = "\\\"" &~~
これだと「¥」という文字が入ってしまってるのでは。
例えば
"SELECT \"@@F1@@\" FROM"
この文字列には「¥」という文字は含まれません。「¥"」で1文字です。
以下が参考になるのでは。
FM 12 ExecuteSQL: Robust Coding, part 1 – FileMakerHacks
https://filemakerhacks.com/2012/05/13/f … ng-part-1/
Offline
micさん、ありがとうございます。
それぞれ試してみましたが、残念ながら結果は ? のままで変わりませんでした。
himadaneeさん、ありがとうございます。
Letの最後の計算式を、SQL とだけにしてSQL文の内容を見てみましたが、
SELECT \"店舗コード\" FROM \"店舗\" WHERE \"店舗ロケーションID\" = ?
となっており、問題がどこにあるのかわかりません・・・。
qb_dpさん、ありがとうございます。
10年以上前の解決法なんですね。とても参考になりました。
このやり方で行こうと思います。
Offline
SQL文に余計な¥文字が入ってます。
SELECT "店舗コード" FROM "店舗" WHERE "店舗ロケーションID" = ?
が正しい。
文字列定数として""の中に"を書くときに\"となるのであって、SQLで名称をくくるのは"だけで\"ではありません。
himadaneeさん、ありがとうございます。理解しました!
このように修正することで、解決しました。
Let (
[
TO = "\"" & GetValue ( Substitute ( GetFieldName ( 店舗::店舗コード ) ; "::" ; "¶" ) ; 1 ) & "\""
;
F1 = "\"" & GetValue ( Substitute ( GetFieldName ( 店舗::店舗コード ) ; "::" ; "¶" ) ; 2 ) & "\""
;
F2 = "\"" & GetValue ( Substitute ( GetFieldName ( 店舗::店舗ロケーションID ) ; "::" ; "¶" ) ; 2 ) & "\""
;
SQL = "SELECT @@F1@@ FROM @@TO@@ WHERE @@F2@@ = ?"
;
SQL = Substitute ( SQL ; [ "@@TO@@" ; TO ] ; [ "@@F1@@" ; F1 ] ; [ "@@F2@@" ; F2 ] )
]
;
ExecuteSQL (
SQL
; "" ; "" ; ロケーションId )
)
解決済みとさせていただきます。
ご回答いただきました皆様、ありがとうございました。
Offline
SQLは上級ではないので教えていただきたいのですが、
SQL = "SELECT @@F1@@ FROM @@TO@@ WHERE @@F2@@ = ?"
;
SQL = Substitute ( SQL ; [ "@@TO@@" ; TO ] ; [ "@@F1@@" ; F1 ] ; [ "@@F2@@" ; F2 ] )
は、
SQL = "SELECT ” & TO & " FROM ” & F1 & " WHERE ” & F2 & " = ?
と書いても同じだと思うのですが、一旦別の文字列で設定しておいて、それを置き換えるのは、何か意味があるのですか。何かの流儀なのですか。
Offline
SQLとは特に関係なくて、FMにおける「何かの流儀」だと思います。
FMの計算式の内容を考えなくても実行されるSQL文が一見して読めるという点が主張だと思います。
#4のリンク先では単純に連結してますね。
Shinさん
はい、himadaneeさんの書かれている通り、SQL文の読みやすくするためだけのものです。
&が入り込むのが嫌でしたので。
Offline
[ Generated in 0.005 seconds, 7 queries executed - Memory usage: 525.48 KiB (Peak: 546.38 KiB) ]