Microsoft Access 掲示板

異なるレコード間での集計・順番に計算する方法

9 コメント
views
4 フォロー

はじめまして。 以下の方法に悩んでおり、ご教示頂きたいです。

製品Xの構成マスタのテーブル が以下のようにあり 構成品がそれぞれ在庫されています。

製品Xの構成
  ├ A :在庫30
  └ B :在庫20 ※BはAの次バージョン品のため、在庫がなくなった後に使用する。

 製品Xを以下のように計画したとします。
        6/1  6/2   6/3   6/4
 X      10   10    10    10

このときA,Bの所要計画を立てると並列のためどちらからも
引き算してしまいますが、 Aが在庫切れしたところからBを引くようにしたいです。

◆現状
                6/1  6/2  6/3   6/4
 A使用          10   10    10   10
 A在庫          20   10    10   -10

 B使用          10   10    10   10
 B在庫          10   0   -10  -20

以下のようにしたい
  6/1  6/2 6/3 6/4
 A使用 10   10 10   10
 A在庫 20   10   0    0

 B使用   0    0   0    10
 B在庫  20   20  20    10

AとBは違う物として扱っていますが 使用順としてはA→Bとなるため
苦慮しています。
良い方法がありますでしょうか?

nara
作成: 2021/05/17 (月) 20:52:26
通報 ...
1

現状のテーブル構成はどうなってますか。
各テーブルのテーブル名、フィールド名、主キー設定を提示してください。

2

お世話になっております。やろうとしていることがAccess向きではないかもしれませんが・・。すみません。画像1
画像2

添付画像(簡素化)のような テーブル構成・ 実施しようとしていることになります。

3

テーブル設計がまずいですね。

画像「計画のテーブル」のD1,D2,D3~というフィールドは日付をあらわしているのですよね。このような日々追加されているようなデータをフィールドにしてはいけません。データベース設計のセオリーから外れます。
「日付」というフィールドに日付を追加してく形にすべきです。

※BはAの次バージョン品のため、在庫がなくなった後に使用する。

AとBは同じ部品でバージョン違いであるという情報をテーブルに持たせる必要があります。

情報が不足しているで全体像が分かりませんが、とりあえず、下記のような感じのテーブル設計になると思います。

製品マスター
※製品CD
 製品名

部品マスター
※部品CD
 部品名

部品バージョンマスター
※部品CD
※バージョンCD
 バージョン名

製品構成マスター
※製品CD
※部品CD
 必要数

生産計画
※日付
※製品CD
 生産数

部品在庫履歴
※日付
※部品CD
※部品バージョン
 使用数
 在庫数

部品在庫履歴 をクエリだけで計算するのは難しいので、
VBAでDAOを使ってレコードセットとして開いて、
レコード移動しながら累計値を入力していくことになると思います。

4

ありがとうございます。
情報が不足しており申し訳ありません。
D1~ 日付に見立てたフィールドで~31まで用意し、別のフィールドで月、年を用意をしています。
ユーザとしては 入力フォームで
製品ごとに ある年月の 1日~31日 フィールドへ入力する形にしています。
入力したデータは 別のテーブルで日付に変換して 日付順に所要展開できるように考えています。
クロス集計クエリを逆にしている形です。

ご指摘があったように A,Bが同じ部品であることをバージョン情報として持たせるようにしたいと思います。

やはり、クエリでの計算は難しく
バージョン管理品 の場合は 変更順に Aが0となった場合は、Bから引くといった
VBAでの処理が必要と理解しました。

6

D1~ 日付に見立てたフィールドで~31まで用意し、別のフィールドで月、年を用意をしています。
ユーザとしては 入力フォームで
製品ごとに ある年月の 1日~31日 フィールドへ入力する形にしています。
入力したデータは 別のテーブルで日付に変換して 日付順に所要展開できるように考えています。

D1~ のテーブルは入力用の一時テーブルで、入力後、縦に展開する正規化されたデータに変換してテーブルに格納するということですね。

