動作検証:FileMaker Pro 19.6
こんなカンジのテーブルのデータをExecuteSQLで取得し、
サンプルデータ
以下のようなJSON形式のデータを返します。
結果
[
{
"code": "1",
"name": "鈴木 太郎",
"note": "1行目\n2行目"
},
{
"code": "2",
"name": "佐藤 花子",
"note": "旧姓:\"田中\""
}
]
スクリプト
//#クエリを作成
変数を設定 [ $query; 値:Let ( [
~query ="select
'(((.code.))):(((.'||`code`||'.)))'
,'(((.name.))):(((.'||`name`||'.)))'
,'(((.note.))):(((.'||`note`||'.)))'
FROM `People`
WHERE `name` LIKE '%{名称}%'
FETCH FIRST 10000 ROWS ONLY "
];
Substitute ( ~query
; ["`"; "\""]
; ["{名称}"; GLOBAL::gSearch ]
)
)]
//#ExecuteSQLを実行
//#フィールド区切りを","、レコード区切りを"},{" で設定
変数を設定 [ $result; 値:ExecuteSQL ( $query ; "," ; "},{" ) ]
//#改行とダブルクォーテーションの処理
変数を設定 [ $result; 値:"[{" &
Substitute ( $Result
; [¶ ; "\n"] //改行を"\n"に置換
; ["\"" ; "\\\""] //ダブルクォーテーションを"\""
; ["(((." ; "\""]
; [".)))" ; "\""] ) &
"}]" ]
スクリプトの説明
クエリを作成
'(((.code.))):(((.'||`code`||'.)))'
(((. と .))) は、フィールド内で使用していない文字であれば何でも良いです。
視認性が良いので (((..))) を使用しています。
(((. と .))) は、最終的に " (ダブルクォーテーション)へ置換します。
|| は、クエリ内での連結文字
` (バッククォート)視認性が良いので使用しています。あとで、 " (ダブルクォーテーション)へ置換します。
\"
が増えるとクエリが読みにくくなるので。
最初の10000行を取得(なくても良いです)
FETCH FIRST 10000 ROWS ONLY
作成されたクエリ
※デバッグしやすいように一旦変数に入れてクエリを確認。
(GLOBAL::gSearch が空欄なので "name" LIKE '%%' となっている)
select
'(((.code.))):(((.'||"code"||'.)))'
,'(((.name.))):(((.'||"name"||'.)))'
,'(((.note.))):(((.'||"note"||'.)))'
FROM "People"
WHERE "name" LIKE '%%'
FETCH FIRST 10000 ROWS ONLY
ExecuteSQLを実行
フィールド区切りを","、レコード区切りを"},{" で設定
変数を設定 [ $result; 値:ExecuteSQL ( $query ; "," ; "},{" ) ]
結果
(((.code.))):(((.1.))),(((.name.))):(((.鈴木 太郎.))),(((.note.))):(((.1行目
2行目.)))},{(((.code.))):(((.2.))),(((.name.))):(((.佐藤 花子.))),(((.note.))):(((.旧姓:"田中".)))
JSON化
改行、ダブルクォーテーション と (((..))) の処理
変数を設定 [ $result; 値:"[{" &
Substitute ( $Result
; [¶ ; "\n"] //改行を"\n"に置換
; ["\"" ; "\\\""] //ダブルクォーテーションを"\""
; ["(((." ; "\""]
; [".)))" ; "\""] ) &
"}]" ]
結果
[
{
"code": "1",
"name": "鈴木 太郎",
"note": "1行目\n2行目"
},
{
"code": "2",
"name": "佐藤 花子",
"note": "旧姓:\"田中\""
}
]