Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7全般 : Access 2013)
1対多のワークテーブルについて
投稿日時: 17/12/22 19:00:59
投稿者: yamasho

お世話になります。
 
T_営業データとT_営業データ詳細とT_参加者データがあります。
それぞれ1対多の関係になっています。
 
●T_営業データ
 
EID
日付
社員コード
 
●営業データ詳細
 
EID
ESID
時間
SID
 
 
●参加者データ
 
SID
参加者コード
 
 
バックエンド・フロントエンドともにmdbです。
共有して使っているため、
それぞれのローカルに作業テーブルを持っていて、
いったん作業テーブルにデータを格納して、
それをいじって「登録ボタン」を押したら
バックエンドのmdbに戻してあげてます。
 
T_営業データとT_営業詳細データのみのときは、
ワークテーブルを使う方法で問題なく出来ました。
 
T_営業データを単票形式のフォーム、
T_営業データ詳細を表形式のサブフォームにしました。
 
新規登録のときEIDは0にしていて、
登録ボタンを押したときに作業テーブルのEIDに
最大値+1をセットしてINSERT INTO文で追加しています。
 
 
サブフォームのそれぞれのレコードのところに
「参加者」というボタンを作って、
ボタンを押すと参加者のフォームが開くようにしたのですが、
とたんに作業テーブルを使うことに行き詰ってしまいました。
 
SIDという項目をどのようにすればいいのか?
 
作業テーブルに入力しているときは0にしています。
それは入力中に他の人が登録ボタンを押すかも知れず、
SIDが確定していないからです。
 
そもそも何重にも関連付けになっているときは、
作業テーブルを使うのは現実的でないのでしょうか?
 
 

回答
投稿日時: 17/12/23 13:12:26
投稿者: hatena
投稿者のウェブサイトに移動

> 新規登録のときEIDは0にしていて、
> 登録ボタンを押したときに作業テーブルのEIDに
> 最大値+1をセットしてINSERT INTO文で追加しています。
 
新規登録の場合は、それでいいですが、
 
> そもそも何重にも関連付けになっているときは、
 
複雑な処理になるし、事前にIDが決定していた方が
シンプルにできそうですね。
 
また、既存データの編集の場合も、この方法では対応できませんね。
 
既存データの編集への対応も考慮して、
本テーブルに更新状態を管理するフィールドを追加する
方法はどうでしょうか。
 

 
●T_営業データ
  
EID
日付
社員コード
更新中ユーザーID
更新開始時刻
 
というように2つフィールドを追加して、
更新する場合は、2つフィールドにデータを入力してから、
作業テーブルにコピーして、更新作業を開始、
新規の場合は、新規レコードを追加(EIDも発行しておく)してから、
作業テーブルにコピーして、入力作業を開始、
入力後、作業テーブルの内容を、本テーブルに戻すときに、
更新中ユーザーID、更新開始時刻 にはNullを代入。
 
更新中ユーザーID、更新開始時刻 がNullでないレコードは、
編集できないようにロックしておく。
 
というような感じにすればどうでしょうか。
 
レコードロック状態を管理するフィールドを、
更新中ユーザーID、更新開始時刻 の2つにしたのは、
編集中にフリーズなどのトラブルが発生した場合、
ロックが解除されなくなるので、
このフィールドデータを元に対処できるようにするためです。
 
これは一例ですので、そちらの運用状況に合わせて、検討してください。

投稿日時: 17/12/23 15:52:40
投稿者: yamasho

お世話になります。
 
このような方法があったのですね。
いっきに目の前が明るくなりました。
 
この方法だといろんな場面で使えそうです。
勉強になりました。
ありがとうございました。