2009-05-22 32 views
3

私は以下を持っています: "customer"テーブルのメインフォーム "customer"。テーブル "請求書"現在のレコードに基づくサブフォームの計算されたコントロール

から "請求書日付"、 "請求書金額" "顧客ID"などのフィールドを含むサブフォーム "請求書"をサブフォーム "請求書"に入力すると、 "請求書"サブフォームのレコードをクリックするか、 現在のレコードが「クリックされた」、または選択されるまで、「合計金額」コントロールが「請求額」の合計を計算するようにしたいと思います。

請求書とマイクロソフトの顧客のためのすなわち: 1)5月2日09、$、150 2)5月3 09、$ 200 3)4月9日、$ 500

ユーザーがレコード2をクリックした場合)、「総ので、これまで」レコード1上のユーザーがクリックした場合)$ 350 を示すべきである、 『合計がこれまでに』記録3上のユーザーがクリックした場合)$、150 を示すべきである、 『合計は、これまで』現在、私はDSUM関数を使用しています$、850

を示すべきサブフォーム "請求書"の "OnCurrent"イベントで "今までの合計金額"の値を設定します。この方法は遅く、非効率的ですか?

msアクセス機能を使用した、他の方法よりシンプルでクリーンで洗練された高速で効率的な方法はありますか?

どの請求書がクリックされた場合でも、この請求書をすべての請求書に表示するように「請求書」サブフォームを作成します。

答えて

1

DSumメソッドが有効な場合は、それを使用します。

遅すぎる場合は、レコードセットクローンを使用してレコードをループする方法もあります。 これはもっとコードですが、データベースにヒットする必要がないため、より効率的です。一意のキーが必要です。

Private Sub Form_Current() 

    Dim rst As DAO.Recordset 
    Dim subTotal As Currency 
    Dim rec_id As Long 

    'get clone of current records in subform' 
    Set rst = Me.RecordsetClone 

    'save current record id' 
    rec_id = Me.rec_id 

    rst.MoveFirst 

    'loop and total until current is reached' 
    Do Until rst![rec_id] = rec_id 
    subTotal = subTotal + rst![InvoiceAmt] 
    rst.MoveNext 
    Loop 

    'add last amount on current record' 
    subTotal = subTotal + rst![InvoiceAmt] 

    Set rst = Nothing 

    'set text box with subtotal' 
    Me.Text2 = subTotal 

End Sub 

もう1つの方法は、sum()を使用してsqlクエリを作成する方法ですが、さらに多くのコードが必要になり、データベースに再びヒットします。

+0

DSum()が遅い場合は、すべてのレコードを確実にループするのが遅くなりますか? –

+0

いいえ - レコードセットクローンはインメモリコピーです。 DSUMはデータベースに対してクエリを実行します。 –

+0

これは、すでにフィルタリングされたレコードをサブフォームにコピーしたものなので、多くのレコードになることはありません。 –

0

サブフォームのフッターに隠しコントロールを配置し、そのフォームをメインフォームから参照できます。 Dsumの第3引数が"InvoiceId <= " & InvoiceId

のようになります。この場合、VBA /イベントは必要ありません。