Claris FileMaker Server

Claris FileMakerは、テーブル、TO(テーブルオカレンス)、レイアウトといったオブジェクトを利用します。Web共有からテーブルを直接指定できず、TOも直接指定できません。指定できるのはレイアウトのみであり、レイアウトが事実上のテーブルに相当するエンティティとなります。したがって、定義ファイルのnameキー、viewキー、tableキーには、レイアウト名を指定することになります。たまたま、同じ名前のテーブルやTOがあっても、FileMakerのWebアクセス時に実際に利用するのはその名前のレイアウトとなります。

フィールドのタイプで、日時の記録用に「日付」「時刻」「タイムスタンプ」の3つがあります。Web経由では、「月/日/年 時:分:秒」のフォーマットにする必要があります。FileMaker Serverの最新バージョンではフォーマットを変更するオプションが用意されていますが、INTER-Mediatorではサポートしていません。また、日付フィールドに時刻を含む文字列を入力、もしくは時刻フィールドに日付を含む文字列を入力すると、エラーになり処理は何もされません。その「日付等の書式エラー」の番号は500ですが、この500はFileMakerが規定したエラー番号であることに留意してください。

データベース側の設定

FileMaker Serverでは、INTER-MediatorからはFileMaker ServerのXML Web公開機能もしくはFileMaker Data APIを使用しているため、XML Web公開もしくはFileMaker Data APIでのアクセスを許可する必要があります。INTER-Mediatorが使用するアカウントを用意し、XML Web公開もしくはFileMaker Data APIでのアクセスを許可するようにしてください(XML Web公開の拡張アクセス権のキーワードは「fmxml」、FileMaker Data APIの拡張アクセス権のキーワードは「fmrest」)。

FileMaker Data APIを利用する場合

INTER-Mediator 5.8以降でFileMaker Data APIに対応しています。FileMaker Data APIを利用するにはFileMaker Server 17以降が必要であり、Data API ライセンスが必要になるほか、Admin ConsoleでFileMaker Data APIを有効にする必要があります。db-classキーで指定するデータアクセスクラスの名前は「DB_FileMaker_FX」の代わりに「DB_FileMaker_DataAPI」を使用します。serverキーで「127.0.0.1」や「localhost」を指定していた場合には「localserver」を指定するように変更します。

Windows版FileMaker Serverにおける注意点

Windows版FileMaker Serverではmbstring拡張モジュールが標準で有効になっていません。FileMaker Serverフォルダ内のWeb Publishing > publishing engine > phpフォルダ以下にある「php.ini」ファイルにおいて「;extension=php_mbstring.dll」を「extension=php_mbstring.dll」に変更した上でIISの再起動を行い、mbstring拡張モジュールを有効にする必要があります。

定義ファイルに記述するテーブル名

FileMaker Serverでは、定義ファイルに記述するテーブル名(nameキーの値)は、FileMakerデータベースのレイアウト名を指定する必要があります。

各コンテキストにはレイアウトが必要

FileMaker Serverでは、カスタムWeb公開機能の仕様上、各テーブル/コンテキストごとにレイアウトを用意して、表示や更新に必要なフィールドを各レイアウト上に配置する必要があります。

主キーを省略できる場合

リレーションを設定していない場合、テーブル内の主キーや定義ファイルでの主キーの指定(keyキー)は不要です。リレーションを設定している場合、後述で説明するポータルアクセスモードを有効にすることで主キーの指定を省略できる場合があります。

内部レコードIDのフィールド名

内部レコードIDのフィールド名は、XML Web公開では「-recid」、FileMaker Data APIでは「recordId」です。

FileMaker Data APIでスクリプトを利用する場合

実行するFileMakerスクリプトの最後に、「Get (対象レコード数) & "/" & Get (レコード総数)」を結果として返すように[現在のスクリプト終了]スクリプトステップを入れる必要があります。こうすることでスクリプトが複数回実行されないようになります。

FileMaker Data APIでグローバルフィールドを利用する場合

FileMaker Data APIでグローバルフィールド値を設定する場合、レイアウト名とTO名が一致しない場合には、globalキー内のfieldキーの値は「TO名::フィールド名」の形式で指定する必要する必要があります。

ポータルアクセスモード(Ver.6以降では未サポート)

関連テーブルのデータをレイアウト上にあるポータルから取得する場合、定義ファイルでrelationキーの下位キーでportalキーの値をtrueとすることで、ポータルアクセスモードを利用できます。ポータルアクセスモードを利用することで、関連テーブル用の別レイアウトを作成する必要がなくなり、動作が若干高速化されます。

定義ファイルでは、relationキーのあるコンテキストのnameキーにテーブルオカレンス名(リレーションシップグラフで確認できる名称)を、viewキーにはポータルがあるレイアウト名を指定します。ページファイルでフィールドを指定する際には、「(nameキーの値)@(nameキーの値)::(フィールド名)」という形式で記述する必要があります。

