FileMakerのトランザクション: 正しくスタートする

今回は先回に引き続き、Geist Interactiveのトランザクションについてのシリーズ記事の第2回を紹介します。


FILEMAKER TRANSACTIONS: START ON THE RIGHT FOOT

(元記事はこちら)

2019/4/30
Jeremy Brown

FileMakerのトランザクションを使うと、レコードを確実に作成・編集・削除するために必要な完全なツールを手に入れることができます。前回はその背後にある考え方を示しました。今回は、FileMakerのトランザクションをどう開始するかについてです。我々が提供するKarbonフレームワークは、トランザクションを開始するときに見えないところでいろいろな処理をおこないますが、あなたのプロセスは非常にシンプルになります。Karbonをチェックするか、modulesfilemaker.orgのtransactionsモジュールを調べてみてください。どちらもトランザクションプロセスの全体を理解するための優れたサンプルです。

開始時のコンテキスト

トランザクションが始まる前に、適切な手順で処理を開始することが重要です。まず、トランザクションは必ず開始する場所を指定する必要があります。

KarbonとTransactionsモジュールでは、開始する場所としてDBTransactionsテーブルを使用します。

そこにはログを保存するためのフィールドがあり、トランザクションのデータ・開始時刻と終了時刻・成功または失敗に関する情報を記録します。また、レコードが作成・編集・削除されるテーブルとのリレーションに使用されるフィールドが含まれています。
DBTransactionsテーブルを使用すると、それがカスタムApp全体のすべてのトランザクションの開始コンテキストになります。すべてのトランザクションを同じ一つの場所から始めるようにするといろいろ便利になります。

しかし、理にかなってさえいればどのコンテキストでも開始コンテキストになりえます。例として、Estimate(見積)とEstimate Line Item(見積明細)をOrder(注文)とOrder Line Item(注文明細)テーブルにコピーする場合、Estimateコンテキストを開始点として使用できます。Estimate #4392をOrderレコードにコピーする場合、開始点はEstimate #4392です。

スキーマ

開始コンテキストには、データが追加/編集されるテーブルとのリレーションに使用するフィールドが含まれています。すべてのリレーションで [このリレーションを使用して、このテーブルでのレコードの作成を許可] をオンにします。

DBTransactionsの開始コンテキスト

Estimateの開始コンテキスト

開始コンテキストのテーブルには、「TR_OrderId」と「TR_OrderItemId」の2つのフィールドがあります。これらのフィールドは、それぞれのテーブルの主キーフィールドとリレーションが設定されています。主キーフィールドを使用するのは、リレーションシップが作成するレコードごとに一意である必要があるためです。

データをまとめる

追加/編集されるデータをまとめることは常に良いことです。今回の例(EstimateをOrderにコピーする)では、Estimateレコードの情報とEstimate Line Itemデータの両方のすべてをJSONオブジェクトとしてまとめ、それをどこかに一時的に格納できます。これにより、保存したデータが正しく同期されていることを保証できます。これは一つの完全なオブジェクトであり、一つの完全なレコードです。いったん保管されると、この1つのEstimateレコード内の個々のフィールドに変更を加えることはできません。

今回の例では、開始コンテキストが実際にEstimateレコードであれば、データはすでに現在のレコードにあるので、わざわざそれをまとめる必要はありません。

所有権を検証して取得する

加えて、データを検証したほうがいいでしょう。実際に処理するデータが存在し、エラーがないことを確認します。

また、対象のレコードの所有権を取得します。Orderテーブルにデータをコピーしている間、誰にもEstimateレコードとEstimate Line Itemレコードを編集されたくないので、処理の間このプロセスがレコードを所有(ロック)します。レコードを編集している場合、開始プロセスでそれらをすべてロックできます。そこでEstimateレコードおよび個別のEstimate Line Itemレコードを開きます。

「トランザクションを開始」スクリプトを呼び出す

かなり昔のトランザクションに関する記事の中で、Toddは「トランザクションを開始」というスクリプトステップはないと言っています。しかし、すべての開始タスクをサブスクリプトにまとめて、開始時にこれを呼び出すことができます。Karbonフレームワークには “Start Transaction”というスクリプトが含まれています。このKarbonとtransactionsモジュールは、開始スクリプトの優れたサンプルです。

追加のタスク

DBTransactions(または同等のもの)を使用している場合、すべてのトランザクションプロセス(プロセス全体: OrderおよびOrder Line Itemテーブルにすべてのレコードを作成する)に対応した一つの新しいレコードを作成すると便利です。プロセスの結果は2値で記録できます: トランザクションが成功したか、あるいはロールバックされたか、のいずれかです。

FileMakerのトランザクションを開始するプロセスは単純です。詳細がどうであれ、このステップでトランザクションが成功した場合の状態を準備します。トランザクションが発生する前に、プロセスがすべての必要な部品を揃えます。

次回は、トランザクション処理の本体について説明します。

Leave a Reply