初心者のFileMaker pro Q&A (旧掲示板)

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


#1 2023-07-24 20:36:57

k16
Member

ExecuteSQL関数を計算フィールドの定義に用いる。参照先TO名・フィールド名の変更にも対応できるようにしたい。

お世話になります。

表題の通り、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

#2 2023-07-24 21:17:08

mic
Member

Re: ExecuteSQL関数を計算フィールドの定義に用いる。参照先TO名・フィールド名の変更にも対応できるようにしたい。

SQL = "SELECT \"@@F1@@\" FROM \"@@TO@@\" WHERE \"@@F2@@\" = ?"
もしくは
  SQL = Substitute ( SQL ; [ "@@TO@@" ; Quote(TO) ] ; [ "@@F1@@" ; Quote(F1) ] ; [ "@@F2@@" ; Quote(F2) ]
としたらどうでしょう。
両方ではなくどちらかで。

Offline

#3 2023-07-25 09:33:07

himadanee
Guest

Re: ExecuteSQL関数を計算フィールドの定義に用いる。参照先TO名・フィールド名の変更にも対応できるようにしたい。

>結果は ? と表示されます。
実行しているSQL文を確認すればわかるでしょう。
>TO = "\\\"" &~~
これだと「¥」という文字が入ってしまってるのでは。
例えば
"SELECT \"@@F1@@\" FROM"
この文字列には「¥」という文字は含まれません。「¥"」で1文字です。

#4 2023-07-25 09:56:31

qb_dp
Member

Re: ExecuteSQL関数を計算フィールドの定義に用いる。参照先TO名・フィールド名の変更にも対応できるようにしたい。

以下が参考になるのでは。

FM 12 ExecuteSQL: Robust Coding, part 1 – FileMakerHacks
https://filemakerhacks.com/2012/05/13/f … ng-part-1/

Offline

#5 2023-07-25 18:54:52

k16
Member

Re: ExecuteSQL関数を計算フィールドの定義に用いる。参照先TO名・フィールド名の変更にも対応できるようにしたい。

micさん、ありがとうございます。
それぞれ試してみましたが、残念ながら結果は ? のままで変わりませんでした。

himadaneeさん、ありがとうございます。
Letの最後の計算式を、SQL とだけにしてSQL文の内容を見てみましたが、
  SELECT \"店舗コード\" FROM \"店舗\" WHERE \"店舗ロケーションID\" = ?
となっており、問題がどこにあるのかわかりません・・・。

qb_dpさん、ありがとうございます。
10年以上前の解決法なんですね。とても参考になりました。
このやり方で行こうと思います。

Offline

#6 2023-07-25 19:40:46

himadanee
Guest

Re: ExecuteSQL関数を計算フィールドの定義に用いる。参照先TO名・フィールド名の変更にも対応できるようにしたい。

SQL文に余計な¥文字が入ってます。
SELECT "店舗コード" FROM "店舗" WHERE "店舗ロケーションID" = ?
が正しい。
文字列定数として""の中に"を書くときに\"となるのであって、SQLで名称をくくるのは"だけで\"ではありません。

#7 2023-07-25 19:54:04

k16
Member

Re: ExecuteSQL関数を計算フィールドの定義に用いる。参照先TO名・フィールド名の変更にも対応できるようにしたい。

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

#8 2023-07-26 10:48:56

Shin
Member

Re: ExecuteSQL関数を計算フィールドの定義に用いる。参照先TO名・フィールド名の変更にも対応できるようにしたい。

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

#9 2023-07-26 11:45:02

himadanee
Guest

Re: ExecuteSQL関数を計算フィールドの定義に用いる。参照先TO名・フィールド名の変更にも対応できるようにしたい。

SQLとは特に関係なくて、FMにおける「何かの流儀」だと思います。
FMの計算式の内容を考えなくても実行されるSQL文が一見して読めるという点が主張だと思います。

#4のリンク先では単純に連結してますね。

#10 2023-07-26 18:56:43

k16
Member

Re: ExecuteSQL関数を計算フィールドの定義に用いる。参照先TO名・フィールド名の変更にも対応できるようにしたい。

Shinさん
はい、himadaneeさんの書かれている通り、SQL文の読みやすくするためだけのものです。
&が入り込むのが嫌でしたので。

Offline

Registered users online in this topic: 0, guests: 1
[Bot] ClaudeBot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.005 seconds, 7 queries executed - Memory usage: 525.48 KiB (Peak: 546.38 KiB) ]