MS Access Tips/Sample and VBA and Blog customize etc...

フォームでの集計をレコード保存する前に反映させる

帳票フォームで集計値を表示するとき、フォームヘッダーかフッターにテキストボックスを配置してコントロールソースに =Sum([フィールド名]) というように設定すれば表示できます。

例えば下記のようなよくある受注フォームですが、

FormBeforeUpdateSum1.png

2行目の数量を 2 から 5 に変更しても、

FormBeforeUpdateSum2.png

金額はすぐに 1,000 と反映されますが、フッターの「合計」は以前のままです。しかし、その下の「すぐに反映する 合計」は編集中にもかかわらず正しい金額の合計が表示されてます。

今回はこの集計表示の方法を紹介します。

難易度:

下記のようなサンプルを例に説明します。

詳細セクションのテキストボックス

コントロールソース  数量 
名前  txt数量 

コントロールソース  単価 
名前  txt単価 

コントロールソース  =[数量]*[単価] 
名前  txt金額 

フォームフッターのテキストボックス
通常の集計テキストボックス

コントロールソース  =Sum([数量]*[単価]) 
名前  txt合計 
注: =Sum([txt金額]) とするとエラーになります。Sum内にはコントロール名を指定できません。

まず、txt金額は編集結果がすぐ反映されるのに、txt合計では、すぐに反映されない理由は、金額は、カレントレコードを対象にした演算であるのに対して、Sumなどの集計関数は、レコードソースのレコードセットを対象とした演算だからです。レコード保存するまではテーブルに保存されませんので、レコードセットにも反映されません。

数量 あるいは 単価 の更新後処理ですぐレコード保存するという方法もありますが、そうすると Undo が効かなくなるなどの問題が生じます。

そこでコントロールソースを下記のように設定するとすぐに反映させることができるようになります。

レコード保存する前に変更結果が反映する集計テキストボックス

コントロールソース  =Sum([単価]*[数量])+Nz([単価]*[数量])-Nz([txt単価].[OldValue]*[txt数量].[OldValue]) 

式の、意味を解説しますと、
Sum([単価]*[数量]) は、テーブルに格納されているデータの集計
Nz([単価]*[数量]) は、カレントレコードの現在の編集中の値の演算(未入力の場合は 0 に変換)
Nz([txt数量].[OldValue]*[txt数量].[OldValue]) は、カレントレコードの変更前の値の演算
つまりテーブルに格納されている値の演算
になります。

式全体としては、テーブルの集計に、カレントレコードの編集中の値を足して、編集前の値を引いていることになります。

サンプルファイルが下記からダウンロードできます。
FrmBeforeUpdateSum_07.zip (Access 2007-2010 形式 - 24kb)
FrmBeforeUpdateSum.zip (Access 2002-2003 形式 - 15kb)
FrmBeforeUpdateSum_2k.zip (Access 2000 形式 - 13kb)


拍手する

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/101-6ca9291d
該当の記事は見つかりませんでした。