御世話になります。
在庫管理で在庫数量の考え方についてお尋ねしたいのですが、
フィールド 品名ID,品名,細別,最低在庫数量,単位,保管場所,JANコード で テーブル B_1 在庫品マスター 、
フィールド 入出庫ID,品名ID,入出庫日,入庫数量,出庫数量,作業者ID で テーブル F_1 入出庫台帳を作成しました。
在庫数量が テーブル B_1 在庫品マスター の最低在庫数量より少なくなったら一覧表で抽出されるようにすることを前提にした時、
在庫数量 は B_1 or F_1 のテーブルにフィールドして作成した方がいいのか?
それとも F_1 入出庫台帳 を元に クエリを作成して 在庫数量を作成し計算させた方がいいのでしょうか?
管理する品物の数は約1000アイテムぐらいあります。
「クエリを作成して 在庫数量を作成し計算させる」というのがデータベースでの原則的な方法です。
在庫数量フィールドを持たせると、新規追加や更新があるたびに在庫数量フィールドも更新する必要がありますが、更新漏れがあったりして実際の在庫との乖離が発生した場合、面倒になります。
期間が長くなって計算量が多くなり処理が重くなったら、期首在庫フィールドを持たせて、期ごとに現在庫を計算するというように対処するのがいいでしょう。
お世話になります。
https://hatenachips.blog.fc2.com/blog-entry-443.html を参考にして
フィールド 入出庫ID,品名ID,入出庫日,入庫数量,出庫数量,作業者ID がある テーブル F_1 入出庫台帳 を作成し、
クエリ F_1 入出庫台帳 在庫数量計算 を作成しました。
HPを参考に
在庫数量: DSum("入庫数量-出庫数量","F_1 入出庫台帳","入出庫日<#" & [入出庫日] & "# OR 入出庫日=#" & [入出庫日 ] & "# AND 入出庫ID<=" & [ 入出庫ID] & ")")
と記述しましたが、入出庫日を求めるメッセージボックスと入出庫IDを求めるメッセージボックスが表示され、何も入力せず進めると在庫数量に #エラーが表示されます。構文が間違っているのでしょうか?
入出庫ID 品名ID 入出庫日 入庫数量 出庫数量
4 1 2019/04/01 20
5 1 2019/04/10 5
6 1 2019/04/12 6
のデータがサンプルとして入力してあります。
まず、入庫数量、出庫数量に未入力(Null)がある場合は、
"入庫数量-出庫数量"
の部分は"Nz(入庫数量)-Nz(出庫数量)"
としてください。[入出庫日 ]
[ 入出庫ID]
の部分の全角空白は削除してください。(フィールド名に全角空白がない場合。)あと、
(
が足らないですね。ありがとうございます。品名IDごとに在庫数量を出したい場合は
在庫数量: DSum("Nz(入庫数量)-Nz(出庫数量)","F_1 入出庫台帳","品名ID=" & [品名ID] & ") と思い記述してみたところ
不適切な文字列が含まれています という メッセージボックスが表示され、一番最後の ") の部分が反転表示されてしまいます。
" を削除すると 指定した閉じかっこが多すぎます とメッセージボックスが表示されてしまいます。
"" や ()の使い方を教えていただけませんか?
品名ID が数値型なら、
在庫数量: DSum("Nz(入庫数量)-Nz(出庫数量)","F_1 入出庫台帳","品名ID=" & [品名ID])
テキスト型なら、
在庫数量: DSum("Nz(入庫数量)-Nz(出庫数量)","F_1 入出庫台帳","品名ID='" & [品名ID] & "'")
としてください。
DSumの代3引数には、SQLとしての条件式を文字列として設定します。
下記の内容を理解されることをお勧めします。
Access上のコード内で引用符(")と単引用符(')の使い分けについて - hatena chips
ちなみに教えていただいた構文で計算されたものを添付します。
ありがとうございます。できました。
が、1.添付画像のように入出庫IDごとに在庫数量がかわるものがのぞましいのですが・・・。
2.最初の相談であった「期ごと」でする場合はどのようなテーブルを用意したらよろしいのでしょうか?
最初の回答で、現在庫量はクエリで計算で求めた方かいいとしましたが、質問が、
ということだったのでそのように回答しました。
ある時点(現在)で、最低在庫数量より少ないものの一覧を表示するということですよね。
ある時点で、品名ごとの在庫数量を集計するのは、集計クエリで簡単にできます。その結果と最低在庫数量を比較すればいいだけですので。
しかし、その後のやりとりでの話は、在庫量の変化履歴(累計)を表示することになっています。
これは必要ですか。最初の質問内容とは異なってますが。
入出庫IDごとに在庫数量が必要となると、レコード件数毎に、DSumで計算することになるので、重くなります。式も複雑になります。
「在庫数量」フィールドをテーブルに追加して、そこにVBAで計算しながら書き込んでいくようにした方がいいですね。
累計値をテーブルに自動入力する関数 - hatena chips
の後半部分の「累計を入力する関数」を使うと簡単に累計が入力できます。
説明が下手で申し訳ありません。
物を取りに来た人には残りに在庫が あといくつあるのか を表示しなければなりません。最低在庫数量を下回れば購買部署に連絡もします。が、連絡がうまく伝わらなかった時のことも考えて、管理者がこのデータベースを立ち上げた時に最低在庫数量を下回っている物を表示させたいと思っています。(ここまでできあがれば次に発注を絡めようと思っています。)
こんな考え方はしないのでしょうか?
それなら、
物を取りに来た時に、現時点での在庫数が分かればいいのですよね。
過去をさかぼって、在庫数の変化を表示する必要はないですよね。
クエリで、入出庫台帳 と 在庫品マスター を品名IDで結合して、
集計クエリにして下記のように設定すればいいのでは。
上記の集計クエリから、下記のようにクエリを作成すればいいでしょう。
ありがとうございます。思うような物ができました。
「期ごと」について考えてみたいと思います。