FileMaker 「スクリプトと自動化」 中級編(11章)前半

FileMaker公式テキスト中級編!!!

中級編では、
中級開発者として複数の利用者を想定してシンプルなカスタムAppを作成する
といった内容になります。

全16章です。
前回は、10章『関数と計算式』について学びました。
👉FileMaker 中級編(10章)

今回は、11章『スクリプトと自動化』についての知識を学びます。

スクリプトも論理

 

機能の作成には、ほとんどの場合スクリプトが欠かせません!
一連の作業を自動化してユーザをサポートします。

スクリプトは、カスタム App にひとつの流れを持った作業を自動化した「機能」を作成するための重要なツールです。おおまかに言えば FileMaker Pro に『なにをさせるか』を記述するものです。
計算式と同じくスクリプトも合意した要件や設計した仕様に従って記述します。

スクリプトの基本

●記述のポイント

  1. 処理のフロー(業務の流れ)をイメージする
  2. 順に記述&デバックをして挙動を確かめる

 

※注意点
・無意識の操作も指定する。
・開発者ならわかるがユーザーには分か理づらいことへの配慮。

●スクリプトステップ
スクリプトの作成用にあらかじめ用意されている標準の機能を実行するコマンドが「スクリプトステップ」です。

●「制御コマンド」
スクリプトステップには、自動化において重要なコマンド(メニューにはありません) も用意されています。
・条件分岐  ・ループ(反復)


『ある条件』に合致した/しない場合の処理や、反復した処理は作業の自動化にとても有用です。
※「スクリプト」と「スクリプトステップ」は、正確には意味や実行できる場所、実行の手順が違いますが、 自動処理が簡単にできるという意味で区別せず「スクリプト」と呼ばれる場合があります。

スクリプトの実行

スクリプトを「実行」するためには、なにかに「割り当て」します。

  • ボタン
  • トリガ
  • スクリプトから
  • メニュー(スクリプトメニュー、カスタムメニュー)

スクリプトの流れ

スクリプトを「実行」すると、命令、処理、結果の流れが起こります。

  1. 命令する
  2. FileMaker Pro が処理する
  3. 結果を得る

●命令する
「命令」が、スクリプトの重要な部分です。
新規レコードの作成、レコードの検索、レコードの ソート、などの実行を命令します。
そして『命令を出すべきかどうか』を判断するには「条件分岐」 を行います。
これは大きく分けて次になります。

・命令に必要なデータによる分岐
・スクリプトとユーザの対話による分岐

●FileMaker Pro が処理する
スクリプトの処理は、FileMaker Pro あるいは FileMaker Cloud / FileMaker Server が実行します。 実行する場所(サーバー側かクライアント側か)を開発者が指定できます。
※ FileMaker Cloud / FileMeker Server で実行するスクリプトは本書では取り扱いません。

●結果
命令が実行され処理が完了すると、結果が返ります。検索結果が表示されたり、レイアウトが切り替えられたり、印刷されたり、などか、あるいは『エラーが発生して想定した結果が得られない』 ことがあります。

スクリプトとエラー

スクリプトでは実行時の「エラー」への対応も重要なポイントです。

作成時・・・スクリプト内容のエラー(計算式で言うところの構文エラー)
実行中・・・

実行中のエラーは大きく分けて2つあります。

・命令を処理するために必要なデータが揃っていない
・データは揃っているが想定していない結果になる

要件を参考に
・どのようなデータが必要か
・どのような結果がでるべきなのか
を把握し

・必要なデータが揃っているか/いないか
・どこで[キャンセル]をユーザが選択できるか/できないか
・FileMaker としてはエラーだが作業としてはエラーではない(検索結果が 0 件など)

などのパターンを考えて対応します。

スクリプトの終了

スクリプトの終了には、2 種類があります。

[現在のスクリプトを終了]スクリプトステップ
[全スクリプト終了]スクリプトステップ

トリガのキャンセルや、サブスクリプト実行、などでは上記のどちらを使用するべきか検討してください。

なるべく条件分岐でこれらのステップを使わずにスクリプトが終了することが可能かどうかも考えます。なお、[全スクリプト終了]スクリプトステップを使用する場合は、充分にテストしてください(どこで実行されるかによって思わぬことが起きるかもしれません)。

[スクリプトワークスペース]

スクリプトの作成は、[スクリプトワークスペース]で行います。
shift + ⌘ + S

スクリプトパネル

一番左のパネル部分です。作成されているスクリプト名の一覧が表示されます。

・スクリプトの作成(ピンク)
・スクリプトの実行(青)
・スクリプトデバック開始(緑)
・検索ボックス(オレンジ)

●スクリプトの複製、削除など
目的のスクリプトを選択して ⌘D
●スクリプトの移動
選択されているスクリプトをドラッグすると任意の場所に移動できます。
●まとめて選択
[command]キー(macOS)を押しながら各スクリプト名をクリックします。
●スクリプト作成
左上の[+]ボタンをクリックします。「新規スクリプト」というスクリプトが作成されスクリプト 編集パネルが開きます。
●スクリプトの実行
選択しているスクリプトを、ここから実行できます。
[スクリプトワークスペース]の左上にある[ ] ボタンをクリックします。
●スクリプトのデバッグ
選択しているスクリプトを「デバッグ」するときにクリックします。
●スクリプトの検索
検索ボックスに文字列を入力すると、表示されているスクリプト名から検索します。検索ボックス右の[X]ボタンをクリックすると検索文字がクリアされ、検索も解除されすべてのスクリプトが表示されます。

スクリプトパネルの検索ボックス右上 『 3 つのボタン』
・スクリプトメニュー管理(左)
・新規フォルダ(中)
・新規区切り線(右)

●[スクリプトメニュー管理]ボタン
クリックすると、各スクリプトの先頭にチェックボックスが表示されます。スクリプトメニューに表示しない場合はチェックを「オフ」にします。[スクリプトワークスペース設定]で新規にスクリプトを作成した状態のオン/オフを設定できます(通常は オフ です)。

