みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
いつもお世話になっております。
Evaluateにて引数をExecuteSQLを記述してあるテキストフィールド
Evaluate ( テキストフィールド )
とした場合と
上記テキストフィールドと同じものを直接引数に記述した
Evaluate(
ExecuteSQL ( "select '\"'||a.\"勘定科目\"||' \"' , '&NumToJText (',sum(a.\"出金\") ,'; 1 ; 0 ) & \"円\"'
FROM \"DATE\" a
WHERE a.\"出金\" > 0
group by a.\"勘定科目\"
"
; " " ; " & Char ( 13 ) & " ))
とした場合とで結果が異なるのですが何故なのか分かりません。
上記ですと
"リース料 " &NumToJText ( ○○○○○ ; 1 ; 0 ) & "円" & Char ( 13 ) & "交際費 " &NumToJText ( ○○○○○ ; 1 ; 0 ) & "円" & Char ( 13 ) & "仕入 " &NumToJText ( ○○○○○ ; 1 ; 0 ) & "円"
となり、直接入力ですと
リース料 ○○,○○○円
交際費 ○○,○○○円
仕入 ○○,○○○円
と意図した形になります。
またフィールド値使用の場合でもEvaluateを2重にすれば意図した形にはなります。
ただそれだと好ましい方法ではないように思います。
テキストフィールドとしての扱いとテキストとの違いを理解出来ていないのだと思いますがこの場合(フィールド値を使用して意図した形にする場合)はどのようにするのが正解でしょうか?
どなたかご教授いただけませんでしょうか?
どうか宜しくお願いいたします。
FM18
Last edited by 中田 (2021-05-05 16:12:51)
Offline
フィールドに
ExecuteSQL ( "select '\"'||a.\"勘定科目\"||' \"' , '&NumToJText (',sum(a.\"出金\") ,'; 1 ; 0 ) & \"円\"'
FROM \"DATE\" a
WHERE a.\"出金\" > 0
group by a.\"勘定科目\"
"
; " " ; " & Char ( 13 ) & " )
が入っていて、Evaluate ( テキストフィールド )で実行した場合、実行されるスクリプトは、以下のような感じになります。
Evaluate(
"ExecuteSQL ( \"select '\\\"'||a.\\\"勘定科目\\\"||' \\\"' , '&NumToJText (',sum(a.\\\"出金\\\") ,'; 1 ; 0 ) & \\\"円\\\"'
FROM \\\"DATE\\\" a
WHERE a.\\\"出金\\\" > 0
group by a.\\\"勘定科目\\\"
\"
; \" \" ; \" & Char ( 13 ) & \" )"
)
この場合、ExecuteSQL が実行され、戻り値は、以下になります。
"リース料 " &NumToJText ( ○○○○○ ; 1 ; 0 ) & "円" & Char ( 13 ) & "交際費 " &NumToJText ( ○○○○○ ; 1 ; 0 ) & "円" & Char ( 13 ) & "仕入 " &NumToJText ( ○○○○○ ; 1 ; 0 ) & "円"
スクリプトで以下のようにした場合は、最初に ExecuteSQL が実行され、その戻り値に対して Evaluate で計算されます。
Evaluate(
ExecuteSQL ( "select '\"'||a.\"勘定科目\"||' \"' , '&NumToJText (',sum(a.\"出金\") ,'; 1 ; 0 ) & \"円\"'
FROM \"DATE\" a
WHERE a.\"出金\" > 0
group by a.\"勘定科目\"
"
; " " ; " & Char ( 13 ) & " ))
Last edited by qb_dp (2021-05-05 18:04:13)
Offline
Evaluate()の引数はテキストなので、
Evaluate("1+1")
で1+1を評価します。
Evaluate(1+1)
は2(計算結果をテキストに変換)を評価します。
(この場合は結果が同じなので、かえって分かりにくいかな...)
フィールドが引数の場合は、フィールド値をテキスト変換してそれを評価するので、テキストフィールドの内容が
1+1
の場合は、"1+1"というテキストを評価することになります(上の例と同じ)。
フィールド値を計算式として計算した結果を評価したいなら、Evaluate()が二重になるのはしょうがないというか必然ですね。
フィールド値をEvaluate(ExecuteSQL(~~))とする方が柔軟かな?
qb_dp様、丁寧に教えて下さりありがとうございます。
フィールド引用だとテキストとするために前後""で囲み中も必要な箇所全てにエスケープ処理を自動でしてくれてる、と理解しました。
直接入力の入れ子だと先に実行というのも知らずに今まで使用していました、大変勉強になりました。
himadanee様、くだいて教えて下さり、とてもわかりやすいです。
Evaluate2重もやむなしと聞いて安心しました。
ありがとうございました。
一点疑問が増えたので追加で質問させて下さい。
サーバー上のスクリプト実行、にて素のExecuteSQLを記述してあるテキストフィールドを引数とした場合、ローカルで計算した結果が引き渡されるのでしょうか?それともqb_dp様の例のようなテキスト化した計算式が引き渡されるのでしょうか?
重ねての質問申し訳ありません。
ご教授いただけますでしょうか?
宜しくお願いいたします。
Last edited by 中田 (2021-05-06 10:06:17)
Offline
「スクリプト:サーバー上のスクリプト実行」
サーバー上でスクリプト用にFileMakerが起動してスクリプトを実行しているような感じでイメージすればわかりやすい?かなぁ...
なので、フィールド値 を「スクリプト:サーバー上のスクリプト実行」で使用する場合は、確定したフィールド値が使用されます。
Offline
qb_dp 様、教えて下さりありがとうございます。
>>クリプト用にFileMakerが起動してスクリプトを実行
なのでEvaluateにてテキストフィールド値を引数にした場合と同じように
Evaluate(
"ExecuteSQL ( \"select '\\\"'||a.\\\"勘定科目\\\"||' \\\"' , '&NumToJText (',sum(a.\\\"出金\\\") ,'; 1 ; 0 ) & \\\"円\\\"'
FROM \\\"DATE\\\" a
WHERE a.\\\"出金\\\" > 0
group by a.\\\"勘定科目\\\"
\"
; \" \" ; \" & Char ( 13 ) & \" )"
)
とテキスト化(?)された計算式が引き渡されると理解しました。
ありがとうございました。
Offline
[ Generated in 0.008 seconds, 11 queries executed - Memory usage: 521.12 KiB (Peak: 525.66 KiB) ]