• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Accessでの連鎖更新について)

Accessでの連鎖更新について

このQ&Aのポイント
  • Accessでの連鎖更新についての質問です。T商品マスタとT部品の関係をキーを使用して1対多の関係にしていますが、エンティティやクエリの作り方が分からず困っています。
  • T商品マスタとT部品の関係について、T商品マスタのレコードのみ表示させて、備考を入力した場合にT部品のすべてのレコードに同じ備考を登録する方法が分かりません。
  • 調査した結果、連鎖更新を行う方法があることを知りましたが、初心者でエンティティの作成画面でエラーが発生してしまうので困っています。

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

  • ベストアンサー
回答No.4

【お詫び】補足は一部撤回します。 撤回:[売上伝票].[部品台帳_ID]というテーブル設計はありえない。  他のテーブルに[部品台帳]のデータをリンクという形で紐付けして参照するのは大いに問題あります。仮に、そういう形で参照していると、その後に[部品台帳]を変更すると全ての[売上伝票]の参照データが書き換わることになります。こういう連鎖更新が許されるケースは、ほとんどありません。そういうことで、参照時点の各データをコピーするというのが一般的。こういう設計だと、[部品台帳]のデータに誤りがあって訂正したら、それは次回参照から反映されるだけ。過去に遡ってデータが自動訂正されることを防げます。 【重複キーと言う考え】 [部品台帳].[商品台帳_ID]・・・1、2、3・・・・N [部品台帳].[部品番号]・・・・・・1、2、3・・・・N という設計もあるかと思います。が、この場合には、入力フォームのVBAが多少難しくなります。例えば、1、2、3と連番を付与していた場合、2を削除すると連番が崩れて1、3になります。その場合には、削除と同時にVBAで[部品番号]を更新します。もちろん、こういう訂正を許すためには、他のテーブルで[部品台帳]データをリンク参照することは許されません。 *伝票明細などは[行番号]で管理するのは当たり前。でも、マスターの従表を同様な恰好で管理するのか、(回答1のように)安直にシリアル番号を付与するだけで逃げるのか?そこら辺りは、全体のルールに従ったがよいと思います。  以上、補足の一部を撤回すると同時に、重複キーという考えもありえるということを追記しておきます。

その他の回答 (3)

回答No.3

【補足】サブフォームの先頭列を1、2、・・・Nと表示するには? 1、[部品台帳].[ID]を非表示にする。 2、先頭に列[行番号]を追加して連番を付与する。   ・テーブル[部品台帳]には、列[行番号]の追加は無用。  列[部品台帳].[ID]は、テーブル[売上伝票明細].[部品台帳_ID】に記録するのに必要な列。いわば、テーブル設計上必要なそれ。よって、ユーザが見る必要も、知る必要もない。そういうことで、入力フォームでは非表示にし、1行目データ、2行目データという形で表示することもありです。  と、これだけを補足しておきます。

回答No.2

回答1の設計だと入力フォームは添付図のようになります。 留意事項1、主フォームの[商品台帳].[ID]は、VBAで生成する。       つまり、ユーザは入力することも変更することも不能。 留意事項2、従フォームの[部品台帳].[ID]も、VBAで生成する。       つまり、ユーザは入力することも変更することも不能。 留意事項3、従フォームの[商品台帳].[ID]は、表示しない。 仮に、開発案件が個人の練習用でないのであれば、主キーは採番すべきです。でないと、テーブルが破損した時の修復がとっても困難になります。VBA関数をりようすれば、たかだか、一行程度で採番できます。  私からは、以上です。

回答No.1

1、テーブル設計にミスあり。 2、リレーションの設定にミスあり。 3、クエリの作成は不要。 【テーブル設計のミス】 ・列[管理番号]は不要。 【リレーション設定のミス】 ・[商品台帳].[ID]--->[部品台帳].[商品台帳_ID]で設定すべし。 *従表の連結用列の名前は、[主表名]+[_]+[ID]などと見て分かるように工夫。 【クエリの作成は不要】 ・原則としてクエリの利用は差し控えるべし。 ここまでを回答1として以下の図を添付しておきます。

関連するQ&A