はじめに
FileMaker便利だけれどUIとかレコード記録のタイミングが独特です。使い慣れたExcelからFilemakerへレコードを登録できれば便利ですね。ということでやってみました。
環境
サーバー
windows server 2012 R2
Filemaker server 17
クライアント
windows 10 pro
office 2016
準備
ExcelにMicrosotf XMLライブラリを追加する。これはやってもやらなくてもよい。
Filemaker側
アクセス先のデータベースを作る
SSLはテスト用のものが初期設定されているのでまあなくてもいい
管理コンソールからFilemaker Date APIを有効にしておく
アカウントにFilemaker Date API経由のアクセスを許可する
JSONをパースする
VBA-JSONを使おう
FileMakerからトークンを取得する
Dim strToken As String
Dim objHTTP As Object
Set objHTTP = CreateObject("MSXML2.XMLHTTP.6.0")
objHTTP.Open "POST", "https://[ホスト名]/fmi/data/v1/databases/[データベース名]/sessions", False
objHTTP.setRequestHeader "Authorization", "Basic [idpw]"
objHTTP.setRequestHeader "Content-Type", "application/json"
objHTTP.send
[データベース名]は日本語なら日本語のままで構わない
[idpw]はidとpwを:で連結した文字列をまとめてbase64エンコードする
FileMakerからとりあえずレコードを取得してみる
objHTTP.Open "POST", "https://[ホスト名]/fmi/data/v1/databases/[データベース名]/layouts/[レイアウト名]/records?_limit=5", False
objHTTP.setRequestHeader "Authorization", "Bearer " & strToken
objHTTP.setRequestHeader "Content-Type", "application/json"
objHTTP.send
[データベース名]はさっきのもの、[レイアウト名]は[データベース名]と同じく日本語なら日本語のままで構わない。limit=5で最大5件指定。
FileMakerから検索してレコードを取得する
Dim jsonObject As Object
Set jsonObject = New Dictionary
objHTTP.Open "POST", "https://[ホスト名]/fmi/data/v1/databases/[データベース名]/layouts/[レイアウト名]/_find", False
objHTTP.setRequestHeader "Authorization", "Bearer " & strToken
objHTTP.setRequestHeader "Content-Type", "application/json"
objHTTP.send JsonConverter.ConvertToJson(jsonObject, Whitespace:=2)
jsonObjectにクエリをディクショナリー形式で作成してVBA-JSONでJsonを生成する。
クエリの作成がややめんどくさい。以下のような感じで作成した。
Dim jsonObject As Object
Set jsonObject = New Dictionary
Dim issues As Object
Set issues = New Dictionary
jsonObject.Add "query", New Collection
jsonObject("query") = Array(issues)
issues("項目名") = "検索条件"
jsonObject("query")は検索条件の配列が格納されなければならない。
そしてissuesは項目と条件が対となったディクショナリー形式でなければなない。