3

私は次のものを持っています:「顧客」テーブルからのメインフォーム「顧客」。テーブル「invoices」からフィールド「invoice date」、「invoice amount」、「customer id」などを含むサブフォーム「invoices」

ユーザーが「請求書」サブフォームのレコードをクリックまたは移動するたびに。現在のレコードが「クリック」または選択された日付までの「請求額」の合計を計算する「これまでの合計」コントロールが必要です。

すなわち、請求書のある顧客 microsoft の場合: 1) 2009 年 5 月 2 日、150 ドル 2) 09 年 5 月 3 日、200 ドル 3) 09 年 5 月 4 日、500 ドル

ユーザーがレコード 2) をクリックすると、「これまでの合計」に $350 が表示されます ユーザーがレコード 1) をクリックすると、「これまでの合計」に $150 が表示されます ユーザーがレコード 3) をクリックすると、「これまでの合計」に $850 が表示されます

現在、サブフォーム「請求書」のイベント「OnCurrent」で DSum 関数を使用して、「これまでの合計」値を設定しています。この方法は遅く、非効率的ですか?

msアクセス機能を使用した、よりシンプルでクリーン、よりエレガント、高速、効率的な方法はありますか?

どのレコードがクリックされても、この顧客のすべての請求書を「請求書」サブフォームに表示したいと考えています。

4

2 に答える 2

1

DSum メソッドが機能する場合は、それを使用してください。

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

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 クエリを作成することですが、これにはさらに多くのコードが必要であり、データベースに再度ヒットします。

于 2009-05-22T15:43:44.550 に答える
0

サブフォームのフッターに Dsum を含む非表示のコントロールを配置し、メイン フォームからそのコントロールを参照することができます。Dsum には次のような 3 番目の引数があります。"InvoiceId <= " & InvoiceId

その場合、VBA/イベントは必要ありません。

于 2009-08-05T12:37:31.850 に答える