FileMaker Advent Calendar 2015の16日目
FMC2Goスケジューラーにおけるスケジュールの自動アップデート機能
参加したFileMakerワークショップの当日のメモと記憶を手繰って復習してみるの続き
2つ目のテーマとしてFMC2Goスケジューラーにおいて、どうスケジュールの自動アップデート機能を実現しているのかを追いかけてみる
当日の発表資料がすべてのプレイス > International Discussions > 日本語フォーラム > 製品やイベントの告知 > 文書 > 2015/12/09大阪開催 FileMakerワークショップでの資料共有のsc自動アップ.pdfで既に共有されているのですが、自分で手を動かさないと身につかないので..
「OnOpen」というスクリプトは、なにをしている?
FMC2Goスケジューラーにおけるレスポンシブ・デザインで追っかけていた「OnOpen」スクリプトを引き続き追っかけてみると
なにやら「checkForUpdate」というドンピシャなスクリプトが呼ばれている
その前にあまり見かけない「OnTimer スクリプトをインストール」というスクリプトステップもあるようだ
OnTimer スクリプトをインストール
目的
指定されたスクリプトを指定した間隔で実行します。アクティブなウインドウにタイマーをインストールします。指定された間隔が経過すると、次回そのアプリケーションはアイドルとなり、指定されたスクリプトが実行されます。
構文
OnTimer スクリプトをインストール[「<スクリプト名>」; 引数:<オプションのスクリプト引数>; 間隔:<数字>]
オプション
[指定...] をクリックして変数オプションを設定します。
-[スクリプト指定] は、実行するスクリプトの名前です。
-[間隔の秒数] はタイマーでスクリプトを実行するまでの秒数です。
120×60秒なので2時間毎に「checkForUpdate」スクリプトが呼ばれるようにスケジュールしているんですね
「checkForUpdate」というスクリプトは、なにをしている?
長めのスクリプトなので、いくつかのブロックに分割してみていくことにする
このスクリプトでは、いくつかのグローバルフィールド
- Utility::zgn_last_update:最後に更新成功したときのアップデート番号を保持
- Utility::zgn_update_latest:直近に行ったアップデート番号の確認結果を保持
- Utility::zgt_update_note:?
- Utility::zgt_update_check_url:アップデート番号を取得するurl
- Utility::zgt_update_path:更新用のファイルを取得するurl(固定部分)
- Utility::zgr_update_file:ダウンロードしてきた更新用のファイルを保持
を使っているようだ
最初のブロック[アップデート番号を取得する]
「Utility::zgn_last_update」に値が入っていなければ0を設定
「Utility::zgt_update_check_url」には
http://fmdl.filemaker.com/kk/conference/2015/dc2g_update_vers.txt
が設定されている
「URLから挿入」スクリプトステップを使って「Utility::zgn_last_update」にアップデート番号を取得する
URL から挿入
目的
URL から内容をフィールドに入力します。
構文
URL から挿入 [選択; ダイアログなし<テーブル::フィールド>; リソース URL]
正しくアップデート番号が取れたかのチェック
Let ( [ $last_err = Get( 最終エラー );
// if there is an error, the file will contain text, not a number
$text_length = Length(Filter(Lower(Utility::zgn_update_latest) ; "qwertyuiopasdfghjklzxcvbnm<>"))] ;
$last_err or $text_length)
ここでは
- 最終エラー が0でない
- 「Utility::zgn_update_latest」に"qwertyuiopasdfghjklzxcvbnm<>"のいずれか(=数字以外)が入る
となった時に正しくアップデート番号が取れなかったと判断している
→http://fmdl.filemaker.com/kk/conference/2015/dc2g_update_vers.txt は数字(アップデート番号)のみが書かれている前提となっている
アップデート番号が取れなかった時は
-
「Utility::zgn_update_latest」を「Utility::zgn_last_update」で上書き
→最後に更新成功したときのアップデート番号を設定する -
スクリプト引数に"Manual"が設定されている時は、起動時(もしくはOnTimerで呼ばれた)ではないのでカスタムダイアログでエラーを通知
を行ってスプリクトを終了する
次のブロック[アップデート版のファイルを取得する]
アップデート番号が取れた時は「Utility::zgn_update_latest」が「Utility::zgn_last_update」より大きい(=新しいアップデートがある)か確認する
新しいアップデートが無かったとき、スクリプト引数に"Manual"が設定されていたらカスタムダイアログで通知する
ローカル変数「$update_path」:アップデート版のファイルの置き場所(url)
Let ( [
$next_update = GetAsNumber(Utility::zgn_update_latest);
$update_note = Utility::zgt_update_note;
$file_type = ".fmp12"
] ;
Utility::zgt_update_path & $next_update & $file_type
)
「Utility::zgr_update_file」にアップデート版のファイルを取り込む
ローカル変数「$got_update」:正しくファイルが取得できたか
Let ( [
$last_err = Get( 最終エラー )
] ;
// if the file isn't a .fmp12 file
PatternCount( Utility::zgr_update_file; $file_type ) and not PatternCount( Utility::zgr_update_file; ".html" )
)
次のブロック[エラーメッセージを生成する]
ローカル変数「$err_msg」:エラーメッセージ
Case(
$last_err;
"エラー #" & $last_err & "¶エラーのため更新情報をダウンロードできませんでした #" & $last_err & ": " & fnDefineErrorCode ( $last_err );
IsEmpty( Utility::zgr_update_file );
"ダウンロードに失敗しました¶最新の更新をダウンロードできませんでした。後ほどもう一度試してください。";
""
)
「$err_msg」に値が入った(=エラー)場合は
- カスタムダイアログでエラーメッセージを表示する
- 「Utility::zgn_update_latest」を「Utility::zgn_last_update」で上書き
→最後に更新成功したときのアップデート番号を設定する
とする
最後のブロック[次の処理への橋渡し]
「$err_msg」に値が入らなかった(=アップデート版のファイルを取得できた)場合は、取り込んだアップデートを反映させる「importUpdate( update_num )」スクリプトを実行する
実行前と実行後
このスクリプトで使われているグローバルフィールドが、実行前と実行後でこのように変化した
スクリプト実行前
スクリプト実行後
とりあえず今日はここまで