サーバー上のスクリプト実行の復習

p388cell
12 min readDec 9, 2018

--

サーバー上のスクリプト実行 : Perform Script On Server ( PSOS )

FileMaker 13 で追加した機能。FileMaker 17 からは名前を計算式で指定して実行できるようになった。

サーバー上でスクリプトを実行する理由

# ヘルプより引用クライアントとサーバー間のネットワークトラフィック量を減らすことでパフォーマンスを改善する。低速クライアントから高速なサーバーに長時間実行されるタスクをオフロードする。FileMaker Go ではなく FileMaker Server および FileMaker Cloud でサポートされているプラグインが必要なタスクを FileMaker Go クライアントで実行可能にする。サーバーの DSN を使用する ODBC データソースとともに [レコードのインポート] または [SQL を実行] スクリプトステップを使用する。

サーバー上のスクリプト実行 ( PSOS ) スクリプトステップを使用する際に注意する点はいくつかあります。今回は、その対策を確認していこうと思います。

サーバー上のスクリプト実行 ( PSOS )の注意点

  1. 「サーバー上のスクリプト実行」は、サーバー上に仮想のクライアントが立ち上がるイメージ。
    グローバルフィールドはクライアントとサーバーでそれぞれ独立して値を持つことになる。
    スクリプト中にグローバルフィールドの値を使用するものに関しては、スクリプト引数などで値を渡すなどの工夫が必要。
  2. サーバーサイドでも OnWindowOpen 等のスクリプトトリガは発火する。
  3. サーバーでは使用できないスクリプトステップがある。
  4. サーバー上ではローカライズされた関数は使用しない。
  5. パスに制限がある。
  6. スクリプト同時セッション最大数に制限がある。
  7. その他

1. サーバーにグローバルフィールドの値を渡す方法

グローバルフィールドはクライアントとサーバーでそれぞれ独立して値を持つことになるので、スクリプト中にグローバルフィールドの値を使用するものに関しては、スクリプト引数などで値を渡すなどの工夫が必要。

グローバルフィールドの一覧は以下の式で得ることができます。

ExecuteSQL ( "SELECT TableName,FieldName FROM FileMaker_Fields WHERE FieldType LIKE 'global%'" ; "::" ; "" )

この式を利用して、サーバーにグローバルフィールドのデータをまとめて引数として渡し、サーバー側でグローバルフィールドを設定することもできる。

# 実行するスクリプト変数を設定 [ $global_fields ; 値: ExecuteSQL ( "SELECT TableName,FieldName FROM FileMaker_Fields WHERE FieldType LIKE 'global%'" ; "::" ; "" ) ]
変数を設定 [ $max ; 値: ValueCount ( $global_fields ) ]
Loop
Exit Loop If
[ Let ( $i = $i + 1 ; $i > $max ) ]
変数を設定 [ $json ; 値: Let ( ~field = GetValue ( $global_fields ; $i ) ; JSONSetElement ( $json ; ~field ; Evaluate ( ~field ) ; JSONString ) ) ]
End Loop
サーバー上のスクリプト実行 [ 指定: 一覧から ; 「サーバー側で実行するスクリプト」 ; 引数: $json ; 終了するまで待つ: オン ]変数を設定 [ $Result ; 値: Get ( スクリプトの結果 ) ]~ 略 ~# サーバー側で実行するスクリプト変数を設定 [ $json ; 値: Get ( スクリプト引数 ) ]
変数を設定 [ $field_names ; 値: JSONListKeys ( $json ; "" ) ]
変数を設定 [ $max ; 値: ValueCount ( $field_names ) ]
Loop
Exit Loop If
[ Let ( $i = $i + 1 ; $i > $max ) ]
変数を設定 [ $field_name ; 値: GetValue ( $field_names ; $i ) ]
フィールドを名前で設定 [ $field_name ; JSONGetElement ( $json ; $field_name ) ]
End Loop
# 以下実行するスクリプト~ 略 ~現在のスクリプト終了 [テキスト結果: $Result ]

