检查数据透视查询中是否存在列

时间:2013-09-16 15:42:50

标签: vba ms-access access-vba

我有一个数据透视查询,我需要循环并添加到另一个临时表。数据透视查询是找到的不同状态的总和。状态为 早期 延迟 准时 < / 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?

2 个答案:

答案 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)

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