FileMakerスクリプトをWeb上から実行する

FileMakerにはシンプルながら強力な一括処理を可能とするスクリプト※1が用意されている。ユーザ/デベロッパはスクリプトステップと呼ばれる一つの処理をならべていくだけで、さまざまなデータ加工や動作制御を実装することが可能だ。

※1 正式な表記は「スクリプト」だが、ここではPHPスクリプトとの混同を避けるために以降「FileMakerスクリプト」と表記する。

このFileMakerスクリプト(スクリプトステップ)だが、Web公開エンジンからも一部実行できるものがある。ScriptMakerを開き、FileMakerスクリプトの編集画面左下の「互換性を表示」メニューから"全体"のほかに"クライアント", "サーバ", "Web公開"を選択すると、それぞれに対応していないスクリプトステップはグレーアウト、または「(互換性なし)」と表示される。これを参考にFileMakerスクリプトを実装すればよい。

Web公開を選択中は、Web公開に対応していないスクリプトステップはグレーアウト, 互換性なしと表示される。この状態でWeb公開からFileMakerスクリプトを実行してしまうと、意図しない動作を引き起こしかねないため注意されたい

「複数のレコードに対して一括処理をおこないたい」「ポータルの中のレコードをもとに、あたらしいレコードを作成したい」という場合には、Webアプリケーション側で無理やりリクエストを生成するより、FileMakerスクリプトを組み、それを直接実行させたほうが近道だ。たとえばデータベースに保存されているレコード中、ある条件に一致したレコードに対して、特定のフィールドに同じ処理をおこなうとしよう。FileMakerスクリプトを使用しない場合は、次の実装をおこなう必要がある。

  • 案1. FMFind()で対象のレコードを絞りこみ、取得したレコードIDを基にループ処理で1件1件に対してFMEdit()を実行
  • 案2. 自己リレーションでポータル内に一括処理をおこないたいレコードが表示されるように実装し、FMFind()でポータル内のレコードIDを取得。取得したレコードIDをもとにポータル行別にSetPortalRow()し、FMEdit()を実行

文章にすると簡単だが、実際にこれらをコードに落としこむには大変な労力が必要だ。実装のコストに加えてさらに案1はサーバに大きな負荷がかかるし、案2は実装後のメンテナンスにも時間がかかる実装方法となってしまう。苦労のわりにはむくわれない結果になってしまう可能性が高い。その点、FileMakerスクリプトなら「検索して対象を絞込み」「フィールド内容の全置換」とほんの数行で終わってしまう処理だ。

実際に使用したFileMakerスクリプトは次のとおり。

FileMakerスクリプト「webScriptExecTest」。全置換をおこなっているだけのシンプルな内容だ

なお、FileMakerスクリプトを使用するにあたり次のレイアウトとフィールドを追加している。

  • レイアウト: web_list_2
  • フィールド: f_scriptMemo (タイプ: テキスト)

レイアウト「web_list_2」に配置したフィールド

FileMakerスクリプトを実行するPHPコードは次のとおり。

ファイル - fm_script.php

<?php

include_once('./fx/FX.php');
include_once('./fx/server_data.php');

$data = new FX($serverIP, $webCompanionPort, $dataSourceType, $scheme);
$data->SetDBData($databaseFileName,'web_list_2', 10);
$data->SetDBUserPass($webUN,$webPW);
$data->SetCharacterEncoding('utf8');
$data->SetDataParamsEncoding('utf8');
$data->AddDBParam('f_useOS', 'FreeBSD', 'eq');

// 実行したいスクリプト
$data->PerformFMScript('webScriptExecTest');
// スクリプトにわたす引数
// (FileMaker側では Get ( スクリプト引数 ) で受けとる)
$data->AddDBParam('-script.param', 'PHPからスクリプトを実行');

$dataSet = $data->FMFind();

echo '<pre>';
var_dump($dataSet);

FX.phpの場合はPerformFMScript('(スクリプト名)')またはAddDBParam('-script', '(スクリプト名)')で実行したいFileMakerスクリプト名を、AddDBParam('-script.param', '(スクリプト引数)')でスクリプト引数をわたす。返り値を表示するために、var_dump()を使用した。fm_script.phpを端末上から実行するか、Webブラウザでアクセスする。

Webブラウザでアクセス。ここで結果として返るfoundCountは、FileMakerスクリプト実行後の対象レコードだ

実際にFileMakerスクリプトが実行されたかどうか、FileMakerで確認してみよう。

検索条件「開発に使用しているOS(f_useOS)が"FreeBSD"」に一致したレコードのフィールド(f_scriptName)にPHPスクリプトからわたした引数が入力された

複雑な処理をともなう場合やFileMakerならではの特色を活かしたWebアプリケーションを実装する場合、Webアプリケーション上からFileMakerスクリプトを実行させる方法は必須のテクニックといえる。FileMakerスクリプトを実行させるために今回はPerformFMScript(処理完了時に実行)を使用したが、このほかにもPerformFMScriptPrefind(検索時に実行)やPerformFMScriptPresort(ソート時に実行)などが用意されているので場面に応じて使い分けるのが良いだろう。

Web公開・サーバのスケジュールから実行するFileMakerスクリプトとWebアプリケーションを連携させれば、データ加工以外にも特定のバッチ処理などがデベロッパのみならずエンドユーザサイドでも簡単に実装できるようになるところがFileMakerの嬉しいところだ。しかしながらFileMakerスクリプトを多用してしまうとトラブル時の原因の切り分け要素を増やすといったデメリットもあるため、使用する場面を見極めてから使うように心がけよう。