0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FileMakerAdvent Calendar 2016

Day 23

FileMaker API では一部のスクリプトステップは実行できない

Last updated at Posted at 2016-12-22

FileMaker API によるスクリプトの実行

FileMaker API for PHP にしろ XML にしる(またはそれをラップした各種ライブラリにしろ)、スクリプトを実行するメソッドというものが用意されています。

しかし、そのメソッドを実行した場合でも、全てのスクリプトが正しく実行されるわけではありません。このことは公式のマニュアルに書いてあるのですが、気づきにくいですのでここにまとめたいと思います。

まずは公式マニュアル

こちらのページから公式マニュアルを落としてください。FileMaker Server 14 用ですが、大して変わりはありません。

注意書きを読む

落としたら 18 ページの「FileMaker スクリプトとカスタム Web 公開」をご覧ください。重要部分を引用します(太字は引用者による)。

FileMaker は多くのスクリプトステップをカスタム Web 公開でサポートしています。URL にクエリー文字列でスクリプトを使用すると、Web ユーザはさまざまな自動化タスクを実行できます。カスタム Web 公開がサポートするスクリプトステップを表示するには、FileMaker Pro スクリプトワークスペースウインドウで [互換性] ボタンをクリックして [カスタム Web 公開] を選択します。グレー表示されていないスクリプトステップがカスタム Web 公開でサポートされています

そうです、全てのスクリプトステップが API で実行できるわけではないのです。

どのスクリプトステップが API で実行できる(できない)のか

API で利用できるスクリプトステップの一覧については以下のページの表が見やすいです1

ここの「カスタム Web 公開」に「○」が記入されているスクリプトステップが API で利用できるスクリプトステップになります。

API で実行できないスクリプトステップを実行するとどうなるか

API で実行できないスクリプトステップを API 経由で実行するとエラー(エラーコード)として「3」が返ってきます。

具体的に各ライブラリで返ってくる様子を見てみましょう。まずは FileMaker API for PHP です。

fmapi_for_php_error_3.php
# php fmapi_within_error3.php
FileMaker Error Code: 3<p>Command is unavailable (for example, wrong operating system, wrong mode, etc.)</p>

次に FX.php です。返り値をvar_dumpしたものになります。

array(9) {
  ["data"]=>
  array(0) {
  }
  ["linkNext"]=>
  string(0) ""
  ["linkPrevious"]=>
  string(0) ""
  ["foundCount"]=>
  int(0)
  ["fields"]=>
  array(0) {
  }
  ["URL"]=>
  string(166) "hogehoge"
  ["query"]=>
  string(0) ""
  ["errorCode"]=>
  string(1) "3"
  ["valueLists"]=>
  array(0) {
  }
}

返ってくるエラーメッセージの構造は使用するライブラリによりまちまちです。エラー処理を行うために故意にエラーを起こしてその構造をチェックして、それを判定基準にした上の処理を書くということをする必要があるかなと思います。

実行できないスクリプトステップを強制的にスキップする方法

実は、実行できないと書かれているスクリプトステップを強制的にスキップし、スクリプト全体を実行する方法が存在します。

FileMaker 14 を使えばいい?

冒頭のマニュアルの 19 ページには以下のような記述があります。

スクリプトにサポートされないステップが含まれる場合(Web 互換ではないステップなど)、そのステップを実行すると FileMaker Pro エラー 3(「コマンドが使用できません」)が返されます。サポートされないスクリプトステップはスキップされ、スクリプトの実行が続行されます。FileMaker 14 では、[ ユーザによる強制終了を許可 ] スクリプトステップは、サポートされないスクリプトステップの動作に影響しません。

なるほど、FileMaker 14 では「サポートされないスクリプトステップ」は関係ない話だと2

しかしながら……

FileMaker 14 でも「サポートされないスクリプトステップ」があればそこで動作が停止します。つまり、マニュアルの内容は False です

結局、FileMaker 13 以前と同じ手法で回避する

そんなため、FileMaker 13 以前と同じ方法で「サポートされないスクリプトステップ」をスキップをする方法を用います3

マニュアルの 18 ページの最下部をご覧ください。

スクリプトに不明なステップが含まれる場合(廃止されたステップや認識されないステップなど)、そのステップを実行すると FileMaker Pro エラー 4(「コマンドが見つかりません」)が返されます。後続のステップの処理方法を決定するには、[ ユーザによる強制終了を許可 ] スクリプトステップを使用します。

[ユーザによる強制終了を許可] スクリプトステップオプションが有効(オン)の場合、不明なスクリプトステップはスクリプトの続行を停止します。

つまり、「ユーザによる強制終了を許可」を有効にしてあげれば、スクリプトは止まらずに進んでくれるのです。

しかし現場では……

それならば全部のスクリプトで「ユーザによる強制終了を許可」を有効にすればいいじゃないか、と思うかもしれません。でも、スクリプトを用いるインターフェイスは API だけではないでしょう。

エンドユーザが FileMaker 上でスクリプトを用いる場合があるはずです。むしろそちらの方が多いかもしれません。そこでは、何らかの意図を持ってスクリプトステップが用いられているはずです。

操作ミスを防ぐために確認のダイアログを出したり、複数の操作選択肢の中からどの操作を選択するかを選ばせるためにダイアログを出したり、といったことです。また、まとめて多くの(数万単位)レコードを操作する際にスクリプトを回すことも多いでしょう。これらのスクリプトステップを無条件で飛ばしてしまい、ESC キーによるキャンセルをできなくすることはリスクが大きすぎます。

となるとどうすればいいのでしょうか。考えられることとしては、同内容のスクリプトを手動操作用と API 操作用に分けることかと思います。ただしこれは典型的なバッドノウハウです。スクリプトの改変があったときに双方のコードを書き換えなくてはなりません。

とは言え、現在の FileMaker ではまともなコード管理ができません。重要で頻度が高い API 利用に絞ってこのような運用をすることは現実的にはやむを得ないでしょう。

もう一つの方法としては、スクリプトの内容を全て API で書き下す(全てのスクリプトの動作を PHP や Ruby で書く)ことです。ただし、これは必ずしも可能かどうかは場合によります。

がんばりましょう

FileMaker というシステム自体がそういうものですので、できる範囲でがんばりましょう。もしかしたら一番ラクなのは、FileMaker のデータを適宜 Fluentd 的に RDBMS に流し込み、そちらのデータで処理することかもしれません4

  1. バージョン 14 以降でこの表が見つけられませんでした……

  2. だから「FileMaker 13 でのスクリプトステップの互換性」のようなページが存在しなかったのですね……

  3. FileMaker 15 でどうなっているかは未検証です

  4. それじゃあ FileMaker の意義って……とかは言わないこと

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?