「ローカルで実行するスクリプトでは問題なく動くけど、サーバー上でスクリプト実行で指定するとうまく動かない」という場合は、大抵グローバルフィールドのことを失念 しているケースが多い気がする。

2. OnWindowOpen 等で発火するスクリプトを工夫する。

サーバー上のスクリプト実行 ( PSOS ) をした場合、OnFirstWindowOpen、OnWindowOpen、OnLastWindowClose、OnWindowClose スクリプトトリガ等も発火します。もしサーバー上で実行する際に必要がないようであれば、トリガで使用しているスクリプト内で、サーバーの場合はそのスクリプトを終了するステップを加えるといいです。

# OnFirstWindoOpen 等で使用するスクリプト。
# サーバーで実行する際は終了するようにする。
If [ PatternCount ( Get ( アプリケーションバージョン ) ; "Server" ) = 1 ]
現在のスクリプト終了 [テキスト結果: false ]
End If

3. 使用できないスクリプトを確認する。

「ローカルで実行するスクリプトでは問題なく動くけど、サーバー上でスクリプト実行で指定するとうまく動かない」という場合は、大抵使用できないスクリプトのことを失念 しているケースが多い気がする。

スクリプトワークスペースのメニュー > 表示 > 互換性 > サーバー を選択すると、サーバーで使用できないスクリプトステップは灰色になって、互換性をチェックできるようになる。

FileMaker Server ではサポートされていないスクリプトステップ

AppleScript を実行 (macOS)
AVPlayer オプション設定
AVPlayer 再生
AVPlayer 再生状態設定
DDE コマンドを送信 (Windows)
Event を送信
FileMaker Server にアップロード
OnTimer スクリプトをインストール
PDF を挿入
URL を開く
Web ビューアの設定
値一覧の管理を開く
印刷
ウインドウのスクロール
ウインドウの移動/サイズ変更
ウインドウの固定
ウインドウの調整
オーディオ/ビデオを挿入
オブジェクトの管理を開く
オブジェクトの更新
カスタムダイアログを表示
環境設定を開く
キャッシュをディスクに書き込む
共有設定を開く
警告音
検索/置換を実行
検索/置換を開く
現レコードをスペルチェック
サーバー上のスクリプト実行
索引から挿入
システム書式の使用
辞書を選択
書式設定バーを許可
新規作成
ズームの設定
スクリプトワークスペースを開く
スペルチェックオプション
全ウインドウを整列
選択部分をスペルチェック
対象レコードをスペルチェック
タッチキーボードの有効化
単語を修正
ディレクトリの取得
データソースの管理を開く
テーマの管理を開く
テキスト定規の表示切り替え
デバイスから挿入
電話をかける
名前を付けて保存
ピクチャを挿入
ファイルオプションを開く
ファイルの修復
ファイルを挿入
ファイルを閉じる
ファイルを開く
ファイルを変換
フィールド内容のエクスポート
プレビューモードに切り替え
ヘルプを表示
ポータルの更新
ポップオーバーを閉じる
ホストを開く
保存済み検索を開く
マイ App を開く
マルチユーザ設定
メニューセットのインストール
メニューバーの表示切り替え
ユーザ辞書を編集
読み上げ (macOS)
領域監視スクリプトを構成
レイアウトの管理を開く
レコードを Excel として保存
ローカル通知の構成
データベースの管理を開く

FileMaker Server では一部サポートされていないスクリプトステップ

# ダイアログを表示等、一部の機能はサポートされていない。SQL を実行
印刷設定
関連レコードへ移動
検索モードに切り替え
再ログイン
対象レコード削除
テーブルデータを削除
パスワード変更
フィールド内容の再ルックアップ
フィールド内容の全置換
複数レコードを対象外に
ブラウズモードに切り替え
ポータル内の行へ移動
ポータル内の行を削除
メールを送信
レイアウト切り替え
レコード/検索条件/ページへ移動
レコード/検索条件確定
レコード/検索条件削除
レコード/検索条件復帰
レコードのインポート
レコードのエクスポート
レコードのソート
レコードを PDF として保存