なお、関連テーブルのレコードを追加できるようにするためには、FileMakerデータベースのレイアウト上においてポータル内に関連テーブルの主キーフィールドを配置した上で、FileMakerデータベースのリレーションシップグラフにおいて「このリレーションシップを使用して、このテーブルでのレコードの作成を許可」にチェックをつける必要があります。

Ver.6以降で未サポートの機能

以下の機能は、Ver.6以降では未サポートです。

  • ポータルアクセスモード

Ver.9以降でサポートされなくなった機能

以下の機能は、Ver.9以降でサポートされなくなりました。

  • FileMakerデータベースファイルに登録されているアカウントを使った認証・認可

未サポートの機能

以下の機能は、現在のバージョンでは未サポートです。

  • 繰り返しフィールド

PostgreSQL

PostgreSQLのサンプルを動かすためのデータベースのスキーマファイルは、INTER-Mediatorのレポジトリでは、

dist-docs/sample_schema_pgsql.txt

というファイルにあります。冒頭にコマンド例がありますが、PostgreSQLがどのOSのどのディストリビューションで動いているかによって、いろいろ違いがあると思います。例えばOS X Serverの場合:PostgreSQLの稼働ユーザはpostgresではなく、_postgresです。-Uの引数を_postgresにします。

INTER-Mediatorとの絡みについては、MySQLとほとんど同じなのですが、1点違いがあります。PostgreSQLでは、主キーフィールドにシリアル値を入力する方法として、SEQUENCEオブジェクトを利用する方法と、SERIAL型を利用する方法があります。どちらの方法も、原則として、定義ファイルのIM_Entry関数の第1引数にあるコンテキストに、'sequence' => 'xxxx' として、SEQUENCEオブジェクトを指定する必要があります。ただし、省略可能な場合もあります。

sequenceキーに対する値がない場合の問題は、ページネーションコントロールを表示して1レコードずつ表示しているとき、「レコード追加」ボタンをクリックしてレコードを作成した場合、新たに作られたレコードが現在のレコードになっておらず、レコードの移動をしないといけません。他は問題ないのですが、これだけの問題ではありますが、使い勝手が変わるので注意が必要です。なお、検索して参照するだけなら、sequenceキーの指定はなくてもいいのかもしれません。

SEQUENCEオブジェクトを使用する場合

SEQUENCEオブジェクトを使用する場合、スキーマは以下のようになると思います。SCHEMAはim_sample、アクセスユーザはwebを想定しています。テーブルとシーケンスの両方のオブジェクトにアクセス権を与えるのを忘れないようにしましょう。

CREATE SEQUENCE serial START 1000;
CREATE TABLE person (
    id INTEGER DEFAULT nextval('serial'),
    :
}
GRANT ALL PRIVILEGES ON im_sample.serial TO web;
GRANT ALL PRIVILEGES ON im_sample.person TO web;

そして、定義ファイルでは、次のように、sequeceキーで、シーケンスオブジェクトの名前を指定します。

array(
    'records' => 1,
    'paging' => true,
    'name' => 'person',
    'view' => 'im_sample.person',
    'table' => 'im_sample.person',
    'key' => 'id',
    'repeat-control' => 'insert delete',
    'sequence' => 'im_sample.serial',
),

SERIAL型を利用する場合

SERIAL型を利用する場合、以下のように、主キーフィールドの型をSERIALにすると思われます。このとき、背後では、「テーブル名_フィールド名_seq」というシーケンスオブジェクトが自動的に作られて、初期値が1になっています。自動的に作られるオブジェクトとは言え、アクセス権の設定は記述する必要があるのが一般的でしょうから、im_sample.person_id_seqに対してwebアカウントのアクセス権も設定しなければなりません。

CREATE TABLE person (
    id SERIAL PRIMARY KEY,
}
GRANT ALL PRIVILEGES ON im_sample.serial TO web;
GRANT ALL PRIVILEGES ON im_sample.person_id_seq TO web;

SERIAL型を使った場合、INSERTでレコードを新規に作るときに、ここでのidフィールドへの値を代入はしないようにします。もし、自分で値を設定したい場合は、シーケンスの値と当たらないようにしないといけませんが、そこまでの状況でSERIAL型を使う事はほぼないと思われます。

そして、定義ファイルでは、このときも、次のように、sequeceキーで、シーケンスオブジェクトの名前を指定できます。しかしながら、sequenceキーの値が存在しない場合は、tableキーとkeyキーの値から自動的に標準のシーケンス名を生成するので、原則、sequenceキーの指定は不要です。SEQUENCEオブジェクトが正しく機能しないと、1レコード表示時に新規レコードを作成しても、新規レコードが編集状態で開いてくれません。

array(
    'records' => 1,
    'paging' => true,
    'name' => 'person',
    'view' => 'im_sample.person',
    'table' => 'im_sample.person',
    'key' => 'id',
    'repeat-control' => 'insert delete',
    'sequence' => 'im_sample.person_id_seq',
),