FileMaker公式テキスト中級編!!!
中級編では、
中級開発者として複数の利用者を想定してシンプルなカスタムAppを作成する
といった内容になります。
全16章です。
前回は、11章『スクリプトと自動化 前半』学びました。
👉FileMaker 中級編(11章)前半
今回は、11章『スクリプトと自動化 後半』
「条件分岐、変数、引数」〜 についての知識を学びます。
スクリプトの作成
条件分岐、変数、引数
[If]スクリプトステップなどを使って「条件分岐」をおこなうことが多々あります。いずれも、論理値として評価されるように[If]あるいは[Else If]スクリプトステップに 計算式を記述します。
●分岐する内容
・命令に必要なデータによる分岐(引数、変数、フィールドなどのデータ)
・スクリプトとユーザの対話による分岐(カスタムダイアログでユーザが選ぶ)
[If]、[Else If]、[Else]、[End If]スクリプトステップ
関数の If と構造はほぼ同じです。計算式の結果は論理値として返ります。
「1(真 = True )」であるかどうかで実行する内容が決まります。
If [ここに条件(計算式)を設定する]
条件(計算式)の結果が「1(真 = True)」だったら実行する内容
End if
↓↓↓よく使用する方法
If [ここに条件(計算式)を設定する]
条件(計算式)の結果が「1(真 = True)」だったら実行する内容
Else
条件(計算式)の結果が「1以外」(偽 = False)だったら実行する内容
End if
↓↓↓このような形で、[Else If]スクリプトステップはいくつでも挟めます。
複数を設定すると、最初 に 1(真 = True )に一致した条件(計算式)の後に記述されているスクリプトステップを実行します。Case 関数に似ています。
If [ここに条件(計算式)を設定する]
条件(計算式)の結果が「1(真 = True)」だったら実行する内容
Else If [ 2番目の論理計算式 ]
2番目の条件(計算式)の結果が「1(真 = True)」だったら実行する内容
Else If [ 3番目の論理計算式 ]
3番目の条件(計算式)の結果が「1(真 = True)」だったら実行する内容
Else If [ 4番目の論理計算式 ]
4番目の条件(計算式)の結果が「1(真 = True)」だったら実行する内容
Else
これまでの条件(計算式)すべてが「1 以外」(偽 =False)だったら実行する内容
End if
●スクリプト引数でレイアウトを切り替える
スクリプト引数を使って、条件分岐をすることで一つのスクリプトを複数場所で共通利用することができる。
前回までの演習で、
・見積から顧客のレイアウトへ
・見積から見積のレイアウトへ
・顧客から見積のレイアウトへ
のスクリプトをそれぞれ作りました。
この3つのスクリプトをスクリプト引数と条件分岐を使って1つのスクリプトで表してみます。
1、[スクリプトワークスペース]を表示し「関連レコード切り替え_演習用(分岐)」スクリプト を編集します。
If[Get ( スクリプト引数 ) = “見積から顧客”]
# 見積から顧客を表示
# 演習 11-4 の内容 関連レコードへ移動 [(省略)]
Else If[Get ( スクリプト引数 ) = “見積から見積”]
# 見積から見積先が同じ見積の表示
# 演習 11-6 の内容
関連レコードへ移動 [(省略)]
オブジェクトへ移動 [(省略)]
Else If[Get ( スクリプト引数 ) = “顧客から見積”]
# 顧客から見積を表示
# 演習 11-8 の内容
If [ IsEmpty ( 顧客管理_見積::主キー ) ] カスタムダイアログを表示[(省略) ]
Else
関連レコードへ移動 [(省略)]
End If
End If
2、ボタンにスクリプト、スクリプト引数を設定する。
スクリプトで多数の分岐を使う場合は、すべての分岐結果を確認する必要があります。
スクリプトでバッガを使って必ずテストしましょう❗️
スクリプトと変数
スクリプトで変数を使うことの利点があります。
・記述がシンプルになる
・データビュアーを使って変数で取得した値を確認しながらデバッガをおこなえる
●スクリプトで変数を使う
1、[スクリプトワークスペース]を表示
関連レコード切り替え_演習 用(分岐)」スクリプトをクリックします。
2、スクリプトの編集
最初の[If]の前に空白行を入れて次のスクリプトステップを入力します。
[変数を設定]
オプションを設定します。
・[名前:]は 「$ 画面遷移」($ は半角)
・[値:]は [指定 …]をクリックして、計算式を入力
Get( スクリプト引数 )
3、スクリプトを引数を使った内容に書き換えます。
Get ( スクリプト引数 ) を変数($ 画面遷移)と置き換えます。
●変数の管理に注意
変数名を間違えて入力するとスクリプトが想定どおりに動作しません。変数名の管理やチェックをきちんと行います。なお、変数名は英文字では大文字小文字の区別はありません。
サブスクリプト
スクリプト内で、さらにスクリプトを呼び出して実行できます。呼び出される側のスクリプトを 「サブスクリプト」と呼びます。
スクリプト(呼び出した側)は、サブスクリプトが終わるのを待ちます。
サブスクリプトは、よく使うスクリプトを「モジュール」として扱うときに便利です。
モジュール >>> ひとまとまりの機能のことを指します。サブスクリプトを 1 つあるいは複数組み合わせて 1 つの機能 をつくると考えてください。
印刷のための用紙サイズ、印刷ダイアログ、引数を使用して任意のレイアウトオブジェクトへ移動するなど、あちこちで呼び出されるようなものをサブスクリプトにすると便利です。
サブスクリプトは、次のスクリプトステップで呼び出します。
[スクリプト実行]スクリプトステップ
●サブスクリプトへ引数を渡す
サブスクリプトにもオプションとして引数を設定できます。『Get( スクリプト引数 ) 関数』で、現在のスクリプトからサブスクリプトへ引数をそのまま引き渡せます。また、現在のスクリプトの変数やフィールドのデータなど、別の引数を設定することも、もちろん可能です。
●サブスクリプトと実行結果
サブスクリプトを実行後に結果を受け取ることができます。
『Get( スクリプトの結果 )関数』
実行したサブスクリプトの結果で条件分岐することもできます。
この関数が取得するのは、最後に実行されたサブスクリプトの結果です。複数のサブスクリプトの結果を比較して条件分岐する場合などには、それぞれの結果を変数やグローバル格納フィールドを使って保持します。
↓↓↓実際の手順を追ってみます
1、[スクリプトワークスペース]を表示(⌘ shift S)
「関連レコード切り替え_演習用(分岐/サブスクリプト)」を編集します。
(演習用でファイルは途中まで記述されています。)
2、スクリプトの編集
関連レコードへ移動 [(省略)] をスクリプトの実行に置き換えていきます。
○コメント行「見積から顧客を表示」の次行に「スクリプトの実行」スクリプトステップを入力します。
オプション設定
・[指定:] 「一覧から」
・ < 不明 > をクリック 「関連レコード切り替え _ 演習用」を選択
・[引数は:] なし
他2つも同様、
○コメント行「見積から見積先が同じ見積の表示」
次行に[スクリプト実行]スクリプト ステップを入力。
・ < 不明 > をクリック 「関連レコード切り替え _ 演習用(ポータル)」を選択
○コメント行「顧客から見積を表示」
次行に[スクリプト実行]スクリプトステップを入力
・ < 不明 > をクリックして「関連レコード切り替え _ 演習用(顧客)」を選択
変数を設定 [ $画面遷移; 値:Get(スクリプト引数) ]
If[ $画面遷移 = “見積から顧客”]
# 見積から顧客を表示
スクリプト実行[ 指定:一覧から ;「関連レコード切り替え_演習用」]
Else If[ $画面遷移 = “見積から見積” ]
# 見積から見積先が同じ見積の表示
スクリプト実行[ 指定:一覧から ;「関連レコード切り替え_演習用(ポータル)」]
オブジェクトへ移動 [ オブジェクト名 : “見積情報タブ” ]
Else If[ $画面遷移 = “顧客から見積” ]
# 顧客から見積を表示
スクリプト実行[ 指定:一覧から ;「関連レコード切り替え_演習用(顧客)」]
End If
複数の引数
スクリプトには、1つの引数しか設定できません。

