クエリで集計したデータを違うテーブルに掃き出す④データがない場合

Pocket

仮にデータに商品CD「B」のデータがない場合でも、クエリの実行結果はそのまま
データなしという形でテーブルに出力されます。
これはクエリではそう集計されないのですが、ADOを使ってクエリを完璧にコピー
している訳ではありません。

2803211
コードを見ると、商品テーブルのすべてのレコードに対して、「売上集計抽出」
テーブルにデータを作成しているため、売上データテーブルにその商品CDがある
なしに関わらずデータを作ってしまいます。

それを回避するコードを追加します。

考え方は簡単です。要はその商品CDのデータが売上データの中にあるか
数えて、それがゼロかそうでないか判断させるだけです。

Do Until rs.EOF
If DCount(“*”, “売上データ”, “商品CD='” & rs!商品CD & “‘”) <> 0 Then
→これで商品毎のデータ数を数えます。ゼロでなければ売上集計抽出テーブルに
データを作成します。
rs1.AddNew
rs1!商品CD = rs!商品CD
rs1!商品名 = DLookup(“商品名”, “売上集計”, “商品CD='” & rs!商品CD & “‘”)
rs1!数量 = DLookup(“数量の合計”, “売上集計”, “商品CD='” & rs!商品CD & “‘”)
rs1!単価 = DLookup(“単価”, “売上集計”, “商品CD='” & rs!商品CD & “‘”)
rs1!金額 = DLookup(“売上金額”, “売上集計”, “商品CD='” & rs!商品CD & “‘”)
rs1.Update
End If→もし商品CDに一致するデータがなければそのままここに来ます。
rs.MoveNext
Loop

そしてこれで実行してみるとエラーがでます。
2803212
このエラーはテーブルの構造上のエラーです。
売上集計抽出テーブルの主キーは商品CDなので、このコードを動かすとその商品CD
のデータを再度作ろうとしますが、その商品CDを主キーとするデータが存在します。
ということは同じ主キーのデータがかぶることになり、これはルール違反なので
エラーとなります。

ということは、再度同じコードを実行しようとするときは、一旦テーブルのデータを
削除してからやる必要があります。
そこで更にコードを追加します。

rs1.MoveFirst
Do Until rs1.EOF
rs1.Delete
rs1.MoveNext
Loop

rs.MoveFirstの前に一旦売上集計抽出テーブルを空白にするコードを追加します。

実行結果です。
2803213
これでクエリと同じ状態でデータを写すことができました。

今までのサンプルデータです。

====================================
最近真理を求めるが如く、とにかく本を読み漁っています。
どうすれば事業が発展するのか? お客さんの業績がよくなるのか?
すぐに答えが出るとも思いませんが、納得できるまで本を読み続けたい
と思います。

本日も最後までお読み頂きありがとうございます。