こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Accessでの連鎖更新について

いつもお世話になっております。

表題の件、アクセスでの連鎖更新についての質問です。
以下のようなテーブルを持っているとしまして

T商品マスタ
ID:オートナンバー(主キー)
管理番号:INT
商品名:String

T部品
管理番号:INT
部品名:String
備考:String

T商品マスタとT部品は、管理番号をキーにして1対多になるのですが

クエリで
T商品マスタ.管理番号
T商品マスタ.商品
T部品.備考

表示自体は、T商品マスタのレコード分のみ表示させて、備考を入力した場合、T部品の管理番号が同じレコードすべてに同じ備考を登録したいのですが、エンティティやクエリの作りについて、どうすればよいか見当がつきません。

T商品マスタの管理番号は、主キーになっておらずNullも許可し重複もあります。
T部品は、主キーがなく同一の管理番号で部品が多数あります。

ネットで調べ、連鎖更新をしようと思ったのですが、エンティティの作成画面でエラーが発生してしまいました。

初心者で、知識がなく説明がうまくできませんが、どうぞよろしくお願い致します。

投稿日時 - 2018-10-27 12:05:14

QNo.9551668

すぐに回答ほしいです

質問者が選んだベストアンサー

【お詫び】補足は一部撤回します。

撤回:[売上伝票].[部品台帳_ID]というテーブル設計はありえない。

 他のテーブルに[部品台帳]のデータをリンクという形で紐付けして参照するのは大いに問題あります。仮に、そういう形で参照していると、その後に[部品台帳]を変更すると全ての[売上伝票]の参照データが書き換わることになります。こういう連鎖更新が許されるケースは、ほとんどありません。そういうことで、参照時点の各データをコピーするというのが一般的。こういう設計だと、[部品台帳]のデータに誤りがあって訂正したら、それは次回参照から反映されるだけ。過去に遡ってデータが自動訂正されることを防げます。

【重複キーと言う考え】

[部品台帳].[商品台帳_ID]・・・1、2、3・・・・N
[部品台帳].[部品番号]・・・・・・1、2、3・・・・N

という設計もあるかと思います。が、この場合には、入力フォームのVBAが多少難しくなります。例えば、1、2、3と連番を付与していた場合、2を削除すると連番が崩れて1、3になります。その場合には、削除と同時にVBAで[部品番号]を更新します。もちろん、こういう訂正を許すためには、他のテーブルで[部品台帳]データをリンク参照することは許されません。

*伝票明細などは[行番号]で管理するのは当たり前。でも、マスターの従表を同様な恰好で管理するのか、(回答1のように)安直にシリアル番号を付与するだけで逃げるのか?そこら辺りは、全体のルールに従ったがよいと思います。

 以上、補足の一部を撤回すると同時に、重複キーという考えもありえるということを追記しておきます。

投稿日時 - 2018-10-27 21:43:30

ANo.4

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

【補足】サブフォームの先頭列を1、2、・・・Nと表示するには?

1、[部品台帳].[ID]を非表示にする。
2、先頭に列[行番号]を追加して連番を付与する。
  ・テーブル[部品台帳]には、列[行番号]の追加は無用。

 列[部品台帳].[ID]は、テーブル[売上伝票明細].[部品台帳_ID】に記録するのに必要な列。いわば、テーブル設計上必要なそれ。よって、ユーザが見る必要も、知る必要もない。そういうことで、入力フォームでは非表示にし、1行目データ、2行目データという形で表示することもありです。

 と、これだけを補足しておきます。

投稿日時 - 2018-10-27 14:24:56

ANo.2

回答1の設計だと入力フォームは添付図のようになります。

留意事項1、主フォームの[商品台帳].[ID]は、VBAで生成する。
      つまり、ユーザは入力することも変更することも不能。
留意事項2、従フォームの[部品台帳].[ID]も、VBAで生成する。
      つまり、ユーザは入力することも変更することも不能。
留意事項3、従フォームの[商品台帳].[ID]は、表示しない。

仮に、開発案件が個人の練習用でないのであれば、主キーは採番すべきです。でないと、テーブルが破損した時の修復がとっても困難になります。VBA関数をりようすれば、たかだか、一行程度で採番できます。

 私からは、以上です。

投稿日時 - 2018-10-27 14:13:53

ANo.1

1、テーブル設計にミスあり。
2、リレーションの設定にミスあり。
3、クエリの作成は不要。

【テーブル設計のミス】

・列[管理番号]は不要。

【リレーション設定のミス】

・[商品台帳].[ID]--->[部品台帳].[商品台帳_ID]で設定すべし。
*従表の連結用列の名前は、[主表名]+[_]+[ID]などと見て分かるように工夫。

【クエリの作成は不要】

・原則としてクエリの利用は差し控えるべし。

ここまでを回答1として以下の図を添付しておきます。

投稿日時 - 2018-10-27 14:02:39

あなたにオススメの質問