その後いかがでしょうか。
レポートで「集計実行」を使うと簡単だと言いましたが、実はこの方法には問題点があります。
レポートに表示できれば
とのことだったのでとりあえず形にしてから再修正を、と思っていましたが、(自分の方法のままでは)形にならなさそうな気がしてきたので追記を入れておきます。(ホントはQA形式で進めていきたかったのですが)
まず、レポートの表示を次のように考えることとします。
2019年12月
製品名 | 前月在庫 | 入庫 | 出庫 | 当月末在庫 |
---|---|---|---|---|
AAA | 100 | 100 | 150 | 50 |
BBB | 0 | 50 | 20 | 30 |
次に、レポートに表示する月はフォーム上で入力することとします。
・フォーム名:フォーム1
・フォーム1上のテキストボックス:表示月
表示月には表示したい月の1日を入力することとします。(2019年12月のレポートを表示したい場合は2019/12/1)
当月入出庫のデータ、当月在庫用のデータを作る
Q入出庫明細のクロス集計クエリを元に次のクエリを作成します。
Q当月入出庫
PARAMETERS [Forms]![フォーム1]![表示月] DateTime;
SELECT 製品ID, Sum(出庫) AS 当月出庫, Sum(入庫) AS 当月入庫
FROM Q入出庫明細のクロス集計クエリ
WHERE 入出庫日 Between DateSerial(Year([Forms]![フォーム1]![表示月]),Month([Forms]![フォーム1]![表示月]),1) And DateSerial(Year([Forms]![フォーム1]![表示月]),Month([Forms]![フォーム1]![表示月])+1,1)-1
GROUP BY 製品ID;
Q当月まで入出庫
PARAMETERS [Forms]![フォーム1]![表示月] DateTime;
SELECT Q入出庫明細のクロス集計クエリ.製品ID, Sum(出庫) AS 出庫の合計, Sum(入庫) AS 入庫の合計, 製品.製品名
FROM Q入出庫明細のクロス集計クエリ LEFT JOIN 製品 ON Q入出庫明細のクロス集計クエリ.製品ID = 製品.製品ID
WHERE 入出庫日<=DateSerial(Year([Forms]![フォーム1]![表示月]),Month([Forms]![フォーム1]![表示月])+1,1)-1
GROUP BY Q入出庫明細のクロス集計クエリ.製品ID, 製品.製品名;
それぞれ必要に応じた日付の範囲(where条件)で出庫、入庫を合計します。
具体的にはフォーム1の表示月に「2019/12/1」と入っていれば
上は「Between #2019/12/1# And #2019/12/31#
」、
下は「<= #2019/12/31#
」
となるような条件になっています。
Q当月まで入出庫では必要に応じて製品の情報を加えておきます。
クロス集計クエリを使う場合、フォーム上の値を使うためにはパラメーターの設定が必要です。
SQLビューであれば一番上に入っている1行ですが、デザインビューであればデザインビュー上側の適当な位置で右クリックして表示されるポップアップメニューから「パラメーター」を選択して設定できます。
レポート用のソースを作る
上の2つのクエリを基にさらにクエリを発行します。
SELECT Q当月まで入出庫.製品名, Nz([在庫],0)-Nz([当月入庫],0)+Nz([当月出庫],0) AS 前月在庫, Nz([当月入庫],0) AS 入庫, Nz([当月出庫],0) AS 出庫, Nz([入庫の合計],0)-Nz([出庫の合計],0) AS 当月末在庫
FROM Q当月まで入出庫 LEFT JOIN Q当月入出庫 ON Q当月まで入出庫.製品ID = Q当月入出庫.製品ID;
ところどころにあるNz関数はデータがなかった時に別な値に置き換える関数です。
データがなかった時の値はNull
になりますがNull
が含まれた計算は結果がNull
になるという特性がありますので、例えば12月の出庫がない製品の在庫を計算しようと在庫+入庫+出庫(Null)
を単純にしてしまうと計算結果がNull(画面上では表示なし)になってしまいます。
このクエリを表示すれば、上に挙げたレポートの表示形式のデータが表示されますので、このクエリを基にレポートを作成すれば完成です。