Geist InteractiveのJeremy Brownさんのトランザクションに関するブログ記事の連載が更新されていましたので、紹介します。今までの記事も合わせてご参照ください。
- FileMakerのトランザクション: 自信を持ってデータを更新する
- FileMakerのトランザクション: 正しくスタートする
- ポータルを使用したFileMakerのトランザクション処理
- FileMakerのトランザクション: マジックによるプロセス
- FileMakerのトランザクション: ゲームの終盤
- FileMakerのトランザクション:レコードを編集する(今回)
FILEMAKER TRANSACTIONS: EDITING RECORDS
(元記事はこちら)
Jeremy Brown
2019/6/28
レコードの処理をトランザクションで行う場合、そのゴールは、レコードへのすべての変更(追加・変更・削除)を一度に行うか、まったく行わないか、の必ずいずれかにすることです。これについては以前に話しました。トランザクション手法では、ある意味を持った固まりの複数のレコード(請求書のその明細など)において、一部が変更されて他のレコードが以前の状態のままになるのを防ぎます。今までトランザクション手法でレコードを作成する方法を見てきました(こことここ)。今回は、FileMakerのトランザクションとレコードの編集に目を向けてみましょう。
考え方を振り返る
トランザクション処理について、いくつか重要な点があります。これらの考え方を念頭に置いておけば、FileMakerのトランザクション編集に適したワークフローを設計し、データの信頼性を維持することができます。
プロセスは、変更しようとするレコードの所有権を取得する必要があります。つまり、各レコードは開かれ、レコードを開くときにエラーは発生しません。
プロセスがレコードを変更する間、FileMakerはそれらのレコードをトランザクションを実行しているデバイスのメモリに開いた状態にします。Georgeが15件のレコードを編集するスクリプトを実行している場合、それらのレコードの変更は彼のコンピュータ上のみで行われます。
プロセスの間、すべてのコミットの試みは制御されなければなりません。このプロセスは、他のレイアウトに移動したり、ユーザにフィールドの外側をクリックさせたりすることはできません。すべてのレコードが変更されるまでコミットを発生させることはできません。
すべてのレコードが変更された後、プロセスはレコードのコミットを試みます。
- すべてのレコードのコミットが成功した場合、すべての変更がファイルに保存されます。
- コミットがいずれかのレコードに対してエラーを投げた場合、すべての変更は元に戻されます。つまり、変更はファイルに保存されずに破棄されます。
検討のためのユースケース
これらの考え方を具体的に詳しく見ていくためには、ユースケースが必要になります。そこで「ユーザがすべての個々のline item(明細行)に割引を適用したい」という場合を想定してみました。この場合、すべてのline itemに同じ割引率がかけられます。これを、すべて一度に行うかまったく行わないことが重要です。そしてこれは割引を各行に手動で適用するよりも速いです。
開始コンテキスト
準備の最初のステップは、開始コンテキストを見つけることです。私は別の記事で開始コンテキストについて多くのことを語りましたが、同じ情報がここにもあてはまります。KarbonとDBTransactionsはTransaction Logテーブルを開始点として使用しますが、これが私が好んで採用する方法です。各トランザクションとそれが何をしようとしているかをログに記録するためです。それでは、Transaction Logレイアウトを見てみましょう。
ポータルを持たない開始コンテキスト
レコードを編集する
これでレコードをトランザクションで編集する準備が整いました。上記の考え方を念頭に置いて、スクリプトは次のように進みます。
一度に1レコードずつ
図で表すと以下のようになります。このワークフロー図をよく見て、理解できているかどうか確認してください。下で何点か補足します。
ポータルなしで編集する
FileMakerのトランザクション編集プロセスをポータルなしで機能するように設定した場合(そしてそれは可能です)、次の手順に従う必要があります。
- 編集したいレコードの主キーを集める
- 開始コンテキストに移動する。新規レコードを作成する
- 集めたいログ情報を追加する。私なら以下を行います。
- トランザクションの種類を記述する: “編集”
- 作業する対象テーブルを特定する: “OrderLineItems”
- 主キーのリストをフィールドに配置する
- 開始時間を入力する
- ループ内で、このトランザクションと1つのOrderItemレコードの間のリレーションを作成するOrderItemIDフィールドの値を設定する
- レコードを開く。エラーをチェックする
- フィールドを更新する。エラーをチェックする
ポータルで編集する
FileMakerのトランザクション編集プロセスをポータルで行うように設定した場合、次の手順に従う必要があります。
- 親レコードの主キー(今回の例ではOrderレコードの主キー)を収集する
- 開始コンテキストに移動する。新規レコードを作成する
- 集めたいログ情報を追加する。私なら以下を行います。
- トランザクションの種類を記述する: “編集”
- 作業する対象テーブルを特定する: “OrderLineItems”
- 主キーのリストをフィールドに配置する
- 開始時間を入力する
- 収集した値をOrder主キーフィールドに設定する。これによりOrder Itemテーブルへのリレーションが作成され、このOrderのorder Itemテーブルが表示される
- ループ内で、レコードを作成する。これによってレコードが開き、新しい値が設定される。
- エラーをチェックする
エラーをチェックする
上記の手順の各ステップの後で、エラーをチェックすることが重要です。line itemレコードを開こうとするたび、および各レコードを編集するたびに、エラーをチェックしています。そのうちの1つでもエラーがある場合は、それがたとえ最後のエラーであっても、プロセスを中止しなくてはいけません。
いずれかのステップの後でエラーが発生したときにプロセスを中止してキャンセルするのは、極端なように見えるかも知れません。最後の編集対象レコードにエラーがある場合は、キャンセルするのが特に残酷に感じるかも知れません。しかし、トランザクションに関する重要な点を覚えておいてください。すべてのレコードを変更するか、または一つも変更しないかのいずれかです。最後のレコードにエラーがあると、そのレコードを編集できないため、他のレコードのいずれも編集することはできません。
コミットまたは元に戻す
問題またはエラーなしにすべてのレコードを編集した場合、すべてのレコードはコミットされます。今回の例の場合、すべてのorder line itemには割引が適用され、ファイル内で更新されます。
エラーがあり、編集プロセスを中止しなければいけない場合は、レコードを元に戻します。
これについては以前に話しました。プロセスは同じです。
FileMakerトランザクションの編集プロセス
トランザクションのプロセス、その中心となる考え方は、レコードを変更するすべての方法に当てはまります。FileMakerのレコードをトランザクションで編集することは、レコードを変更する1つの方法であり、すべてのレコードを変更するかあるいは一つも変更されないことが重要である場合、採用を考慮すべきです。