dbSheetClient

既存のAccessシステムをWeb化したいのですが、「オートナンバー型」の主キー項目を持つテーブルがあります。複数のユーザーが新規にレコードを追加しようとした場合、サーバー側で主キー項目の値が重複してサーバーへの登録に失敗するのではないですか?

サンプル事例として、サーバーDBの「顧客マスター」に、AさんとBさんが(ほぼ同時に)新しい顧客を追加登録する場合を考えます。まずAccessの「顧客マスター」フォームのオープン時に、サーバーDBに登録済みの顧客レコード(100件)がAccessに取り込まれます。AさんとBさんがフォーム上で新規顧客を追加登録しようとすると、主キー項目(「顧客ID」)が「オートナンバー型」ですので、AさんBさんいずれも [顧客ID = 101]で新規顧客が登録されます。これらの2つの顧客情報を「サーバー更新」ボタンとともにAPI("CopySvr_fromLocal”)を利用してサーバーDBに反映させると、サーバーDBの主キー(顧客ID)が「オートナンバー型」ですので、操作がわずかに早いAさんが[顧客ID=101]で登録され、Bさんは[顧客ID=102]で登録されます。つまり、Aさんの新規顧客IDはサーバーDBとクライアントPC(Access)間で一致しているのに対し、Bさんの新規顧客のIDは一致しないことになります。従って、2人が登録した新規顧客レコードはサーバーDBに対しどちらも登録されます。しかし、データに不整合が生じることになります。  この問題を回避するためにdbSheetClientでは以下の考え方を推奨しています。まず、Accessテーブルの主キーが「オートナンバー型」である場合は、基本的に「数値型(長整数型)」に変更します。サーバーDBの主キーもそれに合わせて「int型」にします。次にユーザーが新規レコードを登録しようとする直前に、サーバーによる自動採番(「顧客ID」)の最大値 + 1)を取得します。具体的には、対象テーブルの主キー項目(「顧客ID」)の最大値を管理するテーブル「MaxValueManager」を、事前にサーバーDBに追加した上で、最大値 + 1をAPI:”GetIncrementID”を使って取得し、フォームの「更新前(Before_Update)」イベントでフォームの「顧客ID」ラベルに貼り付けます。あとは通常のローカル保存 ⇒ サーバー更新処理を行うようにします。


お問い合わせ

お問い合わせフォーム