複数の引数を設定したい場合そうすれば良いのでしょうか?
考え方としては、1つのスクリプト引数に複数の内容を記述して渡し、受け取る側がそれを分解して受け取る。
といった流れが必要になります。
やり方は様々ありますが、代表的な2点を解説します。
・値一覧の文字列 を使ったもの
・JSON形式の文字列 を使ったもの
タイプ | 値一覧の文字列 | JSON形式の文字列 |
特徴 | 値の種類を行番号で指定 | 値の種類を名前(要素)と共に指定 |
設定 | 引数1¶引数2¶引数3 | JSONSetElement 関数 |
取得 | GetValue 関数 | JSONGetElement 関数 |
メリット | ・設定が簡単 ・少数の引数に有効 |
・引数の順番を考慮しなくても良い ・多数の引数を簡単に扱える |
注意事項 | ・引数の内容に改行があってはダメ ・行番号と内容の組み合わせに注意 |
・JSON関数に親しむ必要がある ・バージョン16以上が必要 |
JSON形式の文字列とは。。。
『JSONSetElement ( json ; キーまたは索引またはパス ; 値 ; タイプ )』
例
JSONSetElement (“{}” ; “A” ; “aa5” ; 2 )関数
結果は
{“A”:5}
※タイプはデータの型です。
JSONString (1) FileMaker テキスト
JSONNumber (2) FileMaker 数字
JSONObject (3)JSON オブジェクト
JSONArray (4) JSON 配列
JSONBoolean (5) FileMaker 値または JSON 論理値
JSONNull (6) タイプは無視 JSONRaw (0) JSON 要素 (値が有効な JSON ではない場合は JSON 文字列)
詳しくはヘルプ を確認してください。
『JSONGetElement ( json ; キーまたは索引またはパス )』
例
JSONGetElement ( Get(スクリプト引数) ; “A” )
特徴 名前(要素)と値をペアで記述する
利用シーン REST API(Webサービス) スクリプト引数や結果
↓↓↓実際の手順を追ってみます (値一覧)
1、[スクリプトワークスペース]を表示
「画面遷移_演習用(GetValue)」スクリプトを編集します。
$遷移種類 の変数にスクリプト引数の1行目の内容を代入する
$遷移内容を2行目 の変数にスクリプト引数の2行目の内容を代入する
それぞれの値によって条件分岐の内容が変わるように設定。
#変数を取得(GetValue関数)
変数を設定 [ $遷移種類; 値:GetValue ( Get(スクリプト引数) ; 1 ) ]
変数を設定 [ $遷移内容; 値:GetValue ( Get(スクリプト引数) ; 2 ) ]
#1行目の変数 $遷移種類 で条件分岐
If [ $遷移種類 = “レイアウト切り替え” ]
# 2行目の変数 $遷移内容 を引数としてサブスクリプト実行
スクリプト実行 [「レイアウト切り替え_演習用」; 引数: $遷移内容 ]
Else If [ $遷移種類 = “関連レコード移動” ]
# 2行目の変数 $遷移内容 を引数としてサブスクリプト実行
スクリプト実行 [「関連レコード切り替え_演習用(分岐/サブスクリプト)」; 引数: $遷移内容 ]
End If
ウインドウの調整 [ 収まるようにサイズ変更 ]
2、⌘L レイアウトモードのボタン設定を変更
[処理:]スクリプト実行
[開始:]現在のファイル を上記で作成したスクリプトに設定「画面遷移_演習用(GetValue)」
[オプションのスクリプト引数:] に改行区切りの値を設定
“レイアウト切り替え” ⇦1行目(遷移種類)
& ¶ &
“見積リスト” ⇦2行目(遷移内容)
↓↓↓上記を 「JSON 関数を使った引数の指定と、変数への設定」で行ってみます
1、[スクリプトワークスペース]を表示
「画面遷移_演習用(JSON)」スクリプトを編集します。
変数の設定方法が変わります。
2、[変数を設定]スクリプト ステップを入力します。
オプションを設定します。
・[名前:]は 「$ 遷移種類」
・[値:]は [指定 …]をクリックして、計算式を入力
JSONGetElement ( Get(スクリプト引数) ; “遷移種類” )
3、次の行も[変数を設定]スクリプトステップを入力します。
オプションを設定します。
・[名前:]は 「$ 遷移内容」
・[値:]は [指定 …]をクリックして、計算式を入力
JSONGetElement ( Get(スクリプト引数) ; “遷移内容” )
#変数を取得(JSONGetElement関数)
変数を設定 [ $遷移種類; 値: JSONGetElement ( Get(スクリプト引数) ; “遷移種類” )]
変数を設定 [ $遷移内容; 値: JSONGetElement ( Get(スクリプト引数) ; “遷移内容” ) ]
#1行目の変数 $遷移種類 で条件分岐
If [ $遷移種類 = “レイアウト切り替え” ]
#2行目の変数 $遷移内容 を引数としてサブスクリプト実行
スクリプト実行 [「レイアウト切り替え_演習用」; 引数: $遷移内容 ]
Else If [ $遷移種類 = “関連レコード移動” ]
#2行目の変数 $遷移内容 を引数としてサブスクリプト実行
スクリプト実行 [「関連レコード切り替え_演習用(分岐/サブスクリプト)」; 引数: $遷移内容 ]
End If
ウインドウの調整 [ 収まるようにサイズ変更 ]
3、⌘L レイアウトモードのボタン設定を変更
ホームのレイアウト上の「見積管理」ボタンに「画面遷移 _ 演習用(JSON)」 スクリプトを割り当ててます。
引数を指定します。
JSONSetElement ( “{}” ;
[” 遷移種類 ” ; ” レイアウト切り替え ” ; 1];
[” 遷移内容 ” ; ” 見積リスト ” ; 1] )
スクリプトを実行すると
変数を設定 [ $遷移種類; 値: JSONGetElement ( Get(スクリプト引数) ; “遷移種類” )]
変数を設定 [ $遷移内容; 値: JSONGetElement ( Get(スクリプト引数) ; “遷移内容” ) ]
↓↓この2行でスクリプト引数を引っ張ってきます。
[” 遷移種類 ” ; ” レイアウト切り替え ” ; JSONString];
[” 遷移内容 ” ; ” 見積リスト ” ; JSONString] )
要素である“遷移種類” “遷移内容”についてデータである
遷移種類 → レイアウト切り替え(データ)
遷移内容→ 見積リスト(データ)
をセットにした値をJSON形式で返します。
ユーザと対話する
これまでの条件分岐は引数や変数のデータを使いましたが、もうひとつの条件があります。
スクリプトとユーザの対話による分岐(カスタムダイアログでユーザが選ぶ) です。
2 つの要素が必要です。
・[カスタムダイアログを表示] スクリプトステップ
・Get (最終メッセージ選択)関数
●[カスタムダイアログを表示]スクリプトステップ
カスタムダイアログを表示する目的は、次のどちらかです。
①ユーザがスクリプトに提示された内容から答えを選択してもらう → 主に条件分岐へ
②特定のフィールドへ入力してもらう
①ユーザがスクリプトに提示された内容から答えを選択してもらう → 主に条件分岐へ
スクリプトステップで[カスタムダイアログを表示]を選択しオプション設定します。
「答えを選択」してもらうには、オプションのダイアログの「一般」タブで設定します。

