Давайте сделаем это понемногу. Я обновлю ответ, когда найду больше:
Сначала просто, избавьтесь от операторов iif в select следующим образом.
Заменить
SELECT DailyLeaveLedger.dldEmployeeID,
Sum(IIf([tolAnnualLeaveType]<>0,1,0)) AS ALDays,
Sum(IIf([tolPersonalLeaveType]<>0,1,0)) AS PLDays,
Sum(IIf([tolPublicHolidayType]<>0,1,0)) AS PHDays,
DailyLeaveLedger.dldPHID
с
SELECT DailyLeaveLedger.dldEmployeeID,
Sum([tolAnnualLeaveType] *-1) AS ALDays,
Sum([tolPersonalLeaveType] *-1) AS PLDays,
Sum([tolPublicHolidayType] *-1) AS PHDays,
DailyLeaveLedger.dldPHID
Это даст вам минимальное улучшение. После того, как я распутаю все остальное, я дам вам более действенные.
В остальном это такой безобразный беспорядок, я отказываюсь от попыток разгадать его. Однако позвольте мне дать вам несколько советов о том, что вам нужно делать в общем смысле вместо точного кода.
По сути, вам нужно вставить эту часть в объединения основного запроса вместо использования подзапроса.
(IIf([forms]![TransferTBRToPayrollForm]![chkOnlyPayLeave]=True,
Exists (SELECT DISTINCT InvoiceHeader.InvDate
FROM (InvoiceHeader
INNER JOIN ReceiptDetail ON InvoiceHeader.InvNumber = ReceiptDetail.RDInvNumber)
INNER JOIN [Work Codes] ON ReceiptDetail.RDWorkCodeID = [Work Codes].WorkCodeID
WHERE ((ReceiptDetail.RDPayRun=0 Or ReceiptDetail.RDPayRun Is Null) AND
(ReceiptDetail.RDRctToPayrollFlag=0) AND
([Work Codes].WorkCodePayrollAccount1<>0) AND
(InvoiceHeader.EmployeeID = DailyLeaveLedger.dldEmployeeID) AND
(DailyLeaveLedger.dldLeaveDate > DateAdd("ww", -InvoiceHeader.InvWeeksOfPay, InvoiceHeader.InvBeginDate)) AND
(DailyLeaveLedger.dldLeaveDate <= InvoiceHeader.InvBeginDate)))
,True))=True))
Имеет ли это смысл? Я, честно говоря, немного волнуюсь, что ты сможешь осуществить это, если не поймешь, почему он жалуется, что изменил это на сквозное. Он не имеет ничего общего с тем, что он вызывается из подотчета, и больше связан с тем, что вы используете функции VBA.