Расчетное управление на подчиненной основе на основе текущей записи - PullRequest
3 голосов
/ 22 мая 2009

У меня есть следующее: Основная форма «клиент» из таблицы «клиент». подчиненная форма "счета-фактуры" с полями "дата счета-фактуры", "сумма счета-фактуры", "идентификатор клиента" и т. д. из таблицы "счета-фактуры"

всякий раз, когда пользователь щелкает или переходит к записи в форме «Счета-фактуры». Я хотел бы, чтобы элемент управления "итого пока" вычислял сумму "суммы счетов" вплоть до даты "щелчка" или выбора текущей записи.

т.е. для клиента Microsoft со счетами: 1) 2 мая 09, 150 долларов 2) 3 мая 09, 200 долларов 3) 4 мая, $ 500

Если пользователь нажимает на запись 2), «итого пока» должно показывать $ 350 Если пользователь нажимает на запись 1), «итого пока» должно показать $ 150 Если пользователь нажимает на запись 3), «итого пока» должно показывать $ 850

В настоящее время я использую функцию DSum для события «OnCurrent» в подчиненной форме «invoices», чтобы установить значение «итого за все время». Этот метод медленный, неэффективный?

Любой другой более простой, чистый, элегантный, быстрый и эффективный метод, использующий функции доступа ms?

Я хочу, чтобы подчиненная форма "счета-фактуры" показывала ВСЕ счета для этого клиента, независимо от того, какая запись нажата.

Ответы [ 2 ]

1 голос
/ 22 мая 2009

Если метод 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

Другой способ - создать SQL-запрос с помощью sum (), но для этого потребуется еще больше кода и снова попадет в базу данных.

0 голосов
/ 05 августа 2009

Вы можете поместить скрытый элемент управления с D-суммой в нижний колонтитул подчиненной формы, а затем ссылаться на него из основной формы. У Dsum будет третий аргумент, например "InvoiceId <= " & InvoiceId

В этом случае не требуется никакого VBA / события.

...