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

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

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

You are not logged in.

Announcement

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


#1 2018-03-20 10:45:49

サンサン
Member

executeSQLで取得したデータをフィールドに挿入したい

2点質問があります。
executeSQLを使い、このようなデータを取得しました。各データをフィールドに挿入したいと思います。
そこで以下のような方法で1行目のデータを取得しました。

id,価格,商品名
1,10,飴
2,99,999,掃除機

変数を設定[$変数1;ExecuteSQL("Select...")]
変数を設定[$行;Let([$行 = GetValue($変数1,1);$row=Substitute($行;",",¶),$列;"1")];$行)]
フィールド設定[table::a;GetValue($行;"1")]
フィールド設定[table::b;GetValue($行;"2")]
フィールド設定[table::c;GetValue($行;"3")]

質問1
1行を取得して、カンマを改行に置換。1列になったところをGetValueで各行にアクセスしてデータを取得するという方法を行っています。
これで問題なくデータをフィールドに設定できています。ただ、このやり方があまりスマートじゃないような気がしていますが、このような
やり方で問題ないでしょうか?

質問2
1行目は問題ないのですが、2行目は価格が「99,999」とカンマが入っています。上記のようなやり方だと、価格のカンマも改行されてしまいます。
そうすると、正しい価格をフィールドに設定できません。何か良い方法で「99,999」を取得する事ができないでしょうか?

よろしくおねがいします。

Offline

#2 2018-03-20 19:06:24

qb_dp
Member

Re: executeSQLで取得したデータをフィールドに挿入したい

一例です。
以下のようにすると、フィールド内の値、コンマ 改行 ダブルクォーテーション に関係なく値の取得が行なえます。


変数を設定 [$query; 値:
    Let([
        query="
        select
            '$id={]'||`id`||'{]'
        ,    ';$価格={]'||`価格`||'{]'
        ,    ';$商品名={]'||`商品名`||'{]'
        FROM `TABLE NAME`
        WHERE
        `日付フィールドなど`  BETWEEN '{Start}' AND '{End}'
        "
        ];
            Substitute ( query ;
                ["`" ; "\""]
            ;    ["{Start}" ; $Start]
            ;    ["{End}" ; $End]
             )
       
        )]
変数を設定 [$Result; 値:ExecuteSQL ( $query ; " " ; "{" & Char ( 182 ) & "}"  )/*{¶}*/]                                                       
変数を設定 [$Result; 値:Substitute ( $Result ; [ ¶ ; Char ( 182 ) ] ; [ "{" & Char ( 182 ) & "}" ; ¶ ] )]                                                       
変数を設定 [$Result; 値:/* ダブルクォーテーション処理 */  Substitute ( $Result          ["\\" ; "\\\\"]     ;     ["\"" ; "\\\""]     ;     ["{]"     ;    "\""]  )]   

変数を設定 [$MAX; 値:ValueCount ( $Result )]
変数を設定 [$n; 値:1]
Loop
Exit Loop If [$n > $MAX]
変数を設定 [$ROW; 値:GetValue ( $Result ; $n )]
変数を設定 [$er; 値:Evaluate ( "Let ( [" & $ROW & "] ; 0 )" )]

/*新規レコードとか?*/
フィールド設定[table::a;$id]
フィールド設定[table::b;$価格]
フィールド設定[table::c;$商品名]

変数を設定 [$n; 値:$n+1]
End Loop

Offline

#3 2018-03-21 19:18:00

サンサン
Member

Re: executeSQLで取得したデータをフィールドに挿入したい

詳しいコードまで書いて頂いてありがとうございます!私の力量では直ぐに理解ができないので、
1つ1つスクリプトを読み解いて理解していきたいと思います。ありがとうございます。

Offline

#4 2018-04-16 17:27:54

サンサン
Member

Re: executeSQLで取得したデータをフィールドに挿入したい

こんにちは。以前紹介頂いたコードがよくわかりません。

'$id={]'||`id`||'{]'

ここの、シングルクオテーションや||や、バッククォートは何をしているんでしょうか?

また、
変数を設定 [$Result; 値:/* ダブルクォーテーション処理 */  Substitute ( $Result          ["\\" ; "\\\\"]     ;     ["\"" ; "\\\""]     ;     ["{]"     ;    "\""]  )]   

の["\\" ; "\\\\"]     ;     ["\"" ; "\\\""]     ;     ["{]"     ;    "\""] が何をやっているのかがわかりません。
宜しくおねがいします。

Offline

#5 2018-04-17 13:26:42

calafate
Member

Re: executeSQLで取得したデータをフィールドに挿入したい

質問1の方は全然問題ないと思います。
質問2の方は単純に区切り文字を","から"|"とかに変えておけばいいかと思います。
ExecutSQL(
"
SELECT
FROM
WHERE
"
;"" //ここを;"|"にする
;""

結果
1|10|飴
2|99,999|掃除機

が返ってくるので
Substitute($行;"|",¶)
でやれば99,999はそのままです。

Offline

#6 2018-04-17 18:10:46

qb_dp
Member

Re: executeSQLで取得したデータをフィールドに挿入したい

>ここの、シングルクオテーションや||や、バッククォートは何をしているんでしょうか?

■シングルクオテーション
SQL クエリー では、シングルクオテーションで包むと文字列として扱われます。FileMakerだとダブルクォーテーションと同等。

■||
文字列などを結合します。FileMakerだと計算式内の & と同等。

■バッククォート
普通に書くと以下のように \" が多くなり見づらいので ` で代用。 実行前に置換 Substitute ( query ; ["`" ; "\""].....
        select
            '$id={]'||\"id\"||'{]'
        ,    ';$価格={]'||\"価格\"||'{]'
        ,    ';$商品名={]'||\"商品名\"||'{]'
        FROM \"TABLE NAME\"


>["\\" ; "\\\\"]     ;     ["\"" ; "\\\""]     ;     ["{]"     ;    "\""] が何をやっているのかがわかりません。
$Result を追っていけば分かりやすいかと思います...。


最終的に
Evaluate ( "Let ( [" & $ROW & "] ; 0 )" )
で、各変数に値を格納したいので以下のようになるように色々置換しています。

$商品名="商品名¶2行目\"文字列\""

スクリプト内で書くとややこしいですね。
["\\" ; "\\\\"]
\ を \\ に置換です。

["\"" ; "\\\""]
" を \" に置換です。


私の上げたサンプルは、フィールド内の値に、コンマ 改行 ダブルクォーテーション があっても大丈夫なデータ取得方法です。
改行 ダブルクォーテーション がない場合は、calafateさんが上げている感じで良いと思います。

Offline

#7 2018-04-17 19:23:17

calafate
Member

Re: executeSQLで取得したデータをフィールドに挿入したい

qb_dpさん
大変勉強になります。

Offline

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

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.019 seconds, 12 queries executed - Memory usage: 521.06 KiB (Peak: 525.6 KiB) ]