●[新規フォルダ]ボタン
たくさんあるスクリプトをフォルダにまとめて管理できます。スクリプトメニューに表示すると階層化されてフォルダの下のスクリプトがサブメニューとして表示されます(スクリプトメニューに表示チェックがされている場合)。フォルダの中にさらにフォルダを入れ子にすることもできます。

 

●[新規区切り線]ボタン
選択したスクリプトの下に区切り線を作成し表示します。スクリプト間の区切りを明確にできます。 スクリプトメニューに表示することもできます。

スクリプト編集パネル

スクリプトパネルでスクリプトの記述や編集をします。
複数のスクリプトをタブで開くことができます。

●スクリプトの表示
ちょっとした違いがあります。

・スクリプト名をクリック
単に選択されているスクリプトの内容を表示します。なにも変更しないで別のスクリプトを選択するとそのスクリプトの内容に切り替わります。タブタイトルの右側にビュー記号が表示されます。

・スクリプト名をダブルクリック
[X]ボタンでスクリプトを閉じるまで開いています。タブタイトルにビュー記号はありません。 別のスクリプトを選択すると別のタブでスクリプトが表示されます。

●スクリプトを編集
表示されているスクリプトを編集すると右端に「*( アスタリスク )」が表示されます。スクリプトを保存すると「*」が消えます。

・変更を元に戻す/やり直す
スクリプト編集パネルでは、スクリプトを保存または実行した後でも変更を元に戻す/やり直すことができます。しかし、スクリプト名タブを閉じる、[スクリプトワークスペース]を閉じるなどの操作をおこなうと変更を元に戻すことができなくなります。なお、スクリプトパネルのスクリプト名の変更やスクリプトの削除は元に戻すことはできません。

・スクリプトの<○○がみつかりません>
TO、レイアウト、フィールド、スクリプトの削除は、慎重におこないます。スクリプトで使用されている場合は、確認メッセージが表示されます。
なお、他のファイルからスクリプトをコピーしてきたときや、TO、レイアウト、フィールド、スクリプトなどが削除されてスクリプト上で『見つからない』状態になると < ○○がみつかりません > とスクリプトに表示されます。
後述の「スクリプトの問題をチェック」で発見できます。

●ショートカットメニュー
スクリプト編集パネルのタブタイトルを右クリックするとメニューが表示されます。

●タブを新規ウインドウに移動
そのスクリプトを編集するための専用の新しいウインドウが開きます。

●スクリプトパネルで選択
編集中のスクリプトパネルで選択し、隠れていればスクロールして表示します。

●スクリプトの名前変更
スクリプト名を編集します。ダブルクリックしても変更できます。

●問題をチェック
スクリプトの内容が、文法的に問題がないかチェックできます。あくまでも文法的なチェックです。実行後、正しい結果になるということではありません。問題のある行は、色がついていて強調されます。

 

●タブを閉じる
スクリプト編集タブを閉じます。タブの上にマウスポインタを移動すると右に[X]ボタンが表示さ れるのでこれをクリックしても閉じることができます。

●スクリプトの保存
スクリプトはこまめに保存することを推奨します。 ⌘S

スクリプトステップパネル

右側にスクリプトに使用するスクリプトステップの一覧が表示されます。

●簡易ヘルプ
スクリプトステップを選択すると下に簡単なヘルプが表示されます。

●スクリプトの検索
検索ボックスに文字列を入力するとスクリプトステップ名から検索します。検索ボックス右の[X] ボタンをクリックすると検索文字をクリアし検索が解除されすべてのスクリプトステップが表示されます。

検索ボックスの右上のボタンでスクリプトステップの表示を切り替えることができます。表示順をアルファベット順に並び替えたり、お気に入り機能を使うこともできます。

●パネルの表示
スクリプトステップパネルが表示されていない場合、ウインドウ右上のスクリプトステップパネル表示切り替えボタンをクリックします。ほかにも可能なことがあります。
・ スクリプトをコピーと貼り付け(ペースト)
・ 他ファイルからスクリプトをインポート

スクリプト作成のショートカット

目的 macOS
現在の行の下に空白行を挿入 return または command + return
現在の行の上に空白行を挿入 Shift + return または command + Shift + return
オートコンプリートの候補から選択 ↑↓
オートコンプリートの候補を決定 return
オートコンプリートの候補から選択し
最初の引数の選択候補を選択
Tab
オートコンプリートキャンセル Esc
選択したスクリプトまたは
スクリプトステップ行を削除する
Delete または Backspace
選択したスクリプトステップを無効にする command + /
空の行にコメントを追加する
すべてのタブを閉じる command + option + W
現在のスクリプトのスクリプトオプションを選択する return またはスペースバー
スクリプトステップのオプションを表示する +
[スクリプトパネル]内のすべてのグループを
展開する/たたむ
command キーを押しながら
展開/たたむアイコンをクリック

スクリプトの設計

スクリプトは、流れや詳細を設計したほうが効率良く作成できます。

なにをするのかを基本に考えます。
「機能要件」や「機能設計」と呼ばれます。

●必要な要素

  • 扱うデータ
  • コンテキスト(TO とレイアウト)
  • 処理内容
  • ユーザの操作
  • 帳票などの出力の形式

これらついて 5W1H になぞらえて考えると次のようになります。

  • いつ  実行のタイミング
  • どこで  どのレイアウト(TO)か
  • 誰が  どのユーザか
  • なにを  どのレコードが対象か
  • なぜ  目的
  • どのように  実行する内容(命令と命令のオプション)

この中でも「どのように」が、スクリプトの処理です。
目指すのは、構文エラーがなく想定された 結果を出すスクリプトです。

スクリプトのテスト

設計を行ってから作成を開始したとしても、試行錯誤(つくる←→テスト)になります。
テストはとても重要です。充分に時間をとるようにします。

●複数の結果をすべて試す
複数の結果が想定されているなら、すべての結果をテストします。