[タイトル:][メッセージ:]
ボタン名は文字列、または[指定 …]ボタンをクリックして計算式を指定できます。

選択肢は3つ設定できます。
ボタンの表示順は左から [ボタン 3][ボタン 2][デフォルトボタン] です。
②特定のフィールドへ入力してもらう
[カスタムダイアログを表示] オプション設定のダイアログの「入力フィールド」タブで設定します。
フィールドの上に表示する[ラベル:]は文字列、または[指定 …]から計算式で指定できます。
また、入力フィールドは、フィールド名か、変数名を 3 つ設定できます。
目的のフィールドを指定しても良いですが、グローバル格納フィールドを使用したり、 変数名を指定すると、入力後にスクリプト内でなんらかの判断をしてから適切なフィールドに入力するなどの動作ができるので便利です。
入力された文字を「●」で隠すことが可能です。
Get ( 最終メッセージ選択 ) 関数
「一般」タブで設定できるボタンのうち、どれをユーザがクリックがわかる関数です。
『Get (最終メッセージ選択)』
次の結果(数値)が返ります。
デフォルトボタンは 1
ボタン2は 2
ボタン3は 3
結果の数字を使用して[If]で条件分岐することが可能です。
スクリプトで印刷する
スクリプトとユーザの対話による分岐の演習として、印刷用スクリプトを作成します。
スクリプトと対話します。
(1)ボタンをクリックする
(2)「見積発注書|印刷用」レイアウトへ切り替える
(2-1) 対象レコードを 1 件にする
(3)用紙サイズを確認する(A4 サイズ)
(4)印刷(PDF 作成)する
(5)元のレイアウト(「見積詳細」レイアウト)へ戻る
をスクリプトに設定していきます。
カスタムダイアログを表示 [ タイトル: “印刷”; “見積発注書を印刷しますか? “]
If [ Get(最終メッセージ選択) = 1 ]
レイアウト切り替え [「見積発注書|印刷用」(見積管理) ]
印刷設定 [ 記憶する ; ダイアログあり : オフ]
印刷 [ 記憶する:(プリンタ名); ダイアログあり : オン]
レイアウト切り替え [ 元のレイアウト ]
Else End If
元のレイアウトに戻る
レイアウトを切り替えて印刷する場合、元のレイアウトに戻るようにしなければいけません。印刷実行だけでスクリプトが終了すると、ユーザが戸惑うことになります。
エラーを処理する
現在の印刷演習では、スクリプトで2回のダイアログが表示されます。
1つ目はカスタムダイアログです。
「する」「しない」を選択します。
ここでは条件分岐で
・「する」1の場合は印刷へ進む
・それ以外「しない」の場合は印刷せずにスクリプトを終了する
となっています。
2つ目のダイアログは。。。
印刷ダイアログで「プリント」か「キャンセル」を選択します。
・「プリント」プリントが実行されます
・「キャンセル」を選択すると新たなダイアログが表示されます。

[キャンセル]をクリックするとスクリプトが「中断」して元のレイアウトに戻れません!!

