FileMaker独自の考え方である「繰り返しフィールド」。フィールドを配列のように取り扱うことができ、1つのレコードの1つのフィールドに複数の情報を格納することができる。さまざまな要因であまりオススメはできない機能のひとつだが、場面によっては便利であることも確か。今回はこの繰り返しフィールドをWeb公開で扱うときの注意点を紹介しよう。

繰り返しフィールドのメリット、デメリット

FileMaker独自の考え方である「繰り返しフィールド」。フィールドを配列のように取り扱うことができ、1つのレコードの1つのフィールドに複数の情報を格納することができる。場面によっては有効なこの機能だが、デメリットがやや多いように見受けられる。筆者が考えるメリットデメリットを次にまとめる。

デメリット

  • レコードのインポート・エクスポート時に注意を払う必要がある:
    FileMaker上からXMLでデータをエクスポートして、同じFileMakerにそのXMLをインポートした場合でも繰り返しフィールド内の2番目以降の値は無視されてしまう(Importing An XML File Created By FileMaker Pro That Contains Repeating Fields Only Imports Data From The First Repetition)。FMPXMLRESULT文法のXMLをFileMaker Proで加工する場合は要注意
  • 他データベースへデータを移行したい場合に手間がかかる:
    繰り返しフィールドはFileMaker独自の考え方。CSVでデータをやり取りする際も、繰り返しフィールドの中身をどう加工して出力するかを検討しなければならない
  • 繰り返しフィールド内の値をもちいた集計に難あり:
    FileMakerのヘルプでも触れられているとおり、繰り返しフィールド内の値を集計してレポートを作成するのは簡単ではない。これらを集計するには、計算フィールドと繰り返し関数・統計関数を駆使する必要がある

メリット

  • 実装スピードの高速化: デメリットに挙げた点に当てはまらない場合においては、実装スピードの高速化が期待できる。たとえば使い捨てのツールや、Web APIにアクセスするクライアントを作成したい場面においては開発者にとって都合のいい機能になるだろう

最近のFileMakerのバージョンではGetNthRecordやListといった関連レコードを簡単に取り扱うことが可能な関数もある。そもそも設計ができていればテーブルの分離がされており、繰り返しフィールドが必要になる場面は少ないだろう。しかし以前のバージョンから7系のバージョンに変換して運用しているアプリケーションの場合は、やむをえず繰り返しフィールドが使用されている場面がある。この繰り返しフィールドをWeb公開で扱うときに注意しなければならない点を紹介しよう。

XML Web公開での繰り返しフィールド

まずは1テーブルで繰り返しフィールドを配置した場合。

レイアウト「reptest」。フィールド「repeatingfields」は最大繰り返し数が5の繰り返しフィールド

XML Web公開が返すFMPXMLRESULT文法のXMLと、FX.phpでアクセスした場合に変数に返る結果は次のとおり。

レイアウト「rep_test」にアクセスした場合のFMPXMLRESULT文法のXML。繰り返しフィールド内のデータは<COL><DATA>に複数格納されている

レイアウト「reptest」にFX.phpでアクセスし、返り値をvardump()したもの。繰り返しフィールド内のデータはrepeating_fieldsの配列それぞれに格納された

ここでのポイントは、繰り返しフィールドの場合、レイアウトに配置した繰り返しフィールドの繰り返し数は関係がないということ。最大繰り返し数が5の繰り返しフィールドを、繰り返し数3でレイアウトに配置した場合でも、XML上には5つ分のフィールド内容が返る。最大繰り返し数が大きいフィールドの場合、レイアウトに配置しただけでパフォーマンス劣化の原因につながるので注意されたい。

続いてポータル内に繰り返しフィールドが配置されている場合。

レイアウト「reptestrepInPortal」。フィールド「versions」は最大繰り返し数が5の繰り返しフィールド。ポータル内には繰り返し数3で配置

XML Web公開が返すFMPXMLRESULT文法のXMLと、FX.phpでアクセスした場合に変数に返る結果は次のとおり。

レイアウト「reptestrepInPortal」にアクセスした場合のFMPXMLRESULT文法のXML。3番目<COL>内の<DATA>数に注目

レイアウト「reptestrepInPortal」にFX.phpでアクセスし、返り値をvar_dump()したもの。関連レコード数は4なのでポータル内通常フィールドの配列の要素数は4だが、繰り返しフィールドの場合は1関連レコードに対して最大繰り返し数分の要素が追加される

ポータル内に繰り返しフィールドを配置した場合、該当フィールドの配列のキー番号は定義済みの最大繰り返し数分繰りあがる。さきほどと同様、レイアウト・ポータル内に配置した繰り返し数は無視される。たとえば関連レコード1番目の繰り返し1番目のフィールド内容は['versions'][0]に、関連レコード2番目の繰り返し1番目のフィールド内容は['versions'][5]となる。PHPでポータル内の繰り返しフィールド内容を取得する場合は、最大繰り返し数分の計算を式に組み入れる必要がある。

レイアウト「reptestrepInPortal」にFX.phpでアクセスした場合、配列の対応は図のようになる

XML Web公開において繰り返しフィールドを使用する場合においての注意点を総括すると

1 繰り返しフィールドはレイアウトに配置したフィールドの繰り返し数に関係なく、つねに定義済みの最大繰り返し数分のフィールド内容が返る 2 ポータル内に繰り返しフィールドを配置した場合、該当フィールドの配列のキー番号は定義済みの最大繰り返し数分繰りあがる

ポータル内の繰り返しフィールドを文字列加工したい場合、これらのことを頭に入れながら実装をする必要がある。PHPで実装する場合は計算フィールドを使用しない分パフォーマンスが期待できるが、実装に手間がかかる。計算フィールドを使用して文字列加工する場合、その分パフォーマンスの低下が懸念されるが実装が簡単な上、仕様変更に強い。たとえば繰り返しフィールドの内容をカンマ区切りで表示したい場合、計算フィールドでは次の式を定義するだけでOKだ。

Substitute ( List ( <繰り返しフィールド名> ) ; "¶" ; ", " )

場面によっては繰り返しフィールドは有用な機能だが、その分ほかで苦労しなければならない点がでてきてしまう。Web公開でデータを加工する場合は、基本的に繰り返しフィールドは使用しない。どうしても必要なときは、FileMakerの計算フィールドである程度文字列加工をおこなった上でWeb公開するのが望ましい。パフォーマンスを取るか実装の柔軟性を取るか判断にむずかしいところだが、環境や場面に応じて実装を使い分けよう。