●テストデータ
スクリプトの実行テストでは、あるべき結果がわかっていないと構文エラーだけを解決することが目的になりがちですが、それだけでは不十分です。
『実行したら、この結果になる』というテストデータを準備してテストする
と良いでしょう。

スクリプトデバッガ

スクリプトのテストに便利なツールです。
スクリプトステップを 1 行ずつ実行できるのでエラーになった原因箇所を特定することが容易になり ます。

●ボタン/カスタムメニューの「単一ステップ」のデバッグ
両方ともスクリプトデバッガでデバッグできます。

ツール説明

上部左から。

・スクリプトの編集
・スクリプト実行/一時停止
・全スクリプト終了
・ステップオーバー
・ステップイン
・ステップアウト
・次のステップを設定
・スクリプトトリガ 有効/無効
・データビューア 開く/閉じる
・スクリプトの認証/認証解除

●ステップオーバー
スクリプトを 1 ステップごとに実行します。
実行対象のスクリプトステップが[スクリプト実行]の場合、サブスクリプトを実行して呼び出しもとのスクリプトの次のステップへ進みます。

●ステップイン
スクリプトを 1 ステップごとに実行します。
実行対象のスクリプトステップが[スクリプト実行] の場合、サブスクリプトの 1 ステップ目へ進みます。

●ステップアウト
実行中の現在のスクリプトのすべてのスクリプトステップを実行します。
現在のスクリプトがサブスクリプトの場合、呼び出し元のスクリプトの[スクリプトの実行]スクリプトステップの次のステップへ進みます。

次のステップを設定
現在選択されているスクリプトステップに実行ポインタ(緑の矢印マーク)を設定します。

●スクリプトトリガを有効/無効にする
デバッグ時に、ファイル内のすべてのスクリプトトリガの有効/無効を切り替えます。無効にするには[完全アクセス]アクセス権セットを持ったアカウントのログインが必要です。
無効後、スクリプトデバッガを閉じると有効に戻ります。

●スクリプトの認証/認証解除
デバッガを起動した現在のアカウントがスクリプトを編集することができない権限である場合、スクリプトデバッガまたはデータビューアのロックを解除するために使用します。
ロックの解除には [完全アクセス]アクセス権セットを持ったアカウントのログインが必要です。編集権限は、スクリプトデバッガおよびデータビューア両方を閉じるまで持続します。

●ブレークポイント
デバッグ中に、任意のステップで一時停止するために使用します。ブレーク ポイントはスクリプトに保存されますが、 スクリプトデバッガ以外のスクリプト実行ではブレークポイントは無視されます。ブレークポイントは、スクリプトの行番号をクリックすると挿入されます。

データビューア

今まで使ったのは「監視」タブでした。データビューアには 2 つのタブがあります。スクリプトデバッガでスクリプト を実行しているときは「現在」タブで、そのスクリプトに記述されている
・フィールド名と値
・変数名と値
を確認できます。

スクリプトトリガ

「トリガ」とは、つまり特定の「イベント(きっかけ)」です。このトリガが発生したときにスクリプトが実行されるようにできます。
イベントは、例えば、フィールドへのデータの入力を確定することなどです。そのイベントが実行される直前または直後にスクリプトが実行されます。

トリガは、25 個用意されていて大きく分けて次の 3 種類です。

  • レイアウト
  • レイアウトオブジェクト
  • ファイルオプション

例えば。。。
「OnObject…」ではじまるもの   レイアウトオブジェクト
「OnLayout…」ではじまるもの   レイアウトに関わるもの

※これらは、レイアウト上で設定します。あるレイアウトで設定しても他のレイアウトでは適用されないので気をつけてください。

●スクリプトトリガが実行されないもの

・インポート、全置換、再ルックアップなど、レイアウト上ではなく FileMaker Pro がテーブルのレコードに対して実行する操作

・[カスタムダイアログを表示]、[フィールド設定]、[フィールドを名前で設定]、[Web ビューアの設定]でフィールドのデータを変更するスクリプトステップが実行されたとき

スクリプトトリガの順番

スクリプトトリガの評価には順番があります。複数のスクリプトトリガが有効になる状況では、 FileMaker Pro が 1 つずつ実行するためです。同じイベントで複数のスクリプトトリガが実行され ると、スクリプトトリガは次の順で実行されます。

(1)OnFirstWindowOpen
(2)OnWindowOpen
(3)OnLayoutEnter
(4)OnModeEnter
(5)OnRecordLoad
(6)OnLayoutSizeChange
(7)OnViewChange

次のスクリプトトリガでは、トリガイベントによって順序が制御されます。

(1)OnObjectEnter
(2)OnObjectKeystroke
(3)OnLayoutKeystroke
(4)OnGestureTap
(5)OnObjectAVPlayerChange
(6)OnFileAVPlayerChange
(7)OnExternalcommandReceived
(8)OnPanelSwitch
(9)OnObjectModify
(10)OnObjectValidate
(11)OnObjectSave
(12)OnObjectExit
(13)OnRecordCommit または OnRecordRevert
(14)OnModeExit
(15)OnLayoutExit
(16)OnWindowClose
(17)OnLastWindowClose

● スクリプトトリガとイベント
スクリプトトリガの実行はイベントの「前」と「後」の 2 種類があります。

クライアントがなにか、どの順番で実行されるものか、イベントの前か後か、を考えて設定します。 1 回で 1 つずつ設定していきますが、結果として複数のスクリプトトリガが有効になることがあります。充分にテストをします。

●トリガのキャンセル
イベントの前に実行されたスクリプトが[現在のスクリプト終了]スクリプトステップで結果が 0(偽 = False)で終了するとイベントそのものがキャンセルされます。[現在のスクリプト終了]スクリプ トステップで結果を 1(真 = True )で終了するか、結果がないか、このスクリプトステップが含まれていないスクリプトであった場合、イベントは実行されます。
必ず条件分岐を行います。

