15. FR Toolbox リファレンス
FileMaker データベースとの通信に使用できる FRToolbox 関数のスイートを次に示します。
最初のセクションでは、Reactor での BlackBox の管理について紹介します。
Reactor タグ
<?reactor reactor?>
これらの Reactor タグ間のすべてが Reactor によって解釈されます。これは次のようになります。:
FileMaker calculation
Reactor タグ内で任意の FileMaker 計算を実行できます
next_week_date_var = '<?reactor Get ( CurrentDate ) + 7 reactor?>';
出力例: next_week_date_var = '22/06/2019';
Get parameter value パラメータ値を取得
任意の BlackBox パラメータの値にローカル変数としてアクセスできます。:
text_field_var = '<?reactor $text_field reactor?>';
出力例:text_field_var = 'mytext';
Get value of field name parameter フィールド名パラメータの値を取得
field_name_var = '<?reactor bbdev_Field( $field_name ) reactor?>';
出力例:field_name_var = 'Description'
Get table occurrence name of field name parameter フィールド名パラメータのテーブルオカレンス名を取得
field_name_TO_var = '<?reactor bbdev_TO( $field_name ) Reactor?>';
出力例:field_name_TO_var = 'Task';
Get ‘where’ clause based on relationship from current context to table occurrence: 現在のコンテキストからテーブルオカレンスまでのリレーションシップに基づいて「where」句を取得します。:
(これは通常、データをクエリするときに使用されます)
where_clause_var = '<?reactor bbdev_Relationship( bbdev_TO($field_name) ) reactor?>';
出力例: Task.status = 'active' and Task.type = 'booked'
Get list of initial creation values based on relationship from current context to table occurrence 現在のコンテキストからテーブル オカレンスまでのリレーションシップに基づいて、初期作成値のリストを取得する
(通常、FRTB.create()
メソッドと組み合わせて、新しいレコードを作成するときに使用されます)
creation_values_var = '<?reactor bbdev_relationshipKeyBuilder ( bbdev_TO($field_name) ) reactor?>';
出力例:
Names="status,type" Values="active","booked"
Get container field images from container field parameter value オブジェクトフィールドパラメータ値からオブジェクトフィールド画像を取得
<?reactor bbdev_LoadImages( $container_field ; $field_name ; $com.reactorize.env.loadedfilepath ) reactor?>
出力例:
<img src="task_01.png" />
<img src="task_02.png" />
<img src="task_03.png" />
($field_name
の値によって、指定されたファイル名が決まります。)
FRToolbox リクエスト
次の JavaScript メソッドを使用して、FileMaker データベースで要求を実行し、応答を処理できます。
これらのリクエストは連鎖させることができ、多くの場合、そうしなければなりません。たとえば、次のすべてのメソッドは send();
を呼び出す必要があります。実際にリクエストを送信するメソッド。
Find records レコードを検索
FRTB.find(field1, field2, field3, etc)
見つかったレコードのセットを返します。返される値は、リクエストで指定されたフィールドによって異なります。
例:
QueryData = FRTB.find( "Task::name", "Task::description" );
タスク テーブルのオカレンスが基になっているテーブルのすべてのレコードからname
とdescription
フィールドの値を取得する要求を作成します。
bbdev_Field()およびbbdev_TO()関数を使用してフィールド名とテーブルの出現を変数に格納した場合は、それらを使用できます。:
QueryData = FRTB.find( TO_name_var + "::" + name_field_var, TO_name_var + "::" + description_field_var );
Constrain records レコードの制約
.where(whereclause)
SQL WHERE
句に基づいて検索条件を制限します。
例:
QueryData = FRTB.find( "Task::name", "Task::description" ).where(Task.status = 'active');
Task テーブルのオカレンスの基になっているテーブルから、Task::status
フィールドの値が active
であるすべてのレコードからname
とdescription
フィールドの値を取得するリクエストを作成します。
bbdev_Relationship()関数 を使用して「where 句」を作成した場合は、代わりに .filter()
メソッドを使用できます。これにより、SQL スタイルの構文ではなく FM スタイルの構文を使用できます (例えば、Task::name
Task.name
よりTask::name
)
.filter(where_clause_var);
Send Request リクエストを送信
これは実際に Reactor にリクエストを送信するために使用されます。最初にリクエストを作成してから送信できます:
QueryData = FRTB.find( "Task::name", "Task::description" ).where(Task.status = 'active'); QueryData.send();
または、リクエストを生成するときに送信します。:
QueryData = FRTB.find( "Task::name", "Task::description" ).where("Task.status = 'active'").send();
これにより、リクエストが Reactor に送信されます。ただし、戻ってくるものを見るには、コールバック関数を使用する必要があります。関数を定義して呼び出すことができます。:
function CheckResponse(response) { alert ( "Response received!") ; } QueryData = FRTB.find( "Task::name", "Task::description" ).where("Task.status = 'active'").send(CheckResponse);
または、リクエスト内で無名関数を定義できます。:
QueryData = FRTB.find( "Task::name", "Task::description" ).where("Task.status = 'active'").send(function(response) { alert ( "Response received!") ; });
send()
でコールバック関数を設定すると、リクエストの応答を含むパラメーターが含まれます。 find()
リクエストで使用する場合、このレスポンスには取得したデータが含まれます。
find()
リクエストのレスポンスはオブジェクトとして返されます。このオブジェクトには、data
というプロパティが含まれています。このデータ プロパティは、オブジェクトの配列です。配列の各要素のキーは、完全なフィールド名 (テーブルのオカレンス名を含む) です。
したがって、コールバック関数で、応答の各レコードの値にアクセスするには、それらをループします。:
for ( var i=0; i < response.data.length; i++) { taskname = response.data[i]["Task::name"]; taskdescription = response.data[i]["Task::description"]; alert (taskname + ": " + taskdescription ); }
Poll Request プルリクエスト
これは、find()
リクエストが送信された後の変更のポーリングに使用されます。
ポーリングは、固定名 zModID
を持つタイムスタンプ自動入力を利用します。:
このリクエストを呼び出すと、データがクエリされた後に変更をポーリングします。新しいレコード、変更されたレコード、または削除されたレコードをポーリングできます。
QueryData = FRTB.find( TO_name_var + "::" + name_field_var, TO_name_var + "::" + description_field_var ).filter(where_clause_var).poll(PollChanges).send(function(response) { alert ( "Response received!") ; });
これにより、データがポーリングされるたびに PollChanges()
関数が呼び出されます。デフォルトでは、5000 ミリ秒 (5 秒) ごとにポーリングしますが、必要に応じて独自の間隔を設定することもできます。:
.poll(PollChanges,2000)
これにより、ポーリングが 2 秒ごとに発生するように設定されます。
PollChanges() 関数が呼び出されると、ポーラーの結果を含むオブジェクトが返されます。オブジェクトには 3 つのプロパティが含まれており、それぞれが変更されたレコードを指すrowid
値の配列です。rowid
は、各レコードの内部 FileMaker ID です。
したがって、ポーリング関数は次のようになります。:
function PollTasks(results) { for( var i=0; i<results.remove.length; i++ ){ rowid = results.remove[i]; // Do something with the deleted records rowid } for( var i=0; i<results.update.length; i++ ){ rowid = results.update[i]; // Do something with the updated records rowid } for( var i=0; i<results.create.length; i++ ){ rowid = results.remove[i]; // Do something with the new records rowid } }
実際には、これらの rowid
を使用して実際に何か便利なことをしたいと思うでしょう。例えば:
削除されたレコード:BlackBox インターフェイスから削除します
新しいレコード:各レコードをクエリして、BlackBox インターフェイスに追加します
更新されたレコード:各レコードをクエリし、BlackBox インターフェイスで更新します
Create Records レコードの作成
これは、新しいレコードを追加するために使用されます。
create()
メソッドを使用すると、オブジェクトをパラメータとして設定できます。値を設定する各フィールドは、そのオブジェクトのプロパティになります。
オブジェクトを作成してから、それをパラメーターとして渡すことができます。:
NewTask = new Object(); NewTask["Task::name"] = "New task name"; NewTask["Task::description"] = "New task description"; FRTB.create(NewTask).send({'onSuccess': function(){ alert ("Record added"); }});
または、渡すときにオブジェクトを定義できます。:
FRTB.create( ["Task::name","New task name"], ["Task::description","New Task Description"] ).send({'onSuccess': function(){ alert ("Record added"); }});
または、 bbdev_Field()およびbbdev_TO()関数を使用してフィールド名とテーブルオカレンスを変数に格納した場合は、それらを使用できます。:
FRTB.create( [TO_name_var + "::" + name_field_var,"New task name"], [TO_name_var + "::" + description_field_var,"New Task Description"] ).send({'onSuccess': function(){ alert ("Record added"); }});
bbdev_relationshipKeyBuilder()関数 を使用した場合は、現在のコンテキストからのテーブルオカレンスとのリレーションに基づいて初期値を設定することもできます。
例えば、BlackBox がリレーションシップを介して見つかった一連のタスクを照会し、それらのタスク レコードにtype
フィールドがあり、リレーションシップに type
フィールドの値が「"booked"
」である必要があるという述語が含まれている場合、新しいレコードを作成するときの暗黙のフィールド値となります。
そうしないと、Type
を明示的に「"booked"
」に設定しない限り、次にTask
レコードをクエリしたときに、新しいレコードが対象レコードに含まれません。
これらの暗黙の値を設定するには、 bbdev_relationshipKeyBuilder()関数を使用して、初期作成値のリストを生成するために使用できる変数を作成し、.create()
リクエスト の .send()
メソッドを呼び出すときにこれを含めます。例:
creation_values_var = '<?reactor bbdev_relationshipKeyBuilder ( bbdev_TO($field_name) ) reactor?>'; FRTB.create( [TO_name_var + "::" + name_field_var,"New task name"], [TO_name_var + "::" + description_field_var,"New Task Description"] ).send({'creationValues' : creation_values_var, 'onSuccess': function(){ alert ("Record added"); }});
Update Records レコードの更新
これは、既存のレコードを更新するために使用されます。
update()
メソッドを使用すると、パラメーターを設定できます。これはオブジェクトです。値を設定する各フィールドは、そのオブジェクトのプロパティになります。
更新するレコードを定義するには、 update()
リクエストと組み合わせて .where()
または .filter()
メソッドを使用する必要があります。
オブジェクトを作成してから、それをパラメーターとして渡すことができます。:
ChangedTask = new Object(); ChangedTask["Task::description"] = "Updated task description"; FRTB.update(ChangedTask).filter("Task::name=New task name").send({'onSuccess': function(){ alert ("Record updated"); }});
または、渡すときにオブジェクトを定義できます。:
FRTB.update( ["Task::description","Updated Task Description"] ).filter("Task::name=New task name").send({'onSuccess': function(){ alert ("Record Updated"); }});
.where()
または .filter()
制約が複数のレコードを参照する場合、それらのすべてのレコードが更新されます。
Delete Records レコードの削除
これは、既存のレコードを削除するために使用されます。
remove()
メソッドを使用すると、パラメーターを設定できます。これは、レコードを削除するテーブルのテーブルオカレンスです。
削除するレコードを定義するには、remove()
リクエストと組み合わせて .where()
または .filter()
メソッドを使用する必要があります。
FRTB.remove("Task").where("Task.name='New task name'").send({'onSuccess': function(){ alert ("Record(s) deleted"); }});
bbdev_Relationship()を使用したことがある場合は、これを使用してテーブルのオカレンスを参照できます。 bbdev_Field()関数を使用したことがある場合は、これと .filter()
メソッドを使用してフィールドを参照できます。:
field_name_TO_var = '<?reactor bbdev_TO( $field_name ) Reactor?>'; field_name_var = '<?reactor bbdev_Field( $field_name ) reactor?>'; FRTB.remove(field_name_TO_var).filter(field_name_TO_var + "::" + field_name_var + "=New task name").send({'onSuccess': function(){ alert ("Record(s) deleted"); }});
Calculation Request 計算リクエスト
これは、FileMaker の計算を評価するために使用されます。
calc()
メソッドを使用すると、パラメーターを設定できます。これは、実行したい計算です。
FRTB.calc("Get(CurrentDate)").send(function(response) { alert (response.result); })
計算の結果がコールバック関数を介して返される場合、応答オブジェクトの result
プロパティを介してアクセスされます。
Perform Script Request スクリプト実行のリクエスト
これは、BlackBox から FileMaker Pro でスクリプトを実行するために使用されます。
script()
メソッドを使用すると、2 つのパラメーターを設定できます。1 つ目はスクリプトの名前で、2 つ目はスクリプト パラメーターです。スクリプトは Get(ScriptParameter)
でアクセスできます。この 2 番目のパラメーターはオプションです。
FRTB.script("MyScript","MyParameter").send(function(response) { alert("Script performed"); })
Request Configurations リクエスト構成
Reactor リクエストを送信するときは、send
メソッド呼び出しに次の構成を含めることができます。:
FRTB.find('dd_planets_data::name').send({ 'onsuccess' : CompletionFunction, 'onerror' : ErrorFunction, 'onrecordlock' : HandleRecordLock, 'creationvalues' : creation_values_var, 'distinct' : true, 'databasename' : 'reactor', 'layoutname' : 'reactor_layout' })
onsuccess
、onerror
、およびonrecordlock
の設定は、関数の名前または無名関数のいずれかでcreationvalues
の値は、 bbdev_relationshipKeyBuilder 関数を使用して生成された変数である必要がありますdistinct
設定は true/false のいずれかに設定され、クエリでdistinct
のキーワードを使用するかどうかを設定します。 SQL に慣れていないユーザーにとって、クエリの応答には重複レコードが含まれません。リクエストがデフォルト以外のデータベースを対象とする場合にのみ、
databasename
設定を設定する必要があります。通常はFRTB.script()
リクエストにのみ関連します。
Utility Methods ユーティリティ メソッド
次の JavaScript メソッドを使用して、あまり一般的でない要求を実行できます。:
Set Default Database デフォルト データベースの設定
以下を使用して、デフォルトのデータベースを他の Reactor リクエストで使用するように設定できます。:
FRTB.setDefault("DatabaseName","reactor");
上記は、すべての Reactor リクエストを明示的に「reactor」データベースに適用します。
FRToolbox Version FRToolbox バージョン
以下を使用して、使用されている FRToolbox のバージョンを返すことができます。:
frt_no_var = FRTB.getVersion();
上記は、FRToolbox のバージョン番号を変数に格納します。
Start Debugging デバッグを開始
詳細なデバッグを JavaScript コンソールに出力します。
FRTB.startDebugging();
このコード行を実行すると、Reactor の通信がコンソールに出力されます。
Date/Time Conversion 日付/時刻の変換
次のメソッドを使用して、JavaScript の日付/時刻を SQL の日付/時刻文字列に変換できます。
FRTB.getSQLDate(new Date());
FRTB.getSQLTime(new Date());
次のメソッドを使用して、SQL 日付/時刻文字列を Javascript 日付オブジェクトに変換できます。
FRTB.convertDateTime("2019-06-17 19:35:00");
Get Field and Table Occurrence フィールドとテーブルオカレンスを取得
次のメソッドを使用して、完全修飾フィールドのテーブルオカレンスを返すことができます:
FRTB.getTOName("bb_data_schedules::id",false);
If you would like to escape character spaces so you can use it in a SQL query, set the second parameter to
文字スペースをエスケープして SQL クエリで使用できるようにする場合は、2 番目のパラメーターをtrue
に設定します。:
FRTB.getTOName("bb_data_schedules::id",true);
次のメソッドを使用して、完全修飾フィールドのフィールド名を返すことができます。:
FRTB.getFieldName("bb_data_schedules::id",false);
文字スペースをエスケープして SQL クエリで使用できるようにする場合は、2 番目のパラメーターを true
に設定します。:
FRTB.getFieldName("bb_data_schedules::id",true);
Reactor Actions リアクター アクション
This bit is for the advanced BlackBoxers.
このビットは、上級 BlackBoxer 向けです。
アクションは、特定の対話に応答する方法をユーザーに提供する標準化された方法です。
例えば、BlackBox があり、開発者が FRTB.find()
の後に何が起こるかを制御できるようにしたいとします。が、JavaScript を詳しく調べる必要はありません。次のいずれかを指定できるようにしたい場合があります。:
スクリプトを実行する
フィールドを設定する
グローバル フィールドの設定
JavaScript 関数を実行する
これを行うには、FRTB.getAction
メソッドを使用してアクションを定義します。find
リクエストの結果を渡したい場合があります。例:
var MyAction = FRTB.getAction( 'SetField=MyLayoutTO::CurrentRecord|GetField=bb_planets_data::name', 'myAction' ); FRTB.find( 'bb_planets_data::name', 'bb_planets_data::description', MyAction ).send(function(response) { FRTB.performAction( 'myAction', response.data[0]); });
最初の行はアクションの構築です。 MyLayoutTO
テーブル オカレンスに CurrentRecord
というフィールドを設定するアクションを作成します。
そのフィールドに設定した値は、bb_planets_data
テーブル オカレンスのname
の値です。
それはまだ意味がありませんか? これは、設定しているこの値が find
の結果であるためです。まだ値を設定しておらず、設定する値を含むフィールドを定義しています。
次に、Reactor find
リクエストがあります。パラメーター として、通常どおり返されるフィールドを指定します。さらに、新しいアクションの変数名も含めます。
成功関数では、アクションを実行します。最初のパラメーターとして、アクションの名前を渡します。 2 番目のパラメーターは、find
の応答の最初のレコードです。
私たちのアクションは、フィールドを設定するときに、find
の応答から bb_planets_data::name
の値を設定していることを認識しています。そのため、Reactor は bb_planets_data::name
の値の最初の find
の応答をチェックし、その値が MyLayoutTO::CurrentRecord
に設定されます。
保存されたフィールドを設定したくない場合、グローバルフィールドを設定したり、FileMaker スクリプトを実行したり、この値 (bb_planets_data::name
) を使用して JavaScript 関数を実行したりしたいとします。アクションの作成時に設定したパラメーターを変更するだけです。
// FileMaker スクリプトを実行し、フィールド値をパラメータとして引き渡す var MyAction = FRTB.getAction( 'Script=MyScriptName|Parameter=bb_planets_data::name', 'myAction' );
// グローバルフィールドを設定し、フィールド値をグローバルフィールドの値として引き渡す var MyAction = FRTB.getAction( 'SetGlobal=$$MyGlobal|Parameter=bb_planets_data::name', 'myAction' );
// JavaScript 関数を実行し、フィールド値をパラメータとして引き渡す var MyAction = FRTB.getAction( 'Function=checkRecord();|Parameter=bb_planets_data::name', 'myAction' );
なぜわざわざこれを行うのでしょうか?上記の代替案からわかるように、実際のアクションを BlackBox パラメータとして提供するよう開発者に依頼するだけです。したがって、ボタンがクリックされてfind
検索を実行すると、開発者はパラメーターを設定して、たとえば次のいずれかを実行できます。:
どの惑星が選択されたかを識別するデータ/グローバル フィールドを設定します
どの惑星が選択されたかを知る FileMaker スクリプトを実行する
どの惑星が選択されたかを知る JavaScript 関数を実行する
明らかに、BlackBox コードを変更することでこれらのいずれかを個別に実行できますが、アクションを BlackBox パラメーターとして定義すると、BlackBox の外部から BlackBox の動作を変更する機能がユーザに与えられます。
もしくは、これは不必要に複雑であると考えて、永遠に忘れることもできます :)