LoginSignup
1
1

More than 5 years have passed since last update.

FMC2Goスケジューラーにおけるスケジュールの自動アップデート機能

Last updated at Posted at 2015-12-15

FileMaker Advent Calendar 2015の16日目

FMC2Goスケジューラーにおけるスケジュールの自動アップデート機能

参加したFileMakerワークショップの当日のメモと記憶を手繰って復習してみるの続き

2つ目のテーマとしてFMC2Goスケジューラーにおいて、どうスケジュールの自動アップデート機能を実現しているのかを追いかけてみる

当日の発表資料がすべてのプレイス > International Discussions > 日本語フォーラム > 製品やイベントの告知 > 文書 > 2015/12/09大阪開催 FileMakerワークショップでの資料共有sc自動アップ.pdfで既に共有されているのですが、自分で手を動かさないと身につかないので..

「OnOpen」というスクリプトは、なにをしている?

FMC2Goスケジューラーにおけるレスポンシブ・デザインで追っかけていた「OnOpen」スクリプトを引き続き追っかけてみると

151216-01.png

なにやら「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:ダウンロードしてきた更新用のファイルを保持

を使っているようだ

最初のブロック[アップデート番号を取得する]

151216-02.png

「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で呼ばれた)ではないのでカスタムダイアログでエラーを通知

を行ってスプリクトを終了する

次のブロック[アップデート版のファイルを取得する]

151216-03.png

アップデート番号が取れた時は「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" )
)

次のブロック[エラーメッセージを生成する]

151216-04.png

ローカル変数「$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」で上書き
→最後に更新成功したときのアップデート番号を設定する

とする

最後のブロック[次の処理への橋渡し]

151216-05.png

「$err_msg」に値が入らなかった(=アップデート版のファイルを取得できた)場合は、取り込んだアップデートを反映させる「importUpdate( update_num )」スクリプトを実行する

実行前と実行後

このスクリプトで使われているグローバルフィールドが、実行前と実行後でこのように変化した

スクリプト実行前

151216-06.png

スクリプト実行後

151216-07.png

とりあえず今日はここまで

1
1
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
1
1