レイアウトのスクリプトトリガ

12 種類あります。

名称 イベント

可能なモード
ブラウズ

検索
クライアント
のサポート
FMP
FMS FMG FWD
OnRecordLoad   ○ 
OnRecordCommit  
OnRecordRevert  
OnLayoutKeystroke      
OnLayoutEnter  
OnLayoutExit  
OnLayoutSizeChange    
OnModeEnter    
OnModeExit    
OnViewChange  
OnGestureTap      
OnExternalcommandReceived        

・FMP → FileMaker Pro
・FMS → FileMaker Server / FileMaker Cloud
・FMG → FileMaker Go
・FWD →FileMaker WebDirect

●スクリプトトリガを設定する場所
レイアウトモードで[レイアウト設定]ダイアログの「スクリプトトリガ」タブを使います。

『OnRecordLoad 』
レイアウトにレコードをロード(読み込み)した直後にスクリプトが実行されます。

 

例えば「一覧画面」から「詳細画面」へレイアウトを移動する場合に、選択したレコードの種類(顧客情報だったら、それが個人か企業か)で表示するレイアウトを違うものにする、などで使用できます。

『OnRecordCommit 』

変更があったレコードの確定の直前にスクリプトが実行されます。

『OnRecordRevert 』

一連のレコードが復帰(入力前の状態に戻される)の直前に、スクリプトが実行されます。

『OnLayoutKeystroke 』
レイアウトでなにか1つ以上の文字が入力を感知したときにスクリプトが実行されます。プレ ビューモードでも動作します。以下の関数でキーを判断します。

Code ( テキスト )関数
Char ( 数値 )関数
Get ( トリガキー修飾キー )関数
Get ( トリガキー入力 )関数

  1.  キーボードでキーが押される
  2. クライアントのOSが判断する(例えばOS のショートカットに該当するとそれが実行さ れます。するとスクリプトトリガは実行されません)
  3. FileMaker Proが判断する(ショートカットに該当するとそれが実行されます。するとスクリプトトリガは実行されません)
  4. OnObjectKeystrokeトリガが設定されているアクティブなレイアウトオブジェク トからスクリプトトリガが有効になる
  5. 上記のイベント後、OnLayoutKeystrokeトリガが有効になる

 

上記は、スクリプトが実行されるまでの流れになります。なお、実行されたスクリプト内のエラーでスクリプトが終了できなかった場合、トリガしたキーは処理されません。
FileMaker Goの場合、ユーザが入力したときにフィールドが有効である場合に限りアクティ ブになります。

『OnLayoutEnter 』
レイアウトのロード(表示)直後にスクリプトが実行されます。(このトリガで実行されるスクリプトの最初の行を[新規ウインドウ]スクリプトステップとすると再帰になるので何らかの方法でスクリプトを強制終了しなければ無限に反復されることになります)

 

例えば「一覧画面」へレイアウトを移動したらソートや検索を実行する、などに使用できます。 なお、プレビューモードでも動作します。

『OnLayoutExit 』
レイアウトを切り替える直前にスクリプトが実行されます。プレビューモードでも動作します。

『OnLayoutSizeChange 』
レイアウトまたはウインドウのサイズが変更された直後にスクリプトが実行されます。

FileMaker Goでは、iOS/iPadOSデバイスを回転、ステータスツールバーの表示/非表示、 ウインドウが最初に開いたときにアクティブになります。

FileMaker ProとFileMaker WebDirectでは、次の場合にアクティブになります。 ・ユーザによるサイズ変更
・スクリプトステップ
・メニューコマンド
・ショートカット
・スクリプトでのステータスツールバーまたは書式設定バーの表示 / 非表示によるレイアウトやウインドウのサイズ変更
・ウインドウが最初に開いたとき
(マウスを使用してウインドウのサイズを変更した場合、ウインドウのサイズ変更が終了したときにのみアクティブになります)

『OnModeEnter』
ブラウズモード、検索モード、プレビューモードへ切り替えた直後にスクリプトが実行されます。

 

例えば、検索モードに切り替えた直後に、検索条件を初期設定する、などに使用できます。

『OnModeExit』
ブラウズモード、検索モード、プレビューモードへ切り替える直前にスクリプトが実行されます。

 

例えば、検索実行の直前に、検索条件を初期設定する、あるいは、プレビューモードからブラウズ モードへ戻る直前にウインドウを調整する、などに使用できます。

『OnViewChange』
フォーム形式、リスト形式、表形式に表示を切り替えた直後にスクリプトが実行されます。
プレビューモードでも動作します。

『OnGestureTap 』
レイアウト上でタップジェスチャが受信されたときにスクリプトを実行します(Windows とiOS/iPadOS のみ)。
次のジェスチャで、このトリガが有効になります。
・1、2、または 3本の指でのタップ(iOS/iPadOS)
・1 本の指でのダブルタップ(iOS/iPadOS)
・2 本の指でのタップ(Windows)

1 本の指でダブルタップする場合は、1 回目と 2 回目のタップのときに 2 回評価されます。

『OnExternalcommandReceived 』
ユーザが、ロック画面または外部デバイスで次のいずれかのボタンをクリックしたときにスクリ プトが実行されます。停止、再生、一時停止、再生/一時停止を切り替え、次のメディアを再生、 前のメディアを再生、前方または後方への検索を開始または終了。
次の関数で、何のイベントかを判断します。

 

Get ( トリガ外部イベント )関数

レイアウトオブジェクトのスクリプトトリガ

8 種類あります。

名称 イベント

可能なモード
ブラウズ

検索
クライアント
のサポート
FMP
FMS FMG FWD
OnObjectEnter   ○ 
OnObjectKeystroke    
OnObjectModify  
OnObjectValidate  
OnObjectSave  
OnObjectExit  
OnPanelSwitch  
OnObjectAVPlayerChange  

