2013-09-16 65 views
2

我有一個數據透視查詢需要循環並添加到另一個臨時表。數據透視查詢是找到的不同狀態的總和。該狀態是早期,並導通時間。根據用戶選擇的內容,並非所有狀態都存在。所以,當我運行以下命令:檢查數據透視查詢中是否存在列

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?

回答

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 

順便說一句,你還可以找到的代碼,如果你對dbOpenDynaset此替換dbAppendOnly運行速度更快:

OpenRecordset("MyReceivingOnTimeDeliverySummary", dbOpenDynaset) 

我不確定有多少這種變化將產生影響。它不會改變你試圖完成的邏輯。也許任何速度的影響都是微不足道的。但它不會花費太多的費用。 :-)

+0

工作就像一個魅力。我嘗試了dbAppendOnly和dbOpenDynaset,並沒有注意到兩者之間的性能差異。 –

1

在這種情況下,您應該避免使用簡單操作的記錄集,如使用小的統一更改進行復制。但好消息是:這讓一切變得更加簡單!

首先,使用您已經創建查詢的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比記錄集要快得多。

+0

但是,如果在Pivot查詢中找不到Status,那麼此處的execute語句不會在MyReceivingOnTimeDeliverySummary表中創建該字段,這將是處理該問題的好方法。那麼下面的更新語句你有錯誤,因爲沒有這樣的字段。 –

+0

「根據用戶選擇的內容,並非所有狀態都存在。」哎呀,錯過了這句話,完全誤解了這個問題。那麼,你絕對可以修改查詢,以便在需要時添加空字段。我會考慮如何去做,因爲我仍然相信這是一個更好(更優雅)的解決方案。 – Ben

+0

Woot!修復它可以滿足您的需求。學到了一些東西。 (如果Access在DAO中有DEFAULT,會更容易。) – Ben