我需要一些指导来提高代码效率。
Public Function fncVAT(ByVal tDate As Variant) As Variant
Dim strTDate As String
Dim strVat As String
tDate = CDate(Nz(tDate, 0))
strTDate = "#" & Format(tDate, "mm/dd/yyyy") & "#"
strVat = "SELECT TOP 1 Vat FROM Tax WHERE [EffectiveDate] <= " & strTDate & _
" ORDER BY [EffectiveDate] DESC;"
With CurrentDb.OpenRecordset(strVat)
If Not (.BOF And .EOF) Then
fncVAT = .Fields(0)
End If
End With
End Function
它的作用是根据产品购买日期应用税表中的当前增值税税率。例如
税表
+----------------+-------+
| Effective Date | VAT |
+----------------+-------+
| 9/1/17 | 15% |
| 2/1/19 | 12.5% |
+----------------+-------+
购买查询
+----------+---------+------+---------+---------------------------------------------------+
| PurDate | Product | Cost | Vatable | Vat |
+----------+---------+------+---------+---------------------------------------------------+
| 1/31/18 | Cola | 70 | 0 | IIf([Vatable]=0,[Cost]*fncVAT([PurDate]),0)=10.50 |
| 12/28/19 | Cola | 70 | 0 | IIf([Vatable]=0,[Cost]*fncVAT([PurDate]),0)=8.75 |
| 5/3/20 | Flour | 15 | -1 | IIf([Vatable]=0,[Cost]*fncVAT([PurDate]),0)=0 |
+----------+---------+------+---------+---------------------------------------------------+
我已经将范围缩小到这个函数。该查询大约有 900 条记录,加载需要一段时间。有什么建议么?提前致谢。
最佳答案
最简单的方法可能是修改您的增值税表,这样它不仅有每个纳税期的开始日期,还有结束日期。
当然,当前汇率的 EndDate 还不知道,所以使用 max value那里。
+-----------+------------+-------+
| StartDate | EndDate | VAT |
+-----------+------------+-------+
| 9/1/17 | 2/1/19 | 15% |
| 2/1/19 | 12/31/9999 | 12.5% |
+-----------+------------+-------+
然后您可以在查询中找到带有 JOIN 的匹配增值税行,并且不再需要该函数:
SELECT p.PurDate, p.Product, p.Cost, p.Vatable,
IIf(p.Vatable=0, p.Cost * v.VAT, 0) AS Vat
FROM tblProduct p INNER JOIN Vat v
ON (p.PurDate >= v.StartDate) AND (p.PurDate < v.EndDate)
这应该能提供不错的性能。
注意连接中的 >= 和 <(不是 <=)。
因此,要填充 EndDate 列,您只需将 StartDate block 向上复制一行即可。
关于vba - MS Access VBA 函数导致查询加载缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63894804/