●スクリプトトリガを設定する場所
レイアウトモードでフィールド、タブコントロール/パネルコントロール、ポップオーバー、 Web ビューア、ポータル、ボタンバーなどをクリックして[書式]-[スクリプトトリガ設定 …] メニューを選ぶか、右クリックでショートカットメニューから[スクリプトトリガ設定 …]を選択します。

『OnObjectEnter 』
レイアウトオブジェクトがアクティブになった直後にスクリプトが実行されます。 ユーザがフィールドのデータを編集する前に、編集するフィールドと編集内容を取得できます。

 

例えば、レコードの変更ログを記録する機能に使用することができます。ポータルでは、ポータル行がアクティブになる度に評価します。 アクティブになっていないボタンやタブコントロールは、それらをクリックしただけでは評価され ません。

『OnObjectKeyStroke 』
レイアウトオブジェクトがアクティブになり、なにか1つ以上の文字の入力を感知したときに スクリプトが実行されます(OnLayoutKeystroke を参照)。 フィールドオプションの[入力値の制限]は、アクティブなフィールドから抜けないと評価が起きません。
そのため、このトリガが役立つ場合があります。

『OnObjectModity 』
レイアウトオブジェクトの値が変更された直後にスクリプトが実行されます。

『OnObjectValidate 』
アクティブなレイアウトオブジェクトが検証および保存される直前にスクリプトが実行されます。 このスクリプトトリガは、選択されたフィールドのデータが変更された場合にのみ有効になりなす。

『OnObjectSave 』
アクティブなレイアウトオブジェクトが検証と保存の直後にスクリプトが実行されます。

『OnObjectExit 』
アクティブなレイアウトオブジェクトが検証を終了する直前にスクリプトが実行されます。 [現在のスクリプト終了]スクリプトステップで、結果が 0(偽= False)で終了するとレイアウトオブジェクトから出られなくなるので注意してください。

『OnPanelSwitch 』
タブコントロール、パネルコントロールでパネルが切り替えられる直前にスクリプトが実行されます。アクティブでないパネルをクリックしたりスクリプトで移動したときです。

『OnObjectAVPlayerChange 』
レイアウトオブジェクトのメディアの状態を変更したときにスクリプトが実行されます。

ファイルのスクリプトトリガ

5 種類あります。

名称 イベント

クライアントのサポート
FMP
FMS FMG FWD
OnFirstWindowOpen   ○ 
OnLastWindowClose  
OnWindowOpen  
OnWindowClose  
OnFileAVPlayerChange        

●スクリプトトリガを設定する場所

[ファイル]-[ファイルオプション …]メニューを選び、[ファイルオプション]ダイアログの「ス クリプトトリガ」タブで設定します。

『OnFirstWindowOpen 』
ファイルの最初のウインドウが開いた直後にスクリプトが実行されます。ほとんどの場合は起動時です。関連ファイルが裏側で開いている(ウインドウが非表示になっている)と、最初にウインドウが表示されたときに有効になります。

『OnLastWindowClose 』
ファイルの最後のウインドウが閉じる直前にスクリプトが実行されます。ほとんどの場合はファイルを閉じるときです。関連ファイルの場合はウインドウが非表示で開いている状態になります

『OnWindowOpen 』
ウインドウが開いた直後にスクリプトが実行されます。

『OnWindowClose 』
ウインドウが閉じる直前にスクリプトが実行されます。

『OnFileAVPlayerChange 』
メディアファイルがフィールドまたは URL から再生されていて、ユーザまたはスクリプトス テップの設定が再生状態を変更したときにスクリプトが実行されます。

OnTimer

OnTimer スクリプトはこれまでのものとは違います。
次のスクリプトステップを利用します。

『[OnTimer スクリプトをインストール] スックリプトステップ』
(1)実行するスクリプトを指定
(2)指定したスクリプトが実行されるまでの時間間隔を指定(秒単位)

の順番に動作します。(1)、(2) はタイマーがキャンセルされるまで繰り返されます。

例えば、次のような用途に使えます
・アンケートを実施するためのレイアウトへ切り替えたら 1 時間ごとにカスタムメッセージを表示して 3 時間経ったら終了する

OnTimer は、次のような特徴があります。

 

・[OnTimer スクリプトをインストール]スクリプトステップが実行されたときにアクティブ なウインドウに OnTimer スクリプトが設定される。
・ 1 ウインドウに 1 つの OnTimer スクリプトだけを設定できる。
・  既に OnTimer スクリプトが設定されているウインドウに別の OnTimer スクリプトを設定すると、前の OnTimer スクリプトは取り消される。
・  既に OnTimer スクリプトが設定されているウインドウを閉じると取り消される。
・  複数のウインドウで、それぞれ OnTimer スクリプトを実行させることができる。
・  既に OnTimer スクリプトが設定されているウインドウをアクティブにしてユーザやスクリプトが新規ウインドウを作成すると新しいウインドウに OnTimer スクリプトが引き継がれる。

●OnTimer スクリプトのキャンセル
OnTimer スクリプトをキャンセルするには次の方法があります。
・ウインドウを閉じる
・[OnTimer スクリプトをインストール]スクリプトステップで実行するスクリプトを指定しない。
・[OnTimer スクリプトをインストール]スクリプトステップで時間間隔を 0 秒または空欄を指定。

時間のカウントタイマーで設定した時間内にユーザが作業をしている場合、FileMaker Pro は、その作業を待ってからスクリプトを実行します。そしてスクリプトが開始したら次のタイマーが開始します
つまり、正確な間隔ではない場合があります。

スクリプトの作成

スクリプト作成の注意点

いくつか注意点があります。

●コンテキスト、TOを常に考える
「いまどのレイアウトにいるのか」は、そのレイアウトに指定されているTO によって、

・現在のウインドウ
・現在のウインドウに表示されている、レイアウト
・現在のウインドウのレイアウトの、現在の対象レコード
・現在のウインドウのレイアウトの対象レコードの、現在のレコード
・現在のウインドウのレイアウトの対象レコードの現在のレコードの、アクティブなフィールド