4. サーバー上ではローカライズされた関数は使用しない。

バージョン 14 のヘルプには以下のメモが載っている。( バージョン 17 のヘルプには載っていない。)

FileMaker Server 14 ヘルプより引用指定したスクリプトに Evaluate 関数 が含まれる場合、Evaluate の計算では英語の関数名を使用してください。 Evaluate 関数は、[サーバー上のスクリプト実行] で実行されたスクリプトで評価された場合、ローカライズされた関数名を認識しません。

これは、最新版であるバージョン 17 でも同様。

例 ) サーバー上で Evaluate ( "Get ( 日付 )" ) を評価しても ? が返ってくる。サーバー上で Evaluate したい場合は、Evaluate ( "Get ( CurrentDate )" ) といったように、英語で記載する必要がある。

5. パスを確認する。

ヘルプより引用サーバーサイドスクリプトの場合、ファイルアクセスは「Documents」フォルダとテンポラリフォルダに制限されます。サーバーサイドスクリプト内のパスを参照してください。

6. スクリプト同時セッション最大数を変更する。

現在のスクリプト同時セッション最大数を確認する。FileMaker Server 17 からは、ターミナルからしか変更できなくなっている。

サーバーのマシンのターミナルに以下を入力する。

fmsadmin GET SERVERCONFIG SCRIPTSESSIONS

username と password を入力すると、最大数が確認できる。

同様に、以下のコマンドで最大値を変更できる。( デフォルトが 25 、0 〜 500 まで )

fmsadmin SET SERVERCONFIG SCRIPTSESSIONS=30

最大値を超えた場合。

fileMaker Server 15 ヘルプより引用[スクリプト同時セッション最大数]の設定が 0 の場合、またはセッション数が [スクリプト同時セッション最大数] で指定された制限にすでに達している場合、[サーバー上のスクリプト実行] を実行しようとする FileMaker クライアントにエラーが表示されます。[サーバー上のスクリプト実行] によって指定されたスクリプトが実行されている間、そのスクリプトは、FileMaker スクリプトスケジュールのように動作します。スクリプトはクライアントの一覧に表示され、スクリプトエラーはログに記録されます。FileMaker Pro ヘルプを参照してください。

ここでの値を超えた数を実行しようとすると、以下のダイアログが表示される。

エラー番号は812

7. その他

  1. サーバーのメモリ、CPU を使用するので、大量に実行するとサーバーのパフォーマンスが低下する恐れがある。( コミュニティではサーバー上のスクリプトを 125 個とか実行するツワモノも。皆に驚かれていた。)
  2. サーバーサイドスクリプトの注意点 ( 株式会社イエス ウィ キャン )
    https://ywc.com/filemaker/?p=3573
  3. FileMaker Cloud スケジュール実行するスクリプトの作成について ( 寿商会 ) ( タイムスタンプの話など )
    https://kotovuki.co.jp/archives/5512
  4. ヘルプ 「FileMaker Server および FileMaker Cloud でのスクリプトの実行」のメモ欄に様々な注意点が書かれている。https://fmhelp.filemaker.com/help/17/fmp/ja/index.html#page/FMP_Help/running-scripts-on-server.html
  5. 「サーバー上のスクリプト実行」を使ったサーバーサイド処理の有効活用法 ( 株式会社ジュッポーワークス FileMaker カンファレンス 2014 )
    https://www.youtube.com/watch?v=GjjU_bY8j18

--

--

p388cell

FileMaker勉強中。医療機関で細胞培養してました。細胞好き。初培養p388cell。K562cell、LAK、DC等。今は培養サポートが主。猫、砂ネズミ、トルコ大好き。特にイスタンブール、ギョレメ。幼児期のトラウマでイカが苦手。松本市出身。宇都宮→所沢→横浜→品川→横浜→京都→横浜と引越し人生。たぶん昭和生れ。