全体として良く設計されたテーブル構造ですが、少し、手直しを必要とする箇所もあります。
修正点1、売上や生産の履歴テーブルに売上製品コードや生産製品コードは不要。
理由、そういうコードは製品のテーブルにあれば良い。
*私の新[製品台帳]からこの二つのコードが欠落しているのはミスです。当然に、必要です。
【リレーションシップの考え方】
例示のようなリレーションシップですと、例え何らかの理由で製品台帳から製品を削除されるという事故が起きても、売上と生産の履歴は表示されます。
修正点2、少なくとも製品台帳に列[当期期首在庫]は必要です。システムの立ち上げ時には、先ず、この列の値を設定することから始めます。
修正点3、棚卸処理を行うという考えを導入するのか否か?
仮に、棚卸処理を行うということであれば、売上履歴.区分、生産履歴.区分を追加して売上や返品などを記録しておくべきでしょう。また、在庫参照の高速化を図るためには、当期売上数(又は、当月売上数)などの列を製品台帳に加えておくのも手です。
【在庫を求めるクエリ】
もちろん、質問者が意図するやり方でも現在庫は求められます。そのクエリは次のようです。
SELECT 製品台帳.ID, 製品台帳.製品コード, 製品台帳.年次期首在庫数,
DSum("売上数",
"売上履歴",
"製品台帳_ID=" & [ID] & "
AND [売上日] BETWEEN #2014/01/01# AND #2014/12/31#")
AS 当期売上数,
DSum("生産数",
"生産履歴",
"製品台帳_ID=" & [ID] & "
AND 生産日 BETWEEN #2014/01/01# AND #2014/12/31#")
AS 当期生産数
FROM 製品台帳;
棚卸処理とは、通常は、このDSum部分を月単位で(VBAで)行います。「先月末の在庫数は?」というリクエストに応えるための方策です。
私が、気が付いた点は以上です。
お礼
お世話になっております。 細かいアドバイスに深謝致します。