すべてが関係します。TO(コンテキスト)を適切に考慮しスクリプト内で指定をおこなわなければなりません。そしてそれらを把握するために、いくつもの Get 関数が用意されています。

『Get (ウインドウ名)』
『Get (レイアウト名)、Get (レイアウト番号)、Get (レイアウトテーブル名)』
『Get (対象レコード数)』
『Get (レコード番号)、Get (アクティブレコード番号)、Get (アクティブポータル行番号) 』『Get (アクティブレイアウトオブジェクト名)、Get (アクティブフィールド名) 』『GetFieldName( フィールド )』

※他に用意されている関数についてはヘルプを参照してください。

●ユーザのクリップボードは当てにしない
フィールドにデータを入力することについて、次のスクリプトステップの使用は注意が必要です。

[コピー]スクリプトステップ
[切り取り]スクリプトステップ
[貼り付け]スクリプトステップ

これらは、ユーザの使用している OS のクリップボードを利用します。
例えば、ユーザがスク リプトの途中で他のアプリケーションでコピーや切り取りを行った後に[貼り付け]スクリプ トステップが実行されたら……。想定とは違うデータが入力されるかもしれません。

クリップボード >>> OS が一時的に保存しているデータです。FileMaker Pro だけのものではありません。

↓↓↓コピー、切り取り、貼り付けは、次のスクリプトステップを使用して実行することもできます。 クリップボードと関係がありません。安全に作業ができるものです。

[変数を設定]スクリプトステップ → データの一時保存先として使えます
[フィールド設定]スクリプトステップ → フィールドにデータを入力できます
[フィールドを名前で設定]スクリプトステップ → フィールド名でデータを入力できます

●グローバル格納フィールド
グローバル格納フィールドは、TO やコンテキストは関係ありません。
変数と同様にデータの一時保存先としてスクリプトでも便利に使えます。

「切り替え」や「移動」

◆ホーム画面でボタンをクリックしてレイアウトを「切り替える」ことはユーザにとっては、『作業を開始する』ための何気ない作業です。
しかし、この操作は FileMaker Pro にとって、

コンテキスト(TO)を切り替える

という意味を持ちます。
そして、入力するためにフィールドをクリックすることは、

レイアウトオブジェクトへ「移動」する

ということになります。スクリプトでは、切り替えや移動はとても重要なものです。
次のスクリプトステップは、切り替えや移動に関するスクリプトステップです。

[レイアウト切り替え]スクリプトステップ
[レコード/検索条件/ページへ移動]スクリプトステップ
[関連レコードへ移動]スクリプトステップ
[ポータル内の行へ移動]スクリプトステップ
[オブジェクトへ移動]スクリプトステップ
[フィールドを選択]スクリプトステップ

◆ウインドウが複数開いている場合も選択が必要です。

どのウインドウ(コンテキスト/ TO)を選択して作業をするか

そのために次のスクリプトステップが用意されています。

[ウインドウを選択]スクリプトステップ

これらの切り替え先/移動先/選択先の指定は、スクリプトステップのオプションでおこないます。
・レイアウト、フィールド、レイアウトオブジェクト、
ウインドウの名前を任意、計算式で指定
・最初、最後、前、次、何番目のように指定したり、計算式で指定

などの方法が用意されています。

スクリプトで、切り替えや移動が重要なのは、スクリプトステップの中には『どの TO か』を指定するオプションがないものがあるからです。
例えば、

[新規レコード/検索条件]スクリプトステップ
[レコード/検索条件削除]スクリプトステップ

これらは、その実行の前に適切なレイアウトに切り替えてられていないと目的の結果が得られません。

レイアウト、ウインドウ、レイアウトオブジェクトと、コンテキスト(TO)が「現在何であるか」 は常に意識することが必要です。

スクリプト引数

スクリプトにも引数があります。引数を使う例として、レイアウトの切り替えに関するスクリプト を考えます。

💡ホーム画面から、「見積」「商品」「顧客」画面に遷移することを考えます。

①レイアウトの切り替えの流れは、ユーザ側から考えると。。。

  1. ボタンをクリックする
  2. スクリプトが実行されてレイアウトが切り替わる

↓↓↓
なので、切り替える前にレイアウト名がわからないといけません

  1. ボタンをクリックする → 切り替えるレイアウト名を指定
  2. スクリプトが実行されてレイアウトが切り替わる

ということは。
ボタンに「切り替え先のレイアウト名」を持たせなければいけません。
ここに「スクリプト引数」を 使います。

スクリプト的に細かく見てみましょう。
↓↓↓

  1. ボタンをクリックする
    実行するスクリプトと引数(レイアウト名)が指定される
  2. スクリプトが実行される
    引数に従って、指定されたレイアウトに切り替える
  3. レイアウトが切り替わる

●渡された引数の内容を得る

『Get ( スクリプト引数 )関数』

スクリプト内で、渡されたスクリプト引数の内容を得ることができます。

※スクリプト引数を利用すると、1 つのスクリプトに複数の役割を持たせることが可能です。


引数を変えれば「見積」「商品」「顧客」で同じ動作で良いの で 1 つのスクリプトで複数の画面遷移が可能です。

引数は、次の場所で実行するスクリプト名と一緒に指定します。

・ボタン
・ボタンバー
・スクリプトトリガ
・スクリプト内

実際の手順を追ってみます。

1、「ホーム」レイアウトに切り替えます。
⌘L レイアウトモードに切り替え。
2、ボタンバーの「見積管理」ボタンのスクリプトを指定します。
①ボタンバーの一番左の「見積管理」をダブルクリックして[ボタンバー設定]ダイアログを表示します。
② 現在は「ボタン仮割り当て」スクリプトが割り当てられています。
スクリプト名の右のボタンをクリックします。
③[スクリプト指定]ダイアログが表示されます。
④「レイアウト切り替え_演習用」スクリプトを選択します。
⑤歯車アイコンをクリックして[編集 …]を選択します。
⑥[スクリプトを編集]ダイアログが表示されます。

