プロが教えるわが家の防犯対策術!

Access2003です。

1.サブフォームにフィルターをかけてレコードを抽出
 (フォームフッターで合計値を計算するフィールドを用意しておく)
2.その合計値を利用した計算結果をカレントレコードのフィールドに自動入力

これを1つのプロシージャで行いたいのですが、うまくいきません。
1と2を分けるとうまくいきます。何か方法はありますでしょうか。

具体的に…
サブフォームのカレントレコードの[西暦]フィールドにある値と同じ値が入っているレコードを抽出。
抽出されたレコードの合計をフォームフッターで算出。([原価合計][受注高合計])
[カレントレコードの売上高]=[(カレントレコードの)原価]/[原価合計]*[受注高合計]
※全体の原価に占めるカレントレコード原価の割合で、売上高を算出します。

これを一括処理しようとすると、フィルター後の[原価合計][受注合計]の算出が間に合わないのか、「0で除算しました」とエラーが出ます。

フィルターをかけるのと、売上高を求めるのを別々のプロシージャに分けて順に実行するとちゃんと算出できます。

一括でやりたいのですが、良い方法はありますか?
宜しくお願いします。

※前回もAccessの質問をさせていただきましたが、お礼を入力する前にベストアンサーを決定してしまったため、お礼ができませんでした。回答者の皆さんその節はありがとうございました!

A 回答 (3件)

DSumで集計する方法ですが、



> サブフォームのカレントレコードの[西暦]フィールドにある値と同じ値が入っているレコードを抽出。

これですが、どのようにしていますか。
Filterプロパティに抽出条件を設定してるのなら、それを利用できます。

DSum("原価","テーブル名",Me.Filter)

で原価合計を求められます。
あるいは、

DSum("原価","テーブル名","西暦=" & Me.西暦)

でもいいでしょう。


タイマーを使う場合は、

タイマー間隔 は 0 に設定しておいて、
タイマー時のイベントプロシージャは、

Private Sub Form_Timer()
  Me.TimerInterval = 0
  
  2.の処理
  
End Sub


で、1.の処理の最後で、タイマー間隔を設定します。

Private コマンド1_Click()

  1.の処理

  Me.TimerInterval = 500

End If
    • good
    • 0
この回答へのお礼

遅くなりました!本日、出勤して内容確認・実行しました。

教えていただいた通り、Dsum関数で条件を付けて抽出・合計することで、
一旦フィルターをかけて抽出するプログラムも、
フォームフッターで合計するテキストボックスも必要なくなり、
大変スッキリとしたプログラムができました。

実際には抽出条件が複数ありAndで繋げる際に、Andも" "で囲む事に気付かず苦戦して御礼が遅くなってしまいました。

= DSum("工事費", "T金額", "営業番号 ='" & Me.営業番号 & "'And 種別 ='" & Me.種別 & "'and 西暦 =" & Me.西暦)

妥協なく、しかもスッキリ気持ちの良い処理ができました。
本当にありがとうございます!感謝しています。

お礼日時:2013/12/16 14:58

メインフォームからサブフォームのボックスを参照することは出来ませんが


サブフォームからマインフォームのボックスを参照できます。

サブフォームのイベントで

Me.Parent!原価合計 = SUM(原価)
Me.Parent!受注高合計 =SUM(受注高)
    • good
    • 1
この回答へのお礼

Me.Parent 初めて知りました。
子から親を参照する時に使うのですね。
今回はDsumで条件を指定して抽出・合計することで解決しました。

考えていただいてありがとうございます。
Me.parent、今後生かせそうです。

お礼日時:2013/12/16 15:03

> 1.サブフォームにフィルターをかけてレコードを抽出


>  (フォームフッターで合計値を計算するフィールドを用意しておく)
> 2.その合計値を利用した計算結果をカレントレコードのフィールドに自動入力

これは私もはまったことがあります。
1.の後で Requery や Recalc をかけてみてもうまく行かなかったです。

最終的には、フォームフッターの合計値を参照するのをやめて、DSum関数で合計値を求めました。

フッターにあるのに別に集計するのは無駄のような気がしますが、しょうがないですね。

フッターを参照するなら、1. の実行後、タイマーイベントを使って時間をおいて、2.を実行するという方法もありますが、これもいまいちですね。

この回答への補足

sleep で3秒ほど処理を止めてみましたが、「0で除算しました」のエラーが出ました。

補足日時:2013/12/13 15:02
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
同じ経験をされた方がいて嬉しいです。

Dsum関数に挑戦中ですが、フォームで抽出したレコードをDSumで合計するやり方がわかりません。
Dsum式の中で、テーブルから参照して抽出条件を設定しなおさないといけませんか?
例を教えていただけないでしょうか。

又はタイマーイベントの方法を教えてください。
sleep を使うと良いですか。

質問ばかりですいません。宜しくお願いします。

お礼日時:2013/12/13 14:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A