Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Microsoft 365)
前回の終了bもとに1000番ごとに採番
投稿日時: 22/06/20 17:17:03
投稿者: あきさん

お世話になります。
 
以下のテーブルがあります。
 
≪詳細_T≫
ID    商品コード    開始    終了
1    1234     000001 001000
2    1234     001001    002000
3    5678     000001    001000
 
 
商品コード"1234"が5個注文が入ると
≪詳細_T≫
ID    商品コード    開始    終了
1    1234    000001    001000
2    1234    001001    002000
3    5678    000001    001000
4    1234        
5    1234        
6    1234        
7    1234        
8    1234        
 
となります。
この時、追加されたレコードの開始bニ終了b取得する方法はありませんでしょうか
 
テーブルのデータ型は以下の通りです。
ID:オートナンバー型
商品コード:短いテキスト
開始aF短いテキスト
終了aF短いテキスト
 
条件は以下の通りです。
(開始bフ条件)
同じ商品コードの開始bェ空白かつ、IDが一番若いレコード→同じ商品コードの最大終了+1
(終了bフ条件)
開始+1000
開始aA終了bフ空白がなくなったら処理を終了する
 
==========================================
追記
≪現在できていること≫
クエリで商品コードごとの終了bフ最大を抽出する
 
なにとぞお力添えをお願いします。
 
 
 

回答
投稿日時: 22/06/21 12:06:43
投稿者: Suzu

引用:
この時、追加されたレコードの開始bニ終了b取得する方法はありませんでしょうか

 
この時 とは、
「この条件下」という意味でしょうか。それとも「この時機」と言う意味でしょうか。
 
 
引用:
(終了bフ条件)
開始+1000

に関しては、開始No が 取得できれば 計算で出る話なので割愛します。
(手動で、番号を変える等を行わないのであれば、開始No のフィールドだけあれば
 事足りるかもしれませんね。)
 
 
方法として
1. 「1234」のデータを 5件 入れた後、更新クエリ を使い 一気に 開始No, 終了No に値を与える
 
2. フォーム上で、1234 の値をテキストボックスに入れたとき、
  そのフォーム上の 開始No のテキストボックス に 値を与える
 
この二つが考えられます。
 
今作成できている クエリを使えば、 2. の開始No のテキストボックスに入れるべき値は取得できますよね?
マクロを使って代入するのであれば、DLookUp関数を使います。
 
 
1. の更新クエリの場合、計算元となる値を取得するテーブルが、自テーブルになります。
クエリにて計算中のテーブルは、ロックが掛かる事になりますので、更新不可となります。
(クエリ中 で INNER JOIN を使わずに、DMax等の広域関数を使えば更新可能)
 
ですので、計算を行った結果のデータを、ワークテーブル等の仮のテーブルに保存し
そのテーブルの値を元に、更新クエリを発行します。
 
 
計算させるクエリは
SELECT
	ID,
	商品コード,
	Format
		(
			Val(
				DMax("終了No", "詳細_T", "商品コード='" & 詳細_T.商品コード & "'")
			)
			+
			DCOUNT("*", "詳細_T", "(終了No IS NULL) AND ID<=" & 詳細_T.ID )
			* 1000
		,
		"000000"
		) AS AA
FROM 詳細_T
WHERE 開始No IS NULL;

こんな感じでしょうか。(終了No は Null許可の場合)
 
フィールドが、テキスト型ではなく、数値型とし、
書式等の見せ方で 【001001】の様に見せる様にするなら Val も Formatも不要になるので、
もっと簡単ですね。

投稿日時: 22/06/21 15:07:21
投稿者: あきさん

お世話になっております。
 
説明不足の問いに対して、丁寧な回答ありがとうございます。
 

方法として
1. 「1234」のデータを 5件 入れた後、更新クエリ を使い 一気に 開始No, 終了No に値を与える

2. フォーム上で、1234 の値をテキストボックスに入れたとき、
  そのフォーム上の 開始No のテキストボックス に 値を与える

この二つが考えられます。

 
商品の注文フォームに注文数を入力すると、詳細_Tのレコードが
注文数分追加
されるようにしていたので、
1.の方法でやってみようと考えております。
 
