FileMakerでシステム開発

SE経験者がファイルメーカーを用いた場合、どのような設計、開発を行うのかを検証するブログです。

FileMaker事前検証(7回目) レコードのロック

2020-03-20 15:41:32 | FileMakerの事前検証(レコードロックと自動採番)
検証要件としての以下についてご紹介します。
2.2.レコードの明示的なロックと解放(読み取り一貫性)
2.4.番号管理(伝票番号等の自動採番)

今回は、顧客マスタ保守を例とします。
以前の記事「FileMaker事前検証(6回目) 命名規則」で記載しました、以下を前提としています。

----------- 以前の記事から引用 -----------
注)固定マスタデータ、伝票データ
FileMakerで業務システムを開発する場合、マスタ保守および伝票入力のプログラムを作成する際は、直接上記のテーブルに対して更新は行いません。(行わない方が良いです。)

FileMakerでは入力画面に更新するテーブルがインプリメントされているため、入力して他の項目にカーソルが移動した瞬間に入力途中であってもそのテーブルのレコードが更新されます。
登録ボタンを押下するまでは更新されないということはありません。
新規にレコードを追加する場合は、キャンセルを指定された時にそのレコードを削除すれば良いですが、修正モードとして該当レコードを呼び出し、値を上書き修正する場合、入力途中でキャンセルし、元の状態に戻すには、仕組みを考える必要があります。

☞ 一番安全な方法
・固定マスタデータ・伝票データのテーブルと、同じ内容のテーブルをワークテーブルとして作成する。
・入力画面に割り当てるテーブルは、ワークテーブルを設定する。
・入力画面で登録ボタンが押下されると、ワークテーブルから基のテーブルにレコードを追加する。
・入力画面で更新ボタンが押下されると、ワークテーブルから基のテーブルにレコードを更新する。
----------- 以前の記事から引用 (終わり)-----------


1.一般的なRDBMSでのレコードのロック
レコードを読む時に、対象レコードをロックすることができます。
その時、既に他のユーザーが対象となるレコードをロックしている時、Wait(待つ)するか又はエラーとして制御を戻すかの選択ができ、それらをプログラムにコーディングすることができます。

顧客マスタ保守プログラムで、レコードをロックするタイミング

(1)新規登録の場合

 ☞ 画面で顧客の情報を入力し、登録ボタンを押下した時
 ・キーとなる顧客コードのMAX値を保持しているテーブルのレコードをロックし、値を読む。
 ・画面に入力した顧客情報を顧客マスタに追加するレコードへ編集する。(insert)
  この時、取得した値に + 1した値を、顧客コードとして編集する。
 ・キーとなる顧客コードのMAX値を保持しているテーブルのレコードに対して、
  取得した値 + 1 を編集し、更新する。(update)
 ・COMMIT; する。 (ロック解放)

顧客コードを自動採番しており、且つ登録時に +1 してカウントアップし追加しているため、顧客コードに空き番ができません。

(2)修正登録の場合

 ☞ 該当の顧客を呼び出し、画面へ編集~内容の訂正後、登録ボタンを押下した時
 ・顧客マスタに対して、画面に呼び出した(顧客の)顧客コードのレコードをロックする。
 ・画面に入力した顧客情報を顧客マスタに更新するレコードへ編集する。(update)
 ・COMMIT; する。 (ロック解放)

登録時(更新時)に、顧客マスタ自身のレコードをロックし、訂正した内容を上書き更新しています。
厳密には、最初に検索等で入力画面へ該当の顧客情報を編集した時の内容と、登録時(更新時)にロックした時に読み取った顧客情報の内容に違いがあるかないかのチェックを行います。
・違いが無ければ、そのまま上書き更新します。
・違いがある場合、警告を出して操作員の応答を待ちます。(そのまま更新 or キャンセル)
※ここでの違いとは、他のユーザーが同じ顧客コードのレコードを同じタイミングで修正し、先に更新した場合を想定しています。
※一般的にロックしたら即、解放が原則です。


2.FileMakerでのレコードのロック
前述しましたRDBMSの機能は、FileMakerにはありません。
只、FileMakerはテーブルを作成し、レイアウトで自由にフォーム形式、リスト形式に切り替え、検索および入力ができる製品であるため元々の利用目的が異なると思います。
それらを踏まえた上で、業務システムを開発した場合の検証を本ブログの目的としています。

それでは、FileMakerでのレコードのロックについて代替案を検証します。

☞ 入力画面に割り当てるテーブルは、ワークテーブルを設定する。
これは、新規に顧客を登録する際は、キーとなる顧客コードを顧客マスタのMAX値を取得し、カウントアップした値を、顧客マスタwkにセットし、新規レコードを追加します。
既存の顧客情報を修正する場合は、検索画面より指定した顧客を、顧客マスタより、顧客マスタwkへ追加します。(この時、重複エラーがある場合は、警告表示し修正不可とします。)

これらより、修正モードの時は、顧客マスタwkに追加が成功した時点で、他のユーザーが同じ顧客コードの情報を修正しようとしても警告が表示され、使用できません。
新規モードの時は、顧客コードのMAX値を取得し、カウントアップした値を顧客マスタwkにセットし新規レコードとして追加が成功した時点で、顧客コードの自動採番が正常に完了したことになります。

今回は、修正モードについては検証すべき課題はありませんので、新規モードの際の自動採番の仕組みにフォーカスをあてて検証をしてみます。


2.1.顧客コードを自動採番する。

 以下の手続きを行います。

 ①顧客マスタのMAX(顧客コード)を取得し、+1した値を変数にセットします。
  ・別のレイアウト(顧客マスタ同士をデカルト積でリレーション)より取得します。

 ②変数にセットした顧客コードが使用可能かのチェックを行います。
  LOOP
   顧客マスタwkに対して存在チェックを行います。
   ・この時、存在しなれけば更に、顧客マスタに対しても同様に存在チェックします。
   結果
   ・両方に存在しなければOKとし、その値を採用します。 (LOOPから抜けます。)
    但し、実際にレコード確定して重複エラーの場合はNGとします。
   ・上記がNGならば、変数 := 変数 + 1 として再度LOOPを継続します。
  LOOP_END

➢ 顧客マスタ保守
 新規作成ボタンを押下し、自動採番された値が表示され、カーソルが次の項目に移動した状態

➢ 新規ボタンから呼び出されたスクリプト
 LOOP処理にて自動採番を実施し、顧客コードの存在チェックを実施。
 注) 顧客保守_顧客マスタ :顧客マスタwkに読み替えてください。
 注) $カウント制限の値を10としていますが、実際にはマスタ保守を使用できる人数等を設定します。




➢ 上記スクリプトから呼び出される顧客コードの存在チェックを行うスクリプト
 注) 顧客保守_顧客マスタ :顧客マスタwkに読み替えてください。
 注) 顧客マスタ正規    :顧客マスタに読み替えてください。



補足事項
・顧客マスタwkと顧客マスタとは顧客コードでリレーションしています。
・上記リレーションのオプションとして、顧客マスタの以下項目をチェックしておきます。
 このリレーションシップを使用して、このテーブルでのレコードの作成許可(I)

以上です。

P.S
かみゅーのホームページ
https://www.date-systems.com/

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« FileMaker事前検証(6回目)... | トップ | FileMakerでの構築(1回目)... »
最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

FileMakerの事前検証(レコードロックと自動採番)」カテゴリの最新記事