JSON + バーチャルリスト

先週(2019/3/9)のFM-Chubu野田さんとお話できる機会があり、いろいろな知見を得ることができました。
今回は野田さんからお勧めいただいたFileMakerHacksのJSONとバーチャルリストに関する記事を紹介します。


FileMaker Hacks logo

JSON + Virtual List

(元記事はこちら)

Kevin Frank
2017/7/27

2017/7/31追記 : この記事のパート2のコメント欄でのBeverly Vothとのやりとりの結果を受けて、ここで使われている日付のエンコードのテクニックは、FileMaker内でJSONの生成と消費が完結する場合のみに有効であることを明記しておきます。

2017/7/29追記: コメント欄でのJohn Renfrewとのやり取りを受けてデモファイルを更新し、最低でもFileMaker 16.02が必要になりました。

FileMakerが毎年バージョンアップされるようになったことのいい点は、常に新しく学んだりこうやって記事に書く題材があることです。そして最近Devcon 2017で聴講したJSON (JavaScript Object Notation)に関するとても参考になるセッション(Todd GeistとAnders Monsenに感謝します)によって、JSON + バーチャルリストが私にとって魅力的な組み合わせだということがわかりました。

2017-07-27_152145

デモファイル: json-plus-virtual-list.zip

私の当初の計画はバーチャルリストによるレポート生成にJSONを組み込むことでしたが、趣旨を明確にするため、それは将来の記事のためにとっておくことにしました。今回の記事では、簡単なデモで、a) 標準のFileMakerテーブルから少量のJSONを生成し、次に b) バーチャルリストテーブルに表示するまでを示します。

はじめに

ここ数ヵ月の間にFMP + JSONに関する入門記事がいくつも出たので、すでに十分説明された内容をここで再度述べるつもりはありません(詳細については、この記事の最後の参考リストを参照してください)。バーチャルリストの概念についてもここでは説明しません。もしわからない場合、または復習をしておきたい場合は、 バーチャルリストによるレポート作成(パート1)を参照してください。

今回は、まずFileMakerの組み込み関数JSONSetElementを使用してJSONを生成し、次にもう一つのFileMakerの関数JSONGetElementを介して、バーチャルリストテーブル内の繰り返しの計算フィールドを使用してそのJSONを解析します。

以下はjson.orgのイントロダクションからの引用です。

JSONは2つの構造の上に成り立つ

  • 名前/値ペアの集合。各種の言語でこれは、オブジェクト、レコード、構造体、辞書、ハッシュテーブル、キー付きリスト、連想配列として実装される。
  • 値の順番付きリスト。多くの言語でこれは、配列、Vector、リスト、シーケンスとして実装される。

…そしてこれら二つの構造はしばしば創造的な方法で組み合わされます。ただし、今回は主に最初の構造、つまり名前/値のペアで構成されるオブジェクトに注目します。

以下に示すのは、JSONSetElementを使って作成することができる小さなJSON配列です。その下に、JSONGetElementを使用してその配列から個々のデータを取得する方法を示します(JSONは0から始まるインデックスを使用します)。

2017-07-27_182751
変数$$arrayJSONの内容が上の通りの場合、左下の各式はそれぞれ右のようになる

注1: 上記のJSONはJSONFormatElements関数を使用して整形されています。これは、オブジェクト内の要素を、要素が作成された順序に関係なく、アルファベット順に並べたものです。

注2: JSONには「日付」タイプがないため、日付を数字としてエンコードすることにしました。これにより、たとえば「8/1/2017」のように国によって解釈が異なることによる混乱を避けることができます。

JSONを生成する

デモでは、以下のスクリプトでsalesレコードをループ処理して$$arrayJSONという変数に値を設定/更新してJSONを生成します。

上記のように、JSONは0から始まるインデックスを使用します。したがって、ステップ6で$indexを0に設定し、その後ステップ11でインクリメントします。基本的に$indexは1ではなく0から始まるカウンタです。

ループから抜け出た後、$$arrayJSONの内容は以下のようになります。

2017-07-27_171907

ここで名前/値ペアの「名前」は、“date”, “customer”などではなく、“col 1”, “col 2”, “col 3”, “col 4”, “col 5”となっています。

JSONを解析する

以下がスクリプトの残りの部分です。

2017-07-27_173459

…これが完了すると、バーチャルリストテーブルは$$arrayJSON内のデータと同じになります。

2017-07-27_173701

すでに明らかではありますが、以下のように動作します。

  • cell_date_r [1]は”col 1″を表示
  • cell_text_r [2]は”col 2″を表示
  • cell_text_r [3]は”col 3″を表示
  • cell_num_r [4]は”col 4″を表示
  • cell_num_r [5]は”col 5″を表示

…そして最初の行(IDは1ではなく0)から始まる各行は、salesテーブルの行をループ処理したときに生成された5つのJSONオブジェクトのうちの1つに対応します。

バーチャルリストテーブルのフィールド定義は次のとおりです。

2017-07-28_100543

定義は、3つの”cell_”で始まる計算フィールドすべてで同じで、結果タイプのみが異なります。

2017-07-28_100731
[索引オプション…]で[計算結果を保存せず必要時に再計算する]をチェック

最後に

次回の記事では、今回のテクニックをバーチャルリストによるレポート生成で機能するように拡張します。

FileMakerとJSONに関する記事およびFileMaker JSONのヘルプページへのリンク

Leave a Reply