FileMakerと4Dを同期したい
使えるJSON
FileMakerも4DもJSONがまぁ使える様になった。
4D側は、選択されているレコードを、テーブル構造のフィールド名と値のセットにしたレコード数分のJSON配列に1命令で変換してくれる。(これ便利。なんと逆も可能でJSONをレコード情報に一発で復元できる)
FileMaker側はJSONの属性名を変数に取り出して、その変数名に合致するフィールドに値をセットする事ができる。この時FileMakerらしいのはフィールド属性(テキスト、数値)だか無視して値を設定しても良きに計らってくれるのだ。
先ずは、4D側のデータ取り出しAPIを整備する。
$s:=get_WFValue_by_name ("dt") //
If ($s#"")
$dt:=Date($s)
Else
$dt:=Current date(*)
End if
QUERY([Fax];[Fax]DATE=$dt)
$s:=Selection to JSON([Fax])
WEB SEND TEXT($s;"application/json")
http://[hostname]/4DCGI/fm/FAX/list?dt=2020/1/1
てな具合にアクセスすると、JSON配列の文字列を取得できるようになる。
特筆すべきは4D側の処理の簡単さで、アクセス制御したりエラー処理したりといった周辺を除いていくと・・・
- レコードをクエリ
- 検索結果をJSON文字列に変換
- 文字列をMIME type指定して送出
という3行の命令で完了してしまう。超ラクチン。
ただしWebデータ送出を使うためには、4Dにウェブ公開できる要するためのライセンスを追加する必要があるので注意。デバッグ検証だけなら小一時間稼働できるモードがあったりする。
FileMaker側でデータをパースしてレコードに置き換える。
テーブル定義はこんな感じ。同期したい4D側の定義と全く同じ名前にしておく。
そして、同期が発生するアクションで下記スクリプトを実行する。
赤枠の部分がポイントで、JSONの属性名がそのままフィールド名になり、値を良きに計らって保存してくれる。IDについては毎回設定する必要なく、場合によっては更新させたいので検索キーとしても使っている。
こういう節操のない動きに抵抗がなければ、ほんとファイルメーカーは簡単なソリューション構築の選択肢になってくる。
4D -> FileMakerの同期が完成だ。
いわゆるPull型というか、FileMakerのGUIで某かのアクションが発生した時必要に応じてデータを引っ張ってくるタイプの同期ができるようになったのである。
実は、FileMakerがクライアントになるタイプでのJSON活用は、そのままのコードがFileMaker Goでも動作する。つまり、API提供するサーバー側は何でもOKで、iPadをクライアントにしたソリューションがいろいろと作れてしまうのです。
次は、逆方向か。FileMakerのデータを外部から取り出しできるようにしてみる・・・