3、スクリプトを編集します。
レイアウトの切り替え[ 元のレイアウト; アニメーション : なし]
4、「元のレイアウト」をクリック。
「計算式によるレイアウト名…」をクリック。
5、「計算式の指定」ダイアログが表示される。
引数に指定されたレイアウト名を取得する計算を記入する。
Get( スクリプト引数 )
[OK]

6、「スクリプト指定」ダイアログの設定。
「オプションのスクリプト引数:」を入力する。
“見積リスト”
[OK]

他の「商品」「顧客」レイアウトへの画面遷移の設定もおこないます。

「オプションのスクリプト引数:」の設定を変えるだけです。

注意!!
「オプションのスクリプト引数:」へは、レイアウト名を記入します。
名称が違ったり、TO名を入れてしまうと上手く動作しません!

●引数に使っている名称の変更には注意
レイアウト名を変更しても引数は連動しません。切り替え先のレイアウトが見つからないため、 スクリプトエラーになります。レイアウト名やレイアウトオブジェクト名などを変更する場合、 スクリプト内やスクリプト引数で使われていないか確認してください。

[ウインドウの調整]スクリプトステップ

ウインドウの大きさを調整するものです。このスクリプトステップを使ってスクリプトを改善します。

リスト形式は表示が広い方が見やすいです。
レイアウト画面によって表示サイズをかえる設定をします。

1、[スクリプトワークスペース]を開いてください
2、「レイアウト切り替え_演習用」スクリプトを編集します。
3、スクリプトを編集
レイアウト切り替え [ Get ( スクリプト引数 ) ]

ウインドウの調整 [ 収まるようにサイズ変更 ]

[OK]

※オプションで「収まるようにサイズ変更」を選択すると表示形式やレイアウトエリアのサイズに合わ せてウインドウサイズが調整されます

[関連レコードへ移動]スクリプトステップ

現在/対象レコードの、関連レコードへ移動するものです。
関連レコードアンカーとしたTO上もレイアウトのに移動させます。

このスクリプトステップで重要なこと2点

  • どの TO(参照元)から
    スクリプト内の現在のレイアウトです
  • どの TO(参照先)の関連レコード (とレイアウト)へ移動するか

実際の手順を追ってみます。

現在、「見積詳細」のレイアウトには、関連レコードである「顧客情報」の「会社名」があります。
「会社名」をクリックした時に、「顧客情報」をコンテキストにしたTOのレイアウト画面に移動して、その特定の「会社名」の情報のみ表示させます。

1、どの TO の関連レコードへ移動するのか確認します。
2、[データベースの管理]ダイアログを開きます。
「見積詳細」レイアウトの TO は、「見積管理」TO です。
「会社名」のボタンで移動したい関連レコードは、見積先の「顧客情報」テーブルのレコード=「見積管理 _ 顧客」TO です。

切り替えたいレイアウトは「顧客表示」レイアウトです。

3、「見積詳細」レイアウトで、レイアウトモードに切り替えます。

「関連レコード切り替え _ 演習用」スクリプトが演習用に作成されています。
「見積詳細」レイアウトの現在レコードの「見積先顧客情報(関連レコード)」へ移動するスクリプトとして使います。

4、「会社名」フィールドをボタンにします。
①「見積管理 _ 顧客 :: 会社名」フィールドを右クリックします。
②「ボタン設定」を選択します。
③[ボタン設定]ダイアログが表示されます。
④[処理:]の下をクリックして[スクリプト実行]を選択します。
⑤[スクリプト指定]ダイアログが表示されます。
⑥「関連レコード切り替え _ 演習用」スクリプトを選択します。
歯車アイコンをクリックして[編集 …]をクリックします。 スクリプトが表示されます。

5、スクリプトを編集します。
[関連レコードへ移動]スクリプト ステップ を選択します。
6、[関連レコードへ移動]スクリプトステップのオプションを設定します。
・[関連レコードの取得元]は 「見積管理 _ 顧客」
・[レコードの表示に使用するレイアウト]は 「顧客管理|マスタ詳細」
・[アニメーション]は そのまま
・[結果オプション:]は「新規ウインドウに表示」を オフ 「関連レコードのみを表示」を オン
「現在のレコードのみ照合」をクリック

7、[OK]をクリックしてオプションを保存します。
8、スクリプトの完成形は次の内容です。スクリプトを保存します。
関連レコードへ移動 [ テーブル:「見積管理_顧客」; 使用するレイアウト: 「顧客管理|マスタ詳細」(顧客管理) ]

 

●関連レコードをカードウインドウで表示するスクリプト
関連レコードを参照しながら操作したいなどの場合
(別のウインドウで顧客情報を見て、必要無くなれば閉じるという操作。)

別のウインドウを使うということは。。。新規ウインドウを設定するということ。
ウインドウスタイルの説明 参考
👉FileMaker 【24】出力と集計(グラフとウインドウ) 目次 2、ウインドウスタイル

実際の手順を追ってみます。
前回のスクリプトを修正して設定していきます。

1、⌘S スクリプトワークスペースを開く
2、「関連レコード切り替え_演習用」スクリプトを編集します。
3、オプションを設定していきます。
4、[結果オプション:] 「新規ウインドウに表示」を オン
「関連レコードのみを表示」を オン
5、[新規ウインドウ]のオプション ダイアログが表示されます。
・[ウインドウスタイル:] 「カード」
・[ウインドウ名:] 「見積先の顧客情報」
・[レイアウト:] すでに選択済み
・[サイズ:] そのまま
・[位置:] 「上端から」「0」  「左端から」なにも設定しない
・[ウインドウオプション] 
「閉じる」「親ウインドウ淡色表示」の 2 つを オン [OK]をクリックしてダイアログを閉じます。

ウインドウの数が増えると、「いまどのウインドウを操作しているか」分からなくなってユーザーが困ってしまいます。
閉じる制御をかけることで、ウインドウだらけになることを防ぎましょう!
※制御については後章

