Как использовать DAO.Recordset для обновления таблицы с помощью необновляемого запроса - PullRequest
1 голос
/ 09 июля 2020

У меня довольно маленькая таблица tblFunding с 20 записями. Я хочу обновить его поле Payment, используя результаты необновляемого запроса ie:

"SELECT UserName, Sum([Payment]) As Payment FROM tblFundingMain WHERE (((DateDiff('m',[PaymentDate],DateSerial(Year(Date()),1,1))) Between -7 And 4)) GROUP BY UserName") Я знаю, что хранить этот тип данных - плохая практика, но пользователь хочет взглянуть в данных время от времени, так как таблица привязана к форме для его удобства. Мы разработали метод, который использует DAO, который работает, но оставляет пустые значения для записей, которые не существуют для поля UserName в обновленной таблице, т.е. tblFunding. Мы бы предпочли, чтобы значение было 0 в случае, если поля не совпадают. Код запускается до открытия формы, что означает, что таблица обновляется перед запуском формы. Есть ли способ вежливо выполнить sh эту задачу? Пожалуйста, просмотрите код ниже и посоветуйте, где сможете. Спасибо!

Private Sub btnGlance_Click()

Dim rs1 As DAO.Recordset
Dim rs 2 As DAO.Recordset

Set rs1 = CurrentDb.OpenRecordset("SELECT UserName, Sum([Payment]) As Payment FROM tblFundingMain WHERE (((DateDiff('m',[PaymentDate],DateSerial(Year(Date()),1,1))) Between -7 And 4)) GROUP BY UserName")
Set rs2 = CurrentDb.OpenRecordset("SELECT * FROM tblFunding")

rs1.MoveFirst
  Do Until rs1.EOF
  rs2.MoveFirst
  Do Until rs2.EOF
  If rs1.Fields("UserName") = rs2.Fields("UserName") Then
  rs2.Edit
  rs2.Fields("Payment").Value = rs1.Fields("Payment").Value
  rs2.Update
  End If      
  rs2.MoveNext
  Loop
rs1.MoveNext
Loop

rs1.Close
rs2.Close
Set rs1 = Nothing
Set rs2 = Nothing

Docmd.OpenForm "frmUserGlance"

End Sub

1 Ответ

1 голос
/ 09 июля 2020

Можно запустить действие UPDATE, чтобы изменить все Null на 0.

CurrentDb.Execute "UPDATE tblFunding SET Payment = 0 WHERE Payment Is Null"

Или рассмотрите альтернативный код:

rs2.MoveFirst
Do Until rs2.EOF
  rs1.MoveFirst
  rs1.FindFirst "UserName = '" & rs2!UserName & "'"
  rs2.Edit
  If Not rs1.NoMatch Then
     rs2!Payment =  rs1!Payment
  Else
     rs2!Payment = 0
  End If
  rs2.Update
  rs2.MoveNext
Loop

Альтернатива для отображения этих сводных данных в форме можно использовать агрегатную функцию домена. Создайте объект запроса, который выполняет суммирование, затем используйте DLookup для получения определенного значения. Или используйте DSum () непосредственно в исходной таблице.

Можно было бы избежать всего этого кода, если бы вы просто выполняли запрос, который СОЕДИНЯЕТ отфильтрованный запрос суммирования к набору данных всех имен пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...