フィールドが、テキスト型ではなく、数値型とし、
書式等の見せ方で 【001001】の様に見せる様にするなら Val も Formatも不要になるので、
もっと簡単ですね。

 
おっしゃる通り、見た目用にあえてテキスト型にして、関数が複雑になるのを考えると、
数値型で計算させて、最後に書式で整えるほうがいいとおもいました。
 
久しぶりのSQLで、コンパイルエラーになってしまうところの原因がまだつかめず模索中です。
 
取り急ぎ、シンプルにしようとテキスト型→数値型に変更してみようと考えております。

回答
投稿日時: 22/06/21 15:37:34
投稿者: Suzu

あきさん さんの引用:
商品の注文フォームに注文数を入力すると、詳細_Tのレコードが
注文数分追加
されるようにしていたので、
1.の方法でやってみようと考えております。

 
注文数分のレコードを追加する仕組みが 既に出来上がっているとお見受けします。
であるならば、番号を採番する処理を、その仕組みに組み込めば良いのではありませんか?
 
注文数分のレコードを追加する
 → 指定件数 のレコードを追加する
    を 一般機能で実現するのは難しいですから、
     マクロあるいはVBA を使用して
              ・フォームから 値の代入
       ・追加クエリ
            を指定件数分 繰り返し処理を行っているのではないでしょうか?
 
そうであり、終了Noが、数値型 ならば、
 
DMax("終了No", "詳細_T", "商品コード='" & Forms![フォーム名]![注文商品コード入力コントロール名] & "'") + 1
で、
新規レコードの 開始No は 取得できますよね。

投稿日時: 22/06/21 17:30:06
投稿者: あきさん

お世話になります。
 

引用:
注文数分のレコードを追加する
 → 指定件数 のレコードを追加する
    を 一般機能で実現するのは難しいですから、
     マクロあるいはVBA を使用して
              ・フォームから 値の代入
       ・追加クエリ
            を指定件数分 繰り返し処理を行っているのではないでしょうか?

 
いえいえ。そんな大層なものではないんです。
1〜100の数字が、入っているだけ(連番_T)を用いて、追加クエリを作成しただけなんです。
以下、追加クエリのSQLです。
 
INSERT INTO 詳細_T ( オーダー, 商品コード, 注文数, カウント数 )
SELECT 受注マスタ_T.[オーダー], 受注マスタ_T.商品コード, 受注マスタ_T.注文数, 1 AS カウント
FROM 受注マスタ_T, 連番_T
WHERE (((連番_T.連番)<=[注文数]));

 
※受注マスタ_TにオーダーaA商品コード、注文数を入力することを前提
 追加先が、詳細_Tとなります。
 注文数は100以上にはならないため、連番_Tは100まで。
 
レコードを追加してから、改めて開始bニ終了bフ値を代入することに集中しすぎて
勝手に別々に考えていました。
Suzuさんからご指摘を頂いて、糸口がつかめたような気がします。

回答
投稿日時: 22/06/22 15:17:20
投稿者: Suzu

引用:
Suzuさんからご指摘を頂いて、糸口がつかめたような気がします。

 
前回の、DMaxを使った方法は、
INNER JOIN や、WHERE を使い お互いのテーブルのレコードを限定する方法であれ場使用できますが
今回は、そうなっていないので、そのままでは使用できません。
 
追加クエリ の中の SELECT〜 を 別クエリとして保存し
その保存したクエリに対してであれば 使用できます。
 
 
ただ、今回は、連番テーブルを使っているのですから、
連番で、値を入れてしまい、その連番に、+○○ の更新クエリを発行した方が早くありませんか?

投稿日時: 22/06/23 16:38:58
投稿者: あきさん

お世話になっております。
 

引用:
ただ、今回は、連番テーブルを使っているのですから、
連番で、値を入れてしまい、その連番に、+○○ の更新クエリを発行した方が早くありませんか?

 
確かにそうですね。
 
商品コードのグループごとの連番に、+〇〇の更新クエリを実行したほうが早い気がしてきました。
 
一人で考えているとついつい複雑に考えてしまうところを
いろんな角度からご意見を頂き、多方向から考えることができたのが大きな収穫でした。
 
ありがとうございました。
 

投稿日時: 22/07/01 16:26:51
投稿者: あきさん

お世話になっております。
 
この度は大変お世話になりました。
 
無事、解決方法を見出すことができました。
一人作業で行き詰ったときに、ご意見を頂けたことが
大きな進展につながりました。
 
ありがとうございました。