Accessのテーブル更新クエリで計算結果を一括更新する方法

概要

この記事の結論
Accessの更新クエリは、各レコードの数量と単価を使って金額を計算し、一括保存できます。全行を同じ値にする用途だけではありません。ただし表示のたびに計算すれば足りる値は、選択クエリの計算列にする方法も検討します。

この記事でわかること

  • 保存が必要か計算列で足りるか決める
  • 更新前後の値を選択クエリで比較する
  • 計算式で金額を更新する
  • Nullと丸めを業務ルールに合わせる

この記事の主な内容

  1. 更新クエリは行ごとに異なる計算もできる
  2. 保存が必要か計算列で足りるか決める
  3. 更新前後の値を選択クエリで比較する
  4. 計算式で金額を更新する
  5. Nullと丸めを業務ルールに合わせる
  6. 再実行の影響と確定処理を管理する
  7. よくある質問

想定読了時間:約8分


1 更新クエリは行ごとに異なる計算もできる

Accessの更新クエリは、各レコードの数量と単価を使って金額を計算し、一括保存できます。
全行を同じ値にする用途だけではありません。
ただし表示のたびに計算すれば足りる値は、選択クエリの計算列にする方法も検討します。

保存する目的が確定時点の金額の保持なら、更新クエリが候補です。
後で数量を変えても保存済みの金額は自動的に追随しないため、再計算のタイミングも設計します。

計算表示と保存の違いについて、計算列、更新クエリの関係を示す図

2 保存が必要か計算列で足りるか決める

見積中の随時計算なら、金額: [数量]*[単価] という選択クエリの計算列を使えます。
確定済み請求額を残すなら、確定状態や確定日時と合わせて保存する設計が向いています。

現在の単価マスターを毎回参照すると、価格改定で過去金額が変わることがあります。
取引時の単価を明細へ保存するか、履歴を持つマスターを参照するかを決めましょう。

設定例と確認点

用途方法注意
常に最新を表示選択クエリで計算元値に追随
確定金額を保持計算結果を保存再計算の管理が必要
行ごとに計算する例について、明細1、明細2の関係を示す図

3 更新前後の値を選択クエリで比較する

T_明細に明細ID、数量、単価、金額、確定済みを用意します。
数量2・単価120なら新金額は240、数量3・単価80なら240になる例で確認します。
別の行でも同じ式がそれぞれの値を使って計算されます。

サンプルコードと式

SELECT [明細ID], [数量], [単価], [金額],
 [数量]*[単価] AS 新金額
FROM [T_明細]
WHERE [確定済み]=False;

実行前の比較について、旧金額、新金額、対象IDの関係を示す図
計算更新の手順について、保全、条件、実行、確認の関係を示す図

4 計算式で金額を更新する

更新対象の金額の「レコードの更新」に [数量]*[単価] を指定します。
下記では確定済みでない行だけを対象にし、数量と単価がNullの行を除外します。
実行前に対象IDと件数を照合してください。

操作手順

1. 業務ファイルをバックアップします。

2. 選択クエリで旧金額と新金額を比較します。

3. 更新クエリへ切り替えて式と条件を確認します。

4. 実行確認の件数が予定と一致した場合だけ実行します。

5. 実行後の金額と対象外の行を確認します。

サンプルコードと式

UPDATE [T_明細]
SET [金額]=[数量]*[単価]
WHERE [確定済み]=False
 AND [数量] Is Not Null
 AND [単価] Is Not Null;

未入力値の扱いについて、Null、0、方針の関係を示す図

5 Nullと丸めを業務ルールに合わせる

Nullを含む掛け算はNullになります。Nz([数量],0)で0に置き換えることはできますが、未入力の数量を売上0と扱ってよいかは別の判断です。ここでは未入力行を除外し、入力漏れとして確認します。

VBAのRoundは、ちょうど中間の値で偶数側へ丸める動作です。
一般的な四捨五入と同じだと思い込まず、2.5、3.5、負数などで業務の端数規則と照合してください。

丸め方を検証するについて、中間値、負数、保存型の関係を示す図

既存Accessへの影響を判断できない場合

本記事の手順をコピーしたファイルで試しても解決しない場合や、既存データ・他の画面への影響を判断できない場合は、お気軽にご相談ください。対象ファイル、操作手順、期待する結果を整理すると、調査や改修の範囲を相談しやすくなります。


6 再実行の影響と確定処理を管理する

金額を数量×単価で置き換える式は、元の数量・単価が同じなら同じ結果になります。
一方、単価を単価×1.1で更新する式は、実行するたびに値が増えます。
再実行して値を収束させる運用は誤りです。

計算後に確定フラグを立てる場合は、途中失敗で状態だけ先に変わらないようにします。
複数処理をまとめて扱う必要がある場合は、トランザクションやエラー処理も含めて設計してください。

再実行の違いについて、置換、累積の関係を示す図

7 よくある質問

できます。各行のフィールドを使った計算式を指定します。

式によります。
加算・乗算で現在値を変える処理は二重更新になります。

確定値の保持が必要かで決めます。
表示目的なら計算列で足りる場合があります。

まとめと相談先

計算後に確定フラグを立てる場合は、途中失敗で状態だけ先に変わらないようにします。
複数処理をまとめて扱う必要がある場合は、トランザクションやエラー処理も含めて設計してください。

本記事の手順をコピーしたファイルで試しても解決しない場合や、既存データ・他の画面への影響を判断できない場合は、お気軽にご相談ください。対象ファイル、操作手順、期待する結果を整理すると、調査や改修の範囲を相談しやすくなります。


参考情報

Microsoft:UPDATE文
https://learn.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/update-statement-microsoft-access-sql

Microsoft:Nz
https://learn.microsoft.com/en-us/office/vba/api/access.application.nz

Microsoft:Round
https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/round-function

TOP