●自己リレーションを使って関連レコードへ移動
「見積先顧客情報が同じである別のレコード」(関連レコード)へ移動する方法を考えます。


1、どの TO の関連レコードへ移動するのか確認します。
2、[データベースの管理]ダイアログを開きます。
「見積詳細」レイアウトの TO は、「見積管理」TO です。
関連レコードへ移動したいポータルの「>」ボタンで移動したい先は、 見積先の「顧客情報」テーブルのレコード=「見積管理|履歴|自己」TO です。

切り替えたいレイアウトは、同じ「見積詳細」レイアウトです。

3、「見積詳細」レイアウトで、レイアウトモードに切り替えます。

演習用として、「見積詳細」レイアウトの現在のレコードの「見積先顧客情報が同じ別のレコード」(関連レコード)へ移動するスクリプトとして、「関連レコード切り替え _ 演習用(ポータル)」スクリプトを作成して左図の「>」ボタンに割り当ててあります。これを使います。

4、スクリプトワークスペース]を表示し「関連レコード切り替え_演習用(ポータル)」スクリプトを編集します。
関連レコードへ移動

5、オプションを設定
・[関連レコードの取得元] 「見積管理|履歴|自己」
・[レコードの表示に使用するレイアウト] <現在のレイアウト>そのまま
・「関連レコードのみを表示」 「オン」
・「現在のレコードのみ照合」 そのまま
・[アニメーション] そのまま
・[結果オプション:] 「新規ウインドウ表示」を「オフ」
「関連レコードのみを表示」を「オン」で
「現在のレコードのみ照合」をクリック

6、[OK]をクリックしてオプションを保存します。

 

これで、「>」をクリックすると「見積登録タブ」に「特定の関連レコードが表示されるようになりました。

でも毎回、タブをクリックして移動しないと「見積登録タブ」の表示内容が見れません。手間ですよね〜

 

「>」をクリックすると同時に「見積登録タブ」に移動するようにスクリプトステップを設定して見ましょう✨

1、まず、「見積登録タブ」にオブジェクト名をつけます。
⌘L「見積登録タブ」を指定、右パネル「位置タブ」[▼位置][名前] 見積情報タブ
2、スクリプトワークスペースを表示、「関連レコード切り替え_演習用(ポータル)」を編集。

関連レコードへ移動 [ テーブル:「見積管理|履歴|自己」; 使用するレイアウト: <現在のレイアウト> ]

オブジェクトへ移動 [ オブジェクト名:”見積情報タブ” ]
↑追加

●関連レコードへ移動 どこで起動させるかで結果が変わる
[関連レコードへ移動]のスクリプトステップをどこで実行するかで、表示の結果が少し変わってきます。(スクリプトステップを始めるボタンがポータル外、ポータル内にあるか など)

 ①「顧客管理|マスタ」レイアウトに置いた「顧客管理_見積」ポータル内の一つ一つにボタンがある場合。
②「顧客管理|マスタ」レイアウトにボタンがある場合。

①[関連レコードの取得元:]「顧客管理_見積」で「関連レコードのみ表示」「現在のレコードのみ照合」になっているため、ボタンを押すと関連レコードとして、6件表示されたうちの、特定のレコードが表示される。(例 3/6 6レコード中の3番目のレコード)

②[関連レコードの取得元:]「顧客管理_見積」で「関連レコードのみ表示」「現在のレコードのみ照合」になっているため、ボタンを押すと関連レコードとして、6件表示されたうちの、一番目のレコードが自動的に表示される。(例 常に1/6 6レコード中の1番目のレコード)

●関連先にレコードが無い場合
関連レコードへ移動は、関連レコードが無い場合、ボタンを押しても、なにも起きません。
これだけなら良いですが、これにより思わぬ問題が発生してしまう可能性もあります。

そのためには、「エラーになる前に」エラー処理を行います。

1、スクリプトを編集します。
関連レコードに移動する前に、関連レコードが存在するか確認するスクリプトステップを記述します。

If [ IsEmpty ( 顧客管理_見積::主キー ) ]
カスタムダイアログを表示 [ “見積なし” ; “見積はありません” ]
Else
関連レコードへ移動 [ テーブル:「顧客管理_見積」; 使用するレイアウト: 「見積詳細」(見積管理) ]
End If

IsEmpty フュールドが空またはエラーの場合「真」を返す関数

If [ IsEmpty ( 顧客管理_見積::主キー ) ]
//「顧客管理_見積::主キー」が空欄なら↓
カスタムダイアログを表示 [ “見積なし” ; “見積はありません” ]
Else
関連レコードへ移動 [ (省略) ]
//「顧客管理_見積::主キー」が空欄でなければ↓
関連レコードへ移動 [ テーブル:「顧客管理_見積」; 使用するレイアウト: 「見積詳細」(見積管理) ]
End If

●関連レコードを1件にする
現在の状況はリレーションで絞られた6件の関連レコードの中の1件を表示させています。左上の<>をクリックすると6件を行き来できる状態です。(1/6)

これがややこしいという場合も有るかと思います。
関連レコード一件のみにする方法を考えます(1/1)自己リレーションを使います。

1、自己リレーションを作成
「顧客管理_見積|自己」TOを作成し、主キー同士を繋げます。
これで1件のみが表示されることになります。

2、スクリプトの編集
下線赤を変更。

If [ IsEmpty ( 顧客管理_見積::主キー ) ]
カスタムダイアログを表示 [ “見積なし” ; “見積はありません” ]
Else
関連レコードへ移動 [ テーブル:「顧客管理_見積|自己」; 使用するレイアウト: 「見積詳細」(見積管理) ]
End If


11章はまだまだ終わりません😭
長くなってしまいましたので続きは次にしましょう〜

次回は11章「スクリプトと自動化」
「条件分岐、変数、引数」〜 学習していきます👍

コメント

タイトルとURLをコピーしました