我有一个数据透视查询,我需要循环并添加到另一个临时表。数据透视查询是找到的不同状态的总和。状态为 早期 , 延迟 , 准时 < / strong>即可。根据用户选择的内容,并非所有状态都存在。所以当我运行以下内容时:
Set rs1 = CurrentDb.OpenRecordset("MyReceivingOnTimeDeliverySummary", dbOpenDynaset)
Set rs = CurrentDb.OpenRecordset("TRANSFORM Sum(recvqty) AS SumOfrecvqty " & _
"SELECT supname, Sum(recvqty) AS TotalReceivedQty " & _
"FROM MyReceivingOnTimeDeliveryDetail " & _
"GROUP BY supname " & _
"PIVOT Status", dbOpenDynaset)
If (rs.RecordCount <> 0) Then
rs.MoveFirst
Do While rs.EOF <> True
rs1.AddNew
rs1.Fields("[supname]").value = rs.Fields("[supname]").value
rs1.Fields("[TotalReceivedQty]").value = rs.Fields("[TotalReceivedQty]").value
rs1.Fields("[Early]").value = rs.Fields("[Early]").value
rs1.Fields("[Late]").value = rs.Fields("[Late]").value
rs1.Fields("[OnTime]").value = rs.Fields("[On-Time]").value
rs1.Update
rs.MoveNext
Loop
End If
如果其中一个状态不在查询结果中,那么我将得到一个错误,我将该值添加到MyReceivingOnTimeDeliverySummary
表。
如何测试每种状态,如果不存在则添加为0?
答案 0 :(得分:2)
在这种情况下,您应该避免使用简单操作的记录集,例如使用小的,统一的更改进行复制。但是好消息:这会让一切变得更轻松!
首先,使用已有的SQL语句创建查询。
Dim db As Database
Set db= CurrentDb
db.CreateQueryDef "qry1", "sqltext"
然后,从该查询中,选择INTO(或INSERT INTO)您的汇总表。
db.Execute "SELECT * INTO MyReceivingOnTimeDeliverySummary FROM qry1"
然后你可以添加字段,如果它们不在那里。
On Error Resume Next: db.Execute "ALTER TABLE MyReceivingOnTimeDeliverySummary ADD COLUMN Early NUMBER": Err.Clear: On Error GoTo 0
On Error Resume Next: db.Execute "ALTER TABLE MyReceivingOnTimeDeliverySummary ADD COLUMN Late NUMBER": Err.Clear: On Error GoTo 0
On Error Resume Next: db.Execute "ALTER TABLE MyReceivingOnTimeDeliverySummary ADD COLUMN OnTime NUMBER": Err.Clear: On Error GoTo 0
最后,将空值固定为零。
db.Execute "UPDATE [MyReceivingOnTimeDeliverySummary] SET [Early] = Nz([Early],0)"
db.Execute "UPDATE [MyReceivingOnTimeDeliverySummary] SET [Late] = Nz([Late],0)"
db.Execute "UPDATE [MyReceivingOnTimeDeliverySummary] SET [OnTime] = Nz([OnTime],0)"
为什么这样?根据我的经验,SQL比记录集快得多。
答案 1 :(得分:1)
对于透视查询中可能不存在的任何MyReceivingOnTimeDeliverySummary
字段,请将默认值设置为零。
然后循环遍历透视查询记录集中的字段,并将这些字段的值添加到另一个记录集中的匹配字段。
Dim fld As DAO.Field
If Not (rs.BOF And rs.EOF) Then
rs.MoveFirst
Do While Not rs.EOF
rs1.AddNew
For Each fld In rs.Fields
rs1.Fields(fld.Name).value = rs.Fields(fld.Name).value
Next
rs1.Update
rs.MoveNext
Loop
End If
顺便提一下,如果您在此dbAppendOnly
替换dbOpenDynaset
,您可能会发现代码的运行速度更快:
OpenRecordset("MyReceivingOnTimeDeliverySummary", dbOpenDynaset)
我不确定这种变化会产生多大的影响。它并没有改变你想要完成的逻辑。也许任何速度影响都是微不足道的。但要找出它不会花费太多。 : - )