Microsoft Access 掲示板

テーブルのコード設計

5 コメント
views
4 フォロー

はじめまして。
初心者です。
お世話になります。
簡易顧客管理システムをAccess独学しながら制作しています。
顧客情報を登録後、顧客情報(担当者や電話番号等)が変更になった場合に対応できるテーブル作成で、ご教授して頂きたく書き込みました。
顧客情報変更後の取引は最新の顧客情報で管理し、過去の取引は過去の顧客情報で管理したいですがどの様なテーブル設計がいいでしょうか?
顧客コードと顧客サブコードのフィールドと思ったのですがどの様に繋げばいいか分らないです。
どなたか方法についてご教授いただけませんでしょうか?
ご教示の程、宜しくお願い致します。
作成:access:2019
使用pc:Windows10 64bit

Strike
作成: 2020/08/21 (金) 00:16:37
通報 ...
1

方法としては2つあります。

  • ひとつは、変更のあるデータは別テーブルにして変更履歴として保存しておく方法。
  • もうひとつは、取引情報のテーブルに、顧客のデータも重複して保存しておく方法。

前者の設計例(一例ですので、実態にあわせて修正の必要あり)

顧客マスター
 顧客コード 主キー 
 顧客名
 ・・・その他変更の可能性のないフィールド

顧客情報履歴
 顧客情報履歴CD 主キー
 顧客コード
 変更日
 電話番号
 担当者名
 ・・・その他変更の可能性あるフィールド

取引情報
 取引情報ID 主キー
 顧客コード
 顧客情報履歴CD
 取引日
 取引内容
 ・・・・

顧客情報履歴CD は入力フォームのテキストボックスの規定値に最新値を設定しておく。(DMax関数で)

※顧客情報履歴 は 顧客コード と 顧客サブコード で複数フィールド主キーにする方法もあります。


後者の設計例

顧客マスター
 顧客コード 主キー 
 顧客名
 変更日
 電話番号
 担当者名
 ・・・・

取引情報
 取引情報ID 主キー
 顧客情報履歴CD
 取引日
 取引内容
 電話番号 変更の可能性のあるフィールドは重複して持たせる
 担当者名 変更の可能性のあるフィールドは重複して持たせる
 ・・・・

フォームで入力時に、変更の可能性のあるデータは、VBAでマスターの値を代入する。

2
Strike 2020/08/21 (金) 19:30:57 7550c@2ebc7

hatena様
早速、ご回答と分かりやすい説明をして頂きありがとうございます。
Accessを勉強し始めたばかりで前者の設計例と後者の設計例どっちがいいのか判断すらまだできません(-_-;)
同じ情報を何回も登録したくないので前者の設計例を参考させながら制作したいと思っております。
テーブル構成は下記を想定しています。(Excelで仮表を作成した程度でAccessでは未作成です。)
テーブル設計で新たに質問がいくつか出てきました。
顧客マスター
 顧客コード 主キー (AAAA0001)(AAAA:は任意4文字)(0001:自動ランダム採番)
 顧客名
 登録日

顧客情報履歴
 顧客情報履歴CD 主キー(数値型)
 顧客コード
 変更日
 電話番号
 顧客先担当者名
 ・・・

取引情報
 取引情報ID 主キー(数値型)
 顧客コード
 顧客情報履歴CD
 取引日
 取引内容
 社員コード
 ・・・・

社員マスター
 社員コード 主キー(020001)(020:入社年)(001:連番)
 名前
 フリガナ
 入社日
 ・・・・

質問1:
顧客マスターテーブルの顧客名も変更される可能性があり、顧客情報履歴テーブルに移動をした方がいいでしょうか。
(顧客マスターテーブルのフィールドが登録日だけになってしまいます。)

質問2:
顧客コードでアルファベット4文字とランダムで自動生成した数値にしたいですが参考している書籍に書いて無く、可能でしょうか。

質問3:
社員コードは入社年と連番の組合せでしたく、年が変わったら連番を001にリセットしたいです。
例:2020年4月~2021年6月まで020001~、2021年4月~2022年6月まで021001~みたいです。

いきなり最初のフィールドのコード設定で躓きましたがご教授の程宜しくお願いします。
現在は書籍を読み続きながらhatena様のサイトの過去の投稿等で勉強させて頂いてます。
ありがとうございます。
色々と質問等出てくるかもですが、どうかご教示の程、宜しくお願い致します。

3
Strike 2020/08/21 (金) 19:38:07 7550c@2ebc7

hatena様
すみません。
質問3に誤りがあります。(6月→3月)
修正できなかったので質問3のみ再度書き込みました。
不慣れで大変申し訳ありません。
質問3:
社員コードは入社年と連番の組合せでしたく、年が変わったら連番を001にリセットしたいです。
例:2020年4月~2021年3月まで020001~、2021年4月~2022年3月まで021001~みたいです。

4

私自身、実運用でそのような仕様のものは作ったことがないので、脳内シミュレーションのみで提案してますので、実運用で問題が発生するかもしれませんが、その場合はその都度、修正していくことになると思います。

質問1:
顧客マスターテーブルの顧客名も変更される可能性があり、顧客情報履歴テーブルに移動をした方がいいでしょうか。
(顧客マスターテーブルのフィールドが登録日だけになってしまいます。)

顧客情報履歴テーブルに移動をした方がいいと思います。また、それだけ変更項目が多いなら、前者の方法がいいと思います。
顧客マスターテーブルに、最新顧客情報履歴CD のフィールドも追加しておくといいでしょう。
顧客情報を更新したときに、その 顧客情報履歴CD でマスターの 最新顧客情報履歴CD を更新するようにVBAで組んでおきます。
顧客情報の最新の情報のみ簡単に抽出できますので。これがないと、DMax関数かサブクエリの複雑なSQLになります。

質問2に関してはVBAが必要になりますね。重複チェックも必要になります。ランダムな値は、rnd関数を使って取得します。この辺はWEB検索で調べてみてください。

質問3は、WEBで探せばありそうな気がします。
あるいは、入社年 と 連番 は別フィールドにして、複数フィールド主キーにするという方法もあります。
こうすると、連番の採番が楽になります。

今、ちょっと時間がないので、とりあえず回答になりましたが、上記をヒントにいろいろ調べてみてください。

5
Strike 2020/08/22 (土) 19:39:22 8b054@2ebc7

hatena様
お世話になっております。
お忙しい中、ご回答して頂き、ありがとうございます。
頂いたヒントを調べながら制作してみます。
難易度がかなり高そうですが(-_-;)、少しずつ勉強しながら頑張ります。
引き続き、今後とも宜しくお願い致します。