• 締切済み

MS ACCESSのDSUM関数の設定について

お世話になっております。 以下の点についてアドバイスをお願いします。 ・「製品テーブル」、「売上テーブル」と「生産テーブル」を作って、在庫の累計計算をしたいと 考えております。 ・作成したテーブルに基づき、添付画像にあるクエリを作成しました。 ・このクエリで以下の数式を入力して在庫の累計計算をしようとしたのですが、エラーがでて、計算式の入力を 完了できません。数式をどのように変更すればよいかアドバイスをお願いします。 DSum(“[生産数]-[売上数]”,”B”,”製品コード=”&[製品コード]&”AND年月<='"&[年月]&"'") よろしくお願いします。

みんなの回答

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.3

http://okwave.jp/qa/q8410663.html の続きですね DSUM関数は使ったことがありません。 改めて見直しましたが、製品毎にグループ化する方法がわかりません。 VBAが必要です。 製品テーブル、在庫テーブル、中間テーブルの3つ。 添付されたリレーションは確かに直列ですが問題がありそうです。 クエリーは在庫テーブルを基にして、売上クエリーと生産クエリーの2つ作成します。 売上クエリー  製品コード  年月  期初在庫数(規定値=0)  売上数(規定値=0)  売上金額(規定値=0) 生産クエリー  製品コード  年月  生産数(規定値=0) 製品テーブル(主キー)  製品コード  製品名 在庫テーブル(データの重複を避けるため主キーは製品コードと年月)  製品コード  年月  期初在庫数(規定値=0)  売上数(規定値=0)  生産数(規定値=0)  期末在庫数(規定値=0)  売上金額(規定値=0)  生産金額(規定値=0) 中間テーブル(データの重複を避けるため主キーは製品コードと年月)  製品コード  繰越在庫数(規定値=0) 以下に在庫数の繰越計算のルーチンを記述します。   DoCmd.SetWarnings Trueは更新の過程を表示されます。運用時はFalseにします。 ------------------------------------------------ Private Sub 在庫繰越B_Click() DoCmd.SetWarnings True DoCmd.RunSQL ("Update 在庫テーブル set 期末在庫数 =期初在庫数+生産数-売上数 where 年月 =月初 ;") DoCmd.RunSQL ("Delete From 中間テーブル;") DoCmd.RunSQL ("Insert Into 中間テーブル(製品コード,繰越在庫数) select 製品コード,期末在庫数 From 在庫テーブル WHERE 年月 = 月初 ;") 'T在庫へ追加された商品も含めてレコードを追 DoCmd.RunSQL ("Insert Into 在庫テーブル(製品コード,年月) Select 製品コード,翌月 From 製品テーブル ;") 'T在庫の当月入出庫数を0にする DoCmd.RunSQL ("Update 在庫テーブル set 期初在庫数 = 0 where 年月 = 翌月 ;") DoCmd.RunSQL ("Update 在庫テーブル Inner Join 中間テーブル On 在庫テーブル.製品コード = 中間テーブル.製品コード set 期初在庫数 =繰越在庫数 where 年月 = 翌月 ;") DoCmd.SetWarnings True MsgBox ("在庫更新完了") End Sub 追伸 年月は日付型にして、月初日にすると何かと便利です。 月末=年月+31-day(年月+31) 翌月=月末+1 自分は参考URLを頼りにしています。

参考URL:
http://www.geocities.jp/cbc_vbnet/top/nyumon.html
KASHIYADE
質問者

お礼

お世話になっております。 細かいアドバイスに深謝致します。

回答No.2

訂正: × 年次期首在庫数 ○ 当期期首在庫数

回答No.1

全体として良く設計されたテーブル構造ですが、少し、手直しを必要とする箇所もあります。 修正点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で)行います。「先月末の在庫数は?」というリクエストに応えるための方策です。 私が、気が付いた点は以上です。

KASHIYADE
質問者

お礼

お世話になっております。 懇切なアドバイスに深謝申し上げます。 いただいた内容で作成します。 不明点があれば改めてご連絡させていただきます。 よろしくお願いします。