エラー内容を分かりやすくしたら、ユーザーがキャンセルを押さず『続行』で元の画面に戻れるのではないでしょうか?
エラー後に、適切にスクリプトを実行し続ける(あるいは終了する)ための
スクリプトステップと関数が用意されています。
これらも条件分岐に使われます。
『[エラー処理] スクリプトステップ』
※[エラー処理]はデフォルトで「オフ」になっており、その状態だとFileMaker側がエラーを見つけた際独自のエラーログで教えてくれます。
カスタムダイアログを表示させたい場合は、一度[エラー処理]を「オン」にして処理を行い、処理がおわったら再び[エラー処理]を「オフ」にしておくことを忘れずに!
エラー処理 オン
エラー処理 オフ はセットで使用
『Get(最終エラー )関数』
現在のスクリプトを修正してみます。
カスタムダイアログを表示 [ タイトル: “印刷”; “見積発注書を印刷しますか? “]
If [ Get(最終メッセージ選択) = 1 ]
レイアウト切り替え [「見積発注書|印刷用」(見積管理) ]
印刷設定 [ 記憶する ; ダイアログあり : オフ]
エラー処理 [ オン]
印刷 [ 記憶する:(プリンタ名); ダイアログあり : オン] If [ Get(最終エラー ) ]….①
カスタムダイアログを表示 [ タイトル: “エラー”; “キャンセルされました “]….②
End If
エラー処理 [ オフ]
レイアウト切り替え [ 元のレイアウト ]
Else End If
↑↑↑上記では①でキャンセルが押されたことでエラーが発生し、
そのエラーに対して②が行われるという流れです。
エラー処理
思っているよりも色々な場面でエラーが起こると思います。
FileMakerのヘルプでもエラーコードの記載があり、様々なエラーを確認することができます。
開発では、エラーをきちんと処理し、ユーザーが使いやすいスムーズなシステムが作れるような心がけが必要です。
スクリプトで PDF 保存
印刷以外に PDF を保存できるようにします。カスタムダイアログの選択を 3 つに増やします。
Get( 最終メッセージ選択 ) の結果の想定は以下です。
・「1」 「印刷する」
・「2」 「PDF 保存する」
・「3」 なにもしない
エラー処理も行います。
実際の手順を追ってみます。
カスタムダイアログを修正します。
1、カスタムダイアログを表示でオプションを変更します。
・[タイトル:]は 「印刷または PDF」
・[メッセージ:]は 「見積発注書を印刷またはPDF保存しますか?」
ボタンは
・[デフォルトボタン]・・・「印刷」 「データを確定」は オン そのまま
・[ボタン 2]・・・「PDF」 「データを確定」は オン
・[ボタン 3]・・・「やめる」 「データを確定」は オフ そのまま
2、条件分岐を書き換える
現在、[ Get(最終メッセージ選択) = 1 ]の場合の条件は書かれています。
[ Get(最終メッセージ選択) = 2 ]の場合の条件を書きます。
エラーは[ Get(最終メッセージ選択) = 1 ]でも[ Get(最終メッセージ選択) = 2 ]でも起こりうるので配置を変更します。エラー処理 [オン] エラー処理 [オフ]で全体を挟みます。
カスタムダイアログを表示 [ タイトル: “印刷またはPDF”; “見積発注書 を印刷または PDF 保存しますか “]
エラー処理 [ オン]
If [ Get(最終メッセージ選択) = 1 ]
レイアウト切り替え [「見積発注書|印刷用」(見積管理) ]
印刷設定 [ 記憶する ; ダイアログあり : オフ]
印刷 [ 記憶する:(プリンタ名); ダイアログあり : オン]
Else If [ Get(最終メッセージ選択) = 2 ]
レイアウト切り替え [「見積発注書|印刷用」(見積管理) ]
印刷設定 [ 記憶する ; ダイアログあり : オフ]
レコードをPDFとして保存[ 記憶する ; ダイアログあり : オン ; 現在のレコード ; フォルダを作成 : オフ]
Else
End If
If [ Get(最終エラー ) ]
カスタムダイアログを表示 [ タイトル: “エラー “; “キャンセルされました “]
End If
エラー処理 [ オフ]
レイアウト切り替え [ 元のレイアウト ]
スクリプトの作成 その 2
前回、PDF を保存するとき、ファイル名と保存場所を指定する必要がありました。
状況によっては自動的に指定された方が良いかもしれません。
例えば、ファイル名になにも指定しないと「名称未設定 .pdf」という名前で保存されますが、内容がわかりづらいので取り扱いを間違ってしまうかもしれません。
スクリプトを使えば、保存先を自動入力することができます。
パスを変数で指定する
PDF の保存先やファイル名も関数を使って変数として指定することが可能です。
FileMaker Pro にはパスを作成するために便利な関数があります。
『Get( デスクトップパス )』
現在のユーザのデスクトップフォルダへのパスを返します。
FileMaker Pro で John Smith というユーザの場合:
Windowsは /C:/Users/John Smith/Desktop/
macOSは /Macintosh HD/Users/johnsmith/Desktop/
『Get( ドキュメントパス )』
現在のユーザのドキュメントフォルダへのパスを返します。
FileMaker Pro で John Smith というユーザの場合:
Windows → /C:/Users/John Smith/Documents/
macOS → /Macintosh HD/Users/johnsmith/Documents/
FileMaker Server は
Windows → /C:/Program Files/FileMaker/FileMaker Server/Data/Documents/ macOS → /Macintosh HD/Library/FileMaker Server/Data/Documents/
『Get( テンポラリパス )』
現在のユーザのFileMaker Proで使用されている一時フォルダへのパスまたは FileMaker Server で使用されるパスを返します。
スクリプト終了で自動的に消去される。
※ これらの関数の結果は、OS の種類やバージョンによって異なる場合があります。
↓↓↓Get( ドキュメントパス ) 関数などを使って
PDF のファイル名と保存先パスを自動作成してみましょう。
前回、スクリプトでPDFを自動化しました。今回はPDF名が自動で入力されるように設定していきます。
1、[スクリプトワークスペース]で「印刷_演習用」スクリプトを開きます。
2、ElseIf[Get( 最終メッセージ選択 ) = 2]の行下にある、[印刷設定]の次の行にスクリプトステップを追加します。
『変数を設定』
オプションを指定。
・[名前:]は 「$PDF 保存場所」
・[値:]は [指定 …]をクリックして、計算式を入力
Case (
Get ( システムプラットフォーム ) =1 + “filemac:” ;
Get ( システムプラットフォーム ) =-2 + “filewin:” ;
“” )
&
Get ( ドキュメントパス ) &
見積管理::見積番号 & “-” &
Filter ( Get(タイムスタンプ) ; “0123456789” ) &
//Get( タイムスタンプ ) は「2018/10/25 2:39:46」のような結果となるので、 Filter 関数で数字だけにしてファイル名に使用します。
“.pdf”
検索をスクリプトで行う
カスタム App では検索は重要な機能です。ユーザが対象レコードを作成するために必要です。
検索のために以下のようなスクリプトステップが用意されています。
[検索モードに切り替え]
[新規レコード/検索条件]
[検索実行]
[クイック検索]
[対象レコードの絞り込み]
[対象レコードの拡大]
[検索条件を変更]
[レコードを対象外に]
[一致するレコードを検索]
●[検索実行]スクリプトステップ
オプションになにも指定しないと検索が実行されます。
検索条件をこのスクリプトステップに直接指定すると、その条件で検索が実行されます。
あらかじめ決まった検索条件で検索する場合に使用できます。
※パッと見てどのような条件で検索しているのかよくわからないため注意が必要です。
※検索条件には演算子、文字列、変数名 のみを検索条件として指定できます。
これらのスクリプトステップを使ってメニューやステータスツールバーのアイコンをクリックして おこなう検索と同じようにスクリプトで検索を実行できます。
(1)検索モードに切り替える
(2)検索条件を入力する
(3)検索を実行する
(4)結果が表示される
流れは上記となりますが、さらにエラー処理が必要です。
検索の結果がない場合、どうするべきかを考えます。
(「401」= 検索条件に一致するレコードがありません)
↓↓↓実際の手順を追って確認してみましょう
●あらかじめ検索内容を設定しておいて、絞り込みを実行するスクリプト
1、演習ファイルでは「検索 _ 演習用(条件あり)」スクリプトが
「見積リスト」レイアウトの「注文あり」ボタンに割り当てられています。
2、「検索_演習用(条件あり)」スクリプトを編集します。
3、検索モードに切り替え
※オプションは一時を「オフ」
「オン」は、検索ワードを自分で入力する場合などに使用します。
4、レイアウトのきりかえ
※オプションは 「見積リスト」レイアウトを指定します。
他のレイアウト上から操作をすることも想定して、念の為設定しておきます。
5、フィールド設定
オプションは
・[ターゲットフィールドの指定][指定 …]をクリック「見積管理 :: 見積結果」フィールド を指定
・[計算結果:][指定 …]をクリックして、「”注文あり”」を入力
※入力するフィールドとそのフィールドに入力する値
6、レコード/検索条件確定
オプションは ダイアログを「オン」
7、エラーを想定し(検索結果がなかった場)エラー処理を設定
エラー処理 [ オン ]
検索実行
[エラー処理]スクリプトステップは、 「オン」
[検索実行]スクリプトステップは、なにもオプションを設定しません。
8、エラー結果の条件分岐 [If]スクリプトステップを入力します。
If [ Get(最終エラー ) ]
※最終エラーがあった場合(1の場合)以下を実行
カスタムダイアログを表示 [“結果なし”; “「注文あり」の見積書はありません” ]
※オプション
・[タイトル:]は 「結果なし」と入力
・[メッセージ:]は 「注文あり」の見積書はありません。
ボタンは
・[デフォルトボタン] 「OK」 のみ設定
End If
9、[End If]スクリプトステップの下に
エラー処理 [ オフ]
検索モードに切り替え [一時停止 : オフ]
レイアウト切り替え [「見積リスト」(見積管理) ]
フィールド設定 [見積管理 :: 見積結果 ; “注文あり”]
レコード/検索条件確定 [ダイアログあり : オン]
エラー処理 [ オン]
検索実行
If [ Get(最終エラー ) ]
カスタムダイアログを表示 [“結果なし”; “「注文あり」の見積書はありません” ]
End If
エラー処理 [ オフ]
●エラーが正常に処理されるかの確認
フィールド設定 [見積管理 :: 見積結果 ; “あいうえお”]
エラー状態を確認するには、エラーになるようなテストデータを用意しても良いですし、次 のようにエラーになるようにスクリプトステップを加工してテストしても良いかもしれませ ん。
※元に戻すのを忘れないでください。
●検索条件と引数
検索条件としてスクリプト内で[フィールド設定]するデータは、
Get ( スクリプト引数 ) 関数 を使ったり、変数名を指定することも可能です。
●ユーザが検索条件を入力する
ユーザが条件を入力する検索設定方法も、内容はほぼ同じです。
次は、「検索 _ 見本」スクリプトの内容です。 「見積リスト」レイアウトでボタンをクリックすると、検索モードで一時停止して検索条件の入力を待ちます。
検索実行は[return]や[Enter]キーを押すことを期待しています。
[ユーザによる強制終了を許可]スクリプトステップ
一時停止などで、ユーザがスクリプトをキャンセルできないようにします。
[検索モードに切り替え]の「一時停止オプション オン」のみの場合
レイアウトバーに[続行][キャンセル]が表示されます。
[キャンセル]をクリックすると、検索モードから ブラウズモードに戻って、スクリプトも中断してしまいます。
[キャンセル]を表示させないようにするには。。。
スクリプトの冒頭に
[ユーザによる強制終了を許可]「オフ」
を挿入します。
このようにスクリプトには[ユーザによる強制終了を許可]「オフ」にしておいた方が、意図した動きになるのでオススメです!
スクリプトの途中で操作を中止させたいようなことがあるならば、スクリプトの中に条件分岐を記述し、中止を選んで元の画面に戻るような処理を書けば良いです。
[フィールド設定]スクリプトステップ
[フィールド設定]はよく使います。
オプションは 2 つ。
・ターゲットフィールド データを設定するフィールド名を指定します。
・計算結果 設定するデータを指定します。フィールドを空欄にしたい場合は「””」と指定します。
もちろん計算式で指定することも変数名を指定することもできます。
●TO に注意する
ターゲットフィールドや、計算結果は、そのスクリプトが実行されるレイアウトの TO やコンテキストと合致していなければなりません。
但しレイアウト上に配置されている必要はありません。
↓↓↓フィールド設定を利用して、グローバル格納フィールドを利用した検索を行うことができます。
検索モードに切り替え [一時停止 : オフ]
レイアウト切り替え [「見積リスト」(見積管理) ]
フィールド設定 [見積管理::見積状況 ; z_ユーティリティ ::g_テキスト01]
フィールド設定 [見積管理::見積結果 ; z_ユーティリティ ::g_テキスト02]
レコード/検索条件確定 [ダイアログあり : オン]
エラー処理 [ オン]
検索実行
If [ Get(最終エラー ) ]カスタムダイアログを表示 [“結果なし” ; “検索した条件の見積書はありません” ]
End If
エラー処理 [ オフ]
※「見積管理::見積状況」フィールドにグローバルフィールドである「g_テキスト01」に入力した値を挿入するといった流れ。
↓↓↓フィールド設定は、変数や計算式も使用できます。
例えば、「今日」が期限の見積書を検索することも可能です。
Get ( 日付 ) 関数の計算式で検索条件を設定します。
検索モードに切り替え [一時停止 : オフ]
レイアウト切り替え [「見積リスト」(見積管理) ]
フィールド設定 [見積管理::見積状況 ; “お客様検討中” ]
フィールド設定 [見積管理::見積結果 ; “注文なし”]
フィールド設定 [見積管理::期限日 ; “…” & Get (日付)]
フィールド設定 [見積管理::見積結果 ; z_ユーティリティ ::g_テキスト3]
レコード/検索条件確定 [ダイアログあり : オン]
エラー処理 [ オン] 検索実行
If [ Get(最終エラー ) ]
カスタムダイアログを表示 [“結果なし” ; “検索した条件の見積書はありません” ]
End If
エラー処理 [ オフ]
※「見積管理::期限日」フィールドに「“…” & Get (日付)」今日の日付までのもの(…2021/03/19)を検索する式の結果を入力します。
ウインドウでデータを選択
ウインドウを表示させ、その中から選択することで外部キーが入力されるようなスクリプトを考えます。
中間テーブルがソーステーブルである「見積詳細」レイアウトの人アイコンにポップオーバーボタンが設定してあります。
ポップオーバー上で「見積管理 _ 顧客|選択」TO の関連レコードを表示するポータルが作成してあります。「←」 ボタンにスクリプトを割り当ててあります。
この時のスクリプトの動きを考えてみます。
(1)ボタンをクリックする
(2)ポップオーバーが表示される
(3)ポータルで選択する顧客の「←」ボタンをクリックすると「見積情報」テーブルの「顧客外部キー」フィールドに選択した「顧客情報」レコードの「主キー」フィールドのデータが入力される
(4)ポップオーバーを閉じる
フィールド設定 [見積管理 :: 顧客外部キー ; 見積管理_顧客|選択 :: 主キー ]
ポップオーバーを閉じる
レコード/検索条件確定 [ダイアログあり : オン]
引数と変数を使ってターゲットフィールドを指定する
[フィールド設定]スクリプトステップは、ターゲットフィールドを設定する必要があるので引数や変数を使えません。
次のスクリプトステップでは使えます。
[フィールドを名前で設定]スクリプトステップ
ターゲットフィールドの設定を計算式、引数や変数などで指定できます
(フィールド名は完全修飾名で指定しなければいけません)。
引数や変数を使うとスクリプトの汎用性が上がります!
↓↓↓スクリプトを修正
変数を設定[$設定するフィールド ; 値:(GetValue ( Get(スクリプ ト引数) ; 1 )]
変数を設定[$設定する値 ; 値:(GetValue ( Get(スクリプト引数) ; 2 )]
※(GetValue ( Get(スクリプト引数) ; 2 )スクリプト引数の2行目の値を取ってくる
フィールドを名前で設定 [$設定するフィールド ; $設定する値]
※オプション設定
ターゲットフィールドの指定:$設定するフィールド
計算結果(挿入する値):$設定する値
ポップオーバーを閉じる
レコード/検索条件確定 [ダイアログあり : オン]
↓↓↓引数の設定
ボタンに引数を設定します。
1、「ボタン設定」[オプションのスクリプト引数:]をクリック
2、計算式を記入
GetFieldName ( 見積管理::顧客外部キー ) & ¶ &
見積管理 _ 顧客|選択 :: 主キー
『GetFieldName ( フィールド )』
フィールド名が変更した場合でも、影響がない。
ウインドウ
ウインドウは常に 1 つしか表示してはいけないわけではありません。複数のウインドウを表示することが可能です。
検索など。。。
全レコード表示されているウインドウと検索して内容確認するウインドウを作れば
検索が終わったらウインドウを閉じれば、元の全レコード表示されているレイアウトへすぐ戻れます。
その管理のために、次のスクリプトステップが用意されています。
[新規ウインドウ] コンテキストが別でもOK
[ウインドウを選択]
[ウインドウを閉じる]
[ウインドウを調整]
[ウインドウの移動/サイズ変更]
[ウインドウタイトルの設定]
「見積管理」レイアウト上の「見積管理_詳細」ポータル上に商品ボタンがあります。
それをクリックすると、別のTOGである「商品選択」レイアウトが表示され、商品を選択することで「見積管理_詳細」ポータルの「商品外部キー」値を入力するということを考えます。
↓↓↓
1、「見積管理_詳細」ポータル上の商品ボタンをクリックするとウィンドウが表示されるようにスクリプトを設定する。
1、スクリプトを作成 「商品を選択_演習用(ウインドウを開く)」スクリプト
2、新規ウインドウ スクリプトステップを選択
オプションは、
・[ウインドウスタイル:] 「カード」
• [ウインドウ名:] 「商品選択」
・[レイアウト:] 「商品選択」レイアウト
・[サイズ:] 高さ「Get(ウインドウ内容高さ)」のみ設定
・[位置:] 上端「0」 左端「Get(ウインドウ内容幅)-500」
・[ウインドウオプション] 「親ウインドウを淡色表示」「オン」
3、スクリプトを保存
新規ウインドウ [ スタイル: カード; 名前: “商品選択”; 使用するレイ アウト: 「商品選択」 (商品管理); 高さ: Get(ウインドウ内容高さ) ; 上: 0 ; 左: Get(ウインドウ内容幅)-500 ]
4、ボタン設定
「見積管理_詳細」ポータル上に商品ボタンの[開始:現在のファイル]に
「商品を選択_演習用(ウインドウを開く)」スクリプトを設定する
2、商品名を選択したら、「見積管理_詳細」ポータルの「商品外部キー」に値が入るようにスクリプトを設定する。
1、スクリプトを作成 「商品を選択_演習用(選択)」スクリプト
2、スクリプトの記述
変数を設定[$設定するフィールド ; 値:(GetValue ( Get(スクリプ ト引数) ; 1 )]
変数を設定[$設定する値 ; 値:(GetValue ( Get(スクリプト引数) ; 2 )]
※(GetValue ( Get(スクリプト引数) ; 2 )スクリプト引数の2行目の値を取ってくる
ウインドウを閉じる[現在のウインドウ]
ウインドウを選択[現在のウインドウ]
フィールドを名前で設定 [$設定するフィールド ; $設定する値]
レコード/検索条件確定 [ダイアログあり : オン]
3、ボタン設定 スクリプト引数を記述
GetFieldName ( 見積管理_明細::商品外部キー ) & ¶ &
商品管理 :: 主キー
ピッカーウインドウ
外部キーの入力のために新規ウインドウで選択させウインドウを閉じて元に戻ること
スクリプトトリガを設定する
スクリプトトリガ >>> 何かしらの操作(動作)に紐づけて起動する
上記のスクリプトを設定したなかで問題が1点ありました。
販売終了の商品も商品選択の中に含まれていることです!
↓↓↓
商品選択のレイアウトに切り替わった瞬間に、自動的に販売中の商品に絞り込まれて欲しい
1、「商品選択」レイアウトでレイアウトモードに切り替えます。
2、[レイアウト設定]ダイアログを開きます。
3、「スクリプトトリガ」タブを選択します。
4、「OnLayoutEnter」を オン にして[選択…]をクリック
※このレイアウトが切り替わった直後に実行
「商品を販売中のみに絞り込み」スクリプトを指定します。
5、レイアウトを保存します。
●既に開いていないかどうか
新しいウインドウ名を開く場合に、同じ名前のウインドウが開かれていないか確認することが重要な場合があります。
・ 開きたい名前のウインドウを選択する
・ エラー処理をする
2 つで条件分岐をします。ウインドウの選択の前にエラー処理をして、
・ 既に同じ名前のウインドウが開いている場合は新しく開かない
・ 同じ名前のウインドウが開いていない場合は新しく開く
この条件には、エラー処理で取得できるエラー番号「112(ウインドウが見つかりません)」を使用します。
エラー処理 [ オン]
ウインドウを選択 [名前 : 商品選択 ; 現在のファイル]
If [ Get(最終エラー) = 112 ]
新規ウインドウ [ スタイル: ダイアログ; 名前: “商品選択”; 使用するレイアウト:
「商品選択」 (商品管理); 横幅: 500; 上: 5; 左: Get(ウインドウ内容幅)/2]
End If
エラー処理 [ オフ]
[Loop] で反復
スクリプト内で「ループ処理」をすることも可能です。
ループとは『ある条件』で終了するまで処理を反復することです。
[Loop]スクリプトステップを使用します。
『Loop
End Loop』セットで使うスクリプトステップです。
ループの終了条件は、
『Exit Loop IF []』で、指定します。
これらを組み合わせて
『Loop
繰り返す内容
Exit Loop IF [終了する条件]
End Loop』
期限日を過ぎたものを書き換える
『「見積情報」テーブルのレコードで『期限日を 30 日以上過ぎたものを「注文なし」にする』ために、
・「見積状況」フィールドに「結果確定済」
・「見積結果」フィールドに「注文なし」
条件に合致するレコードに上記を連続入力します。
検索モードに切り替え [一時停止 : オフ]
レイアウト切り替え [「見積リスト」(見積管理) ]
フィールド設定 [ 見積管理::期限日; “…” & Get ( 日付 ) -30 ]
新規レコード / 検索条件
フィールド設定 [ 見積管理::見積状況; “結果確定済” ]
レコードを対象外に
レコード / 検索条件確定
エラー処理 [ オン]
検索実行
If [ Get(最終エラー ) ]
カスタムダイアログを表示 [ “対象なし”; “対象のデータはありません。作業を終了します “] Else
ここにLoop処理を記述していきます
End If エラー処理 [ オフ]
検索結果がエラーでなかった場合(「結果確定済」の対象外レコードがあった場合)
の処理を記述
ウインドウの固定
※繰り返し画面が変わらないように固定します。
レコード/検索条件/ページへ移動 [ 最初の ]
※初期化 最初の状態へ
Loop
フィールド設定 [ 見積管理::見積状況 ; “結果確定済” ]
フィールド設定 [ 見積管理::見積結果 ; “注文なし” ]
レコード/検索条件/ページへ移動 [ 次の ;最後まできたら終了:オン]
※オプションに「次の」を指定して、最後まで来たら終了を「オン」にします。
最後まできたらエラーが出てLoopが終了します
End Loop
レコード / 検索条件確定
カスタムダイアログを表示 [ “作業終了” ; “作業がおわりました” ]
↑↑↑[ 次の ;最後まできたら終了:オン]

これだとスクリプトデバッカで操作のエラー確認をしている時
(「エラー時に一時停止」にチェック時)
ここで毎回止まってしまうね〜😖
ちょっと厄介🤔
↓↓↓[ 次の ;最後まできたら終了:オフ] エラーなしで実装したい
『指定した発行日の見積』を 1 件ごとに個別の PDF ファイルとして保存する機能を考えます。
以下は「見積一括保存 _ 演習用」スクリプト完成形です
ウインドウの固定
Loop
Exit Loop If [ not IsEmpty ( $指定発行日 ) ]
カスタムダイアログを表示 [ “日付を指定してください” ; $指定発行日 ]
If [ Get(最終メッセージ選択)=2 ] 現在のスクリプト終了 [ ]
End If
End Loop
検索モードに切り替え [一時停止:オフ ]
レイアウト切り替え [「見積リスト」(見積管理) ]
フィールド設定 [ 見積管理::発行日 ; GetAsDate ( $指定発行日 ) ]
レコード / 検索条件確定
エラー処理 [ オン ]
検索実行 [ ]
If [ Get(最終エラー ) ]
カスタムダイアログを表示 [ “対象なし” ; “対象のデータはありません。作業を終了します” ]
Else
レイアウト切り替え [「見積発注書|印刷用」(見積管理) ]
レコード/検索条件/ページへ移動 [ 最初の ]
変数を設定 [ $カウント ; 値:1 ]
Loop
変数を設定 [ $PDF保存場所; 値:(計算式省略)]
レコードをPDFとして保存[ 記憶する ; ダイアログあり : オン ; 現在のレコード ; フォルダ作成 : オフ]
レコード/検索条件/ページへ移動 [ 次の ; 最後まできたら終了:オフ ]
変数を設定 [ $カウント ; 値:$カウント + 1 ]
End Loop
カスタムダイアログを表示 [ “作業終了” ; “作業がおわりました” ]
End If
エラー処理 [ オフ ]
レイアウト切り替え [ 元のレイアウト ]
解説します。
↓↓↓ループが 2 箇所で使われています。最初のループは、
Loop
Exit Loop If [ not IsEmpty ( $指定発行日 ) ]
カスタムダイアログを表示 [ “日付を指定してください” ; $指定発行日 ]
If [ Get(最終メッセージ選択)=2 ]
現在のスクリプト終了 [ ]
End If
End Loop
・最初の[Exit Loop If]スクリプトステップでは、次の条件でループを終了します。
[ not IsEmpty ( $指定発行日 ) ]
IsEmpty はフィールドが空の場合「真」を返す。今回はnotが付くので ( $指定発行日 )が空で無い時、ループを終える。
これだけでは入力が無い場合無限にループしてしまう。
↓↓
・次の条件で、入力が空の場合でもループを終了し、スクリプトも終了する方法を記述している。
If [ Get(最終メッセージ選択)=2 ]
現在のスクリプト終了 [ ]
End If
カスタムダイアログで2行目「キャンセル」がクリックされた 場合スクリプトを終了する。
↓↓↓2番目のループ
Else
レイアウト切り替え [「見積発注書|印刷用」(見積管理) ]
レコード/検索条件/ページへ移動 [ 最初の ]
変数を設定 [ $カウント ; 値:1 ]
Loop
Exit Loop If [ $カウント > Get( 対象レコード数 ) ]
変数を設定 [ $PDF保存場所; 値:(計算式省略)]
レコードをPDFとして保存[ 記憶する ; ダイアログあり : オン ; 現在のレコード ; フォルダ作成 : オフ]
レコード/検索条件/ページへ移動 [ 次の ; 最後まできたら終了:オフ ]
変数を設定 [ $カウント ; 値:$カウント + 1 ]
End Loop
・変数を設定 [ $カウント ; 値:1 ]
$カウントというローカル変数を設定しておきます。
・Loopの最後に変数を設定 [ $カウント ; 値:$カウント + 1 ]で
一回繰り返すごとに $カウント + 1 をしていきます。
・ループを抜ける処理がExit Loop If [ $カウント > Get( 対象レコード数 ) ]
なので$カウント > Get( 対象レコード数 )カウント数が検索で絞り込まれた対象レコード数より大きくなったらループを抜けます。

あれ!スクリプトデバッガで確認したらExit Loop If [ $カウント > Get( 対象レコード数 ) ]でLoopから抜ける時にエラーが出てるよ!!!!
😳😳😳‼️ もう少しスクリプトの修正が必要なようです。
↓↓↓
スクリプトステップの位置を変え、記述も修正します!
Else
レイアウト切り替え [「見積発注書|印刷用」(見積管理) ]
レコード/検索条件/ページへ移動 [ 最初の ]
変数を設定 [ $カウント ; 値:1 ]
Loop
変数を設定 [ $PDF保存場所; 値:(計算式省略)]
レコードをPDFとして保存[ 記憶する ; ダイアログあり : オン ; 現在のレコード ; フォルダ作成 : オフ]
Exit Loop If [ $カウント >= Get( 対象レコード数 ) ]
レコード/検索条件/ページへ移動 [ 次の ; 最後まできたら終了:オフ ]
変数を設定 [ $カウント ; 値:$カウント + 1 ]
End Loop
PDF保存の処理をした後にLoopを抜ける処理を移動します。
青のスクリプトステップで、次のレコードが存在しないためにエラーになっていました。
その前にLoopを抜ければエラーが起こらなくなります😉✨
データファイルの取り扱い
FileMaker のファイル(fmp12 形式)以外のファイル(外部データファイル)をスクリプトス テップで取り扱うことができます。
データファイル用スクリプトステップ
データファイルを取り扱うための一連のスクリプトステップが用意されています。
[データファイルを作成]
データファイルを作成する
[データファイルを開く]
既存のデータファイルを開く
[データファイルから読み取る] (開いているデータファイルからデータを読み取る)
指定された位置からデータを読み取る(指定なし=先頭から)
[データファイルに書き込む] (開いているデータファイルにデータを書き込む)
指定された位置からデータを書き込む(指定なし=先頭から)
[データファイルの位置を取得] (開いているデータファイルの読み取り/書き込み位置を取得)
読み取りや書き込みの位置を取得(テキストファイルのカーソル位置)
[データファイルの位置を設定] (開いているデータファイルの読み取り/書き込み位置を設定)
読み取りや書き込みの位置を指定(テキストファイルのカーソル位置)
[データファイルを閉じる]
データファイルを閉じる
●[データファイルを開く]のエラーコード
・同時に開くことができるデータファイルの数は最大 25です。
制限を超えた場合のエラーコード ⇨ 2(メモリエラー)
・すでに開いているデータファイルを開こうとした場合のエラーコード
⇨300(ファイルがロック されているか、使用中です)
『Get (オープンデータファイル情報)』
開いているデータファイルのファイル ID とパスを返します。
データファイルに関する情報はファイルごとに改行区切になります。次の内容です。
<ファイルID><タブ><パス><改行>
例: 15 file: /Machintosh HD/Users/ユーザー名/Documents/change.log
●その他
次のスクリプトステップは、FileMaker ファイルや他のファイルなどにも使えます。
[ファイルの存在を取得]
ファイルの存在を確認する
[ファイルを削除]
ファイルを削除する
[ファイルの名前変更]
ファイル名を変更する
データファイルの操作には、次のことが必要です。
・ファイルが存在していること
・ファイルが開いていること
●使い所&注意事項
・ログファイルを自動生成する
※バージョン18以降で有効
・外部システムに渡すJSON形式テキストファイルを作成
※適切な文字エンコード形式指定が必要
・FileMakerServer上でファイル挿入を有効化
内容としては少し高度なテックニックになるので、今後必要時に応じて詳しく調べて見ると良さそうです😌
以上で11章は終わりです。11章長かったですね〜🤣
次回は12章「集計とグラフ」について学習していきます😎
コメント