#717 サブクエリや集計クエリの値を更新クエリで使えないときの対処法 クエリ

次の「tbl商品入荷出荷実績」テーブルのようなデータがあるとき、クエリで集計を行うことで、商品コードごとの「在庫数量」を求めることができます(厳密には入荷・出荷のデータの基点となる”繰越数”のようなものが必要ですがここでは考えないものとします)。

■「tbl商品入荷出荷実績」テーブル


■商品コードごとの「在庫数量」を求めるクエリ
   (「商品コード」で”グループ化”、「Sum(Nz([入荷数量])-Nz([出荷数量]))」で”演算”)




ここで、もし「商品コード」を主キーとした下図のような「tbl商品在庫一覧」テーブルがあり、更新クエリを使って上記の集計結果をこのテーブルの「在庫数量」フィールドに転記したいといったとき、そのテーブルの各レコードの「商品コード」をWHERE条件として、サブクエリを使って「tbl商品入荷出荷実績」から集計値を持ってくるという方法が考えられます。

■「tbl商品在庫一覧」テーブル


この場合、まず次のような選択クエリで商品ごとの在庫数量を得られることを確認します。

SELECT 商品コード,
  (SELECT SUM(NZ(入荷数量)-NZ(出荷数量))
    FROM tbl商品入荷出荷実績
    WHERE 商品コード= tbl商品在庫一覧.商品コード)
AS 在庫数量   ← 太字部分がサブクエリ
FROM tbl商品在庫一覧



そして、そのサブクエリの式(上記の太字部分)を更新クエリの「更新」欄に入力します。


これでクエリを実行すれば、在庫数量にはサブクエリで得られた値が設定されるはずなのですが、Accessの特性上、下記のようなエラーメッセージが表示され更新クエリを実行させることができません。


このようなときの対処方法として、まずは在庫を集計するクエリを単独の選択クエリとして保存しておき、別途、更新先のテーブルとそのクエリを結合した更新クエリを作るという方法も考えられますが、そのような作りも上記と同じ構造と判断され同じエラーメッセージが表示されてしまいます。


その回避策として、「DSum」関数を使う方法があります。

在庫数量の取得において、サブクエリではなく「DSum」関数を使い、更新クエリの「レコードの更新」欄を下記のようにします。

DSum("NZ(入荷数量)-NZ(出荷数量)","tbl商品入荷出荷実績","商品コード='" &[商品コード] & "'")

  • DSum関数では上記のように最初の引数に”演算式”を指定することもできます。

  • 3つめの引数では、”tbl商品在庫一覧の商品コードと同じであるレコード”をtbl商品入荷出荷実績から集計するので、『[商品コード]』のように前後を角括弧で囲みます。また、商品コードはテキスト型なので、その前後を「'」で囲む必要があります。

このクエリを実行すると、エラーメッセージは表示されず(更新確認のメッセージは通常通り表示されます)、結果として「tbl商品在庫一覧」テーブルは次のようなデータに更新されます。
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved