Функция VBA RecordSet занимает слишком много времени для обновления записи с использованием RecordCount - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть одна таблица и один запрос.Оба имеют одно и то же поле данных, но имена таблицы COLUMN совпадают с именем ROW запроса.Я успешно обновляю таблицу из данных строки запроса, используя следующий код, но обновление занимает слишком много времени, поскольку в таблице содержится более 50 имен столбцов для каждого сотрудника -

Set rst1 = CurrentDb.OpenRecordset("SELECT * FROM tblPayRollDataTEMP")
Set rst2 = CurrentDb.OpenRecordset("SELECT * FROM qryEmpVerifySalary ")

Do Until rst1.EOF
    rst2.MoveFirst
    Do Until rst2.EOF                  
        For l = 0 To rst1.Fields.count - 1
            If rst1!EmpID = rst2!EmpID And rst1.Fields(l).Name = rst2!Head And rst1!PayBillID = TempVars!BillID Then
                With rst1
                    rst1.Edit
                    rst1.Fields(l).Value = rst2!Amount
                    rst1!totDeductions = DSum("Amount", "qryEmpVerifySalary", "[PayHeadType] = 'Deductions' AND [EmpID] = " & rst2!EmpID & "") + DLookup("NPS", "qryEmpPayEarning", "[EmpID] = " & rst2!EmpID & "")
                    rst1!totRecoveries = DSum("Amount", "qryEmpVerifySalary", "[PayHeadType] = 'Recoveries' AND [EmpID] = " & rst2!EmpID & "")
                    rst1!NetPayable = rst1!totEarnings - (Nz(rst1!totDeductions, 0) + Nz(rst1!totRecoveries, 0))
                    rst1.Update
                End With

            End If

        Next
        rst2.MoveNext
    Loop
    rst1.MoveNext
Loop

Set rst1 = Nothing
Set rst2 = Nothing

Как повысить производительностькод?

1 Ответ

0 голосов
/ 04 февраля 2019

Вы должны использовать запрос для обновления ваших записей.Это было бы самым быстрым решением.Обычно можно найти EmpID и перетащить поля в запрос на обновление или использовать выражение.Если вам нужно сгруппировать раньше или другие сложные вещи, разбейте его на несколько запросов (два или три)Это не имеет значения, потому что в конце вы просто выполняете один запрос на обновление.

Для вашего кода вы можете заменить функции агрегирования домена.DLookup(), DSum() и т. Д. ... это худшее для производительности.Простой оператор выбора выполняется намного быстрее, чем DLookup().Вот несколько замен:

Function DCount(Expression As String, Domain As String, Optional Criteria) As Variant

  Dim strSQL As String

  strSQL = "SELECT COUNT(" & Expression & ") FROM " & Domain

  'Other Replacements:
  'DLookup: strSQL = "SELECT " & Expression & " FROM " & Domain
  'DMax: strSQL = "SELECT MAX(" & Expression & ") FROM " & Domain
  'DMin: strSQL = "SELECT SUM(" & Expression & ") FROM " & Domain
  'DFirst: strSQL = "SELECT FIRST(" & Expression & ") FROM " & Domain
  'DLast: strSQL = "SELECT LAST(" & Expression & ") FROM " & Domain
  'DSum: strSQL = "SELECT SUM(" & Expression & ") FROM " & Domain
  'DAvg: strSQL = "SELECT AVG(" & Expression & ") FROM " & Domain

  If Not IsMissing(Criteria) Then strSQL = strSQL & " WHERE " & Criteria
  DCount = DBEngine(0)(0).OpenRecordset(strSQL, dbOpenForwardOnly)(0)

End Function
...