我有一个名为products
的DAO.Recordest,我这样指定
Set products = db.OpenRecordset("Product URLs for Sitemap")
" Sitemap的产品网址"是一个查询,当运行时使用自定义VBA函数来填充其中一列。
我期待发生的是products
将在运行后包含查询的内容,如表格。然而,情况似乎并非如此。
一旦我拥有了products
记录集,我就会循环遍历它并从中创建一些XML
Do While Not products.EOF
Dim prdUrl As String
Dim prdUpdated As String
prdUrl = products!url
prdUpdated = products!updated
XML = XML & createUrlXml(products!url, products!updated)
products.MoveNext
Loop
然而,在此循环期间,它正在调用" Sitemap的产品网址"在每个循环中。这应该只需要执行一次 - 在我通过调用products
Set products = db.OpenRecordset("Product URLs for Sitemap")
时
为什么每次循环遍历products
记录集时都会调用此命令,如何停止此操作?
由于
答案 0 :(得分:2)
如何使用GetRows(),简单示例:
Dim queryText As String
queryText = "SELECT *, YourVBAFunc([URLs_SOURCE]) AS URL FROM Table1;"
Dim products As DAO.Recordset
Set products = CurrentDb.OpenRecordset(queryText)
products.MoveLast
products.MoveFirst
Dim data As Variant
data = products.GetRows(products.RecordCount)
' then all data are in the array 'data' ...
更多信息: http://bytes.com/topic/access/insights/789969-retrieving-data-dao-recordset-using-getrows
答案 1 :(得分:1)
我建议转换查询" Sitemap的产品网址"到表中,然后将强制执行当时所有行的函数。所以:
SELECT columnA, columnB ... yourFunction(args)
INTO newTableName
FROM tableSpecification
然后你的循环不会在每次迭代时执行该函数。
如果这些信息发生变化(正如我猜测的那样)在您完成之后将其丢弃,并在下次需要运行时重新创建。
如果数据需要是用户或会话特定的,您可以使用计时器为表名生成一个随机数:
newTableName = "myTableName" + replace(Timer,".","")
希望这个建议有所帮助。