3

我有一个需要循环并添加到另一个临时表的数据透视查询。透视查询是找到的不同状态的总和。状态为EarlyLateOn-Time。根据用户选择的内容,并非所有状态都存在。所以当我运行以下命令时:

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?

4

2 回答 2

2

在这种情况下,您应该避免使用简单操作的记录集,例如使用小的、统一的更改进行复制。但好消息:这让一切变得更容易!

首先,使用您已经拥有的 SQL 语句来创建查询。

Dim db As Database
Set db= CurrentDb
db.CreateQueryDef "qry1", "sqltext"

然后,从该查询中,SELECT 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 比记录集快得多。

于 2013-09-16T16:28:25.377 回答
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)

我不确定这种变化会产生多大的影响。它不会改变你想要完成的逻辑。也许任何速度影响都是微不足道的。但这不会花费你太多钱。:-)

于 2013-09-16T16:24:15.787 回答