レコード間を順に集計していく処理(連番とか累計)はクエリは苦手です。複雑かつ重い処理になりがちです。特に今回の安形だとバージョンがあったりとより複雑になります。
VBAでレコード移動しながら処理していくのが高速かつシンプルにできます。

下記に、連番をクエリまたはVBAでする場合のサンプルがありますので、参考になると思います。

グループ毎連番を自動入力する関数 - hatena chips

7

お世話になります。 はい、
D1~ のテーブルは入力用の一時テーブルで、入力後、縦に展開する正規化されたデータに変換してテーブルに格納するということですね。
上記の通りになります。

hatena様の 累計値をテーブルに自動入力する関数 を使用させていただき
画像のような 所要量計算テーブルで所要量を計算し、累計残高としています。

製品のマスタとしては、 カレー・肉じゃがに使う じゃがいもは 代替品でOKとした マスタテーブルを持ち、
変更順をデータとして持たせるとします。

このとき、消費計画のテーブルでは
メークイン が0になったら 男爵イモ の在庫を使う ・・ のようにしたいと考えております。
累計処理で計算すると、 まだ 男爵イモを使用しなくても良い 時でも 引いてしまうため
この処理について良い案がないか というご相談になりました。

イメージばかりですみません・・。

画像1
画像1

5
りんご 2021/05/20 (木) 00:14:47 48103@0e907

クロス集計クエリを逆にしている形です。

これは、下のような感じですか?
日付,子部品あいうA,子部品あいうB,テープ,ネジ,…
6/1,
6/2.
6/3,

8

お世話になります。

以下のような感じになります。
ユーザが入力するのは 以下のフォーム
              D1   D2
X:2021:06:  10 10

上記データを
↓ 構成マスタと合わせ展開して 消費テーブルに追加

6/1 あいうA  10
6/1 あいうB  10

Excelライクに入力する範囲 を常に一定 にするため上記方法を考えております。

9
りんご 2021/05/21 (金) 01:12:59 48103@0e907 >> 8

 クロス集計テーブルとクロス集計入力フォームは、個人的には、NGです。
 クロス集計ありきで、ExcelライクなAccessを目指すと、横にフィールドを伸ばしたくなったり、縦横のイメージが抜けなくなったりしませんか?

製品名子部品1子部品2子部品36/16/26/3
製品XあいうAあいうBテープ101010

 縦横のAccessは、たぶん、複雑なSQLを都度都度要求されるので、まず完成しません。神アニメや神ゲームをExcelで再現するくらい大変でしょう。

製品名子部品使用日
製品XあいうA,あいうB,テープ,ネジ,…6/1,6/2,6/3,…

 これも、複雑なSQLが必要になるアンチパターンでしょう。

製品名子部品使用日使用数在庫数
製品XあいうA6/11030
製品XあいうA6/21020
製品XあいうA6/31010
製品XあいうB6/41020

 ある共通点を持つものを、横に並べない、これがAccessの基本だと思います。

このときA,Bの所要計画を立てると並列のためどちらからも
引き算してしまいますが、 Aが在庫切れしたところからBを引くようにしたいです。

 こんなのはどうでしょう?
・製造計画フォーム
製造日:6/1、製品名:製品X、製造数:10
材料明細

子部品No子部品予定使用数
1あいう10
2テープ5
3ネジ15

ロット明細(古いバージョンから使う事)

子部品Noロット名使用数在庫数
1あいうA30
1あいうB20

次のように、ユーザーが選んで打ち込みます。

子部品Noロット名使用数在庫数
1あいうA1030
1あいうB20

在庫数がなくなるかマイナスになると、表示されなくなったり、打ち込めなくなったりするのは、どうでしょう?

子部品Noロット名使用数在庫数
1あいうB20

あとは、在庫数をどうやって処理するかの問題は、残りますが。

 クロス集計クエリは、Access完成後、しばらく運用してから、見やすさのために、リリーフ登板する感じになるのではないでしょうか。