2013-03-26 63 views
0

我是一位老的Foxpro程序員,我使用數組來發布變量字段。循環訪問數組並將數組發送到表

我想要做的是我在我設計的新表中有15個日期字段。
在我的查詢中,我有單個記錄和一個活動日期。

我想將每個Client_id的15個不同日期編譯成一個有15個日期的記錄,但我似乎無法將表數據作爲一個數組引用。
我已經嘗試了幾種不同的方法來定義數組,但似乎沒有任何工作。

這是我的代碼,我有。在我的表中,我有15個日期字段名爲Mail_date1,Mail_date2,Mail_date3等。
我試着先將它定義爲一個數組,但不喜歡它;當我嘗試引用結果表中的日期字段我的代碼總是失敗rs2!mdate2 = memdate(intcounter)

  1. 我如何可以參考我的結果表輸出的字段作爲一個數組?

  2. 我是否必須將大量的if語句加載到結果中?
    看起來像一個垃圾....應該能夠加載他們作爲一個數組。

我是一個新的Access 2007 VBA程序員。

Dim db As DAO.Database 
Set db = CurrentDb 
Dim rs1 As DAO.Recordset 
Dim rs2 As DAO.Recordset 

Dim FinTotal, intcounter As Integer 
Dim FinMPU, FinVersion As String 
Dim mail_date(1 To 15) As Date 
Dim memdate(1 To 15) As Date 
Dim mdate2 As String 

Set rs1 = db.OpenRecordset(_ 
      "SELECT NewFile.MPU_ID, " & _ 
      "  NewFile.MAIL_DATE," & _ 
      "  NewFile.TOTAL, " & _ 
      "  Freight.Version " &_ 
      "FROM Freight " & _ 
      " LEFT JOIN NewFile ON Freight.[MPU ID] = NewFile.MPU_ID " & _ 
      "ORDER BY NewFile.MPU_ID, NewFile.MAIL_DATE") 

Set rs2 = db.OpenRecordset("Final") 

DoCmd.RunSQL "DELETE Final.* FROM Final;" 

intcounter = 1 
memdate(intcounter) = rs1!mail_date 
FinMPU = rs1!mpu_ID 
FinTotal = rs1!total 
FinVersion = rs1!Version 
rs1.MoveNext 

On Error GoTo Error_MayCauseAnError 

Do While Not rs1.EOF 
    Do While Not rs1.EOF _ 
      And memdate(intcounter) <> rs1!mail_date _ 
      And FinMPU = rs1!mpu_ID 
     intcounter = intcounter + 1 
     memdate(intcounter) = rs1!mail_date 
     FinTotal = FinTotal + rs1!total 
     FinVersion = rs1!Version 
     FinMPU = rs1!mpu_ID 
     rs1.MoveNext 
    Loop 

    If FinMPU <> rs1!mpu_ID Then 
     rs2.AddNew 
     mdate2 = "mail_date" & CStr(intcounter) 
     rs2!mdate2 = memdate(intcounter) 
     rs2!total = FinTotal 
     rs2!mpu_ID = FinMPU 
     rs2!Version = FinVersion 
     rs2.Update 

     FinTotal = rs1!total 
     FinVersion = rs1!Version 
     FinMPU = rs1!mpu_ID 
     intcounter = 1 
     memdate(intcounter) = rs1!mail_date 
    End If 
    rs1.MoveNext 
Loop 
+0

DAO是死路一條。不要再用它來代碼。 – Tomalak 2013-03-31 11:36:40

+1

@Tomalak Umm,no。對於使用ACE數據庫引擎的本機Access應用程序,「Microsoft Office ... Access數據庫引擎對象庫」(映射到VBA中的「DAO」)仍然是缺省和首選的訪問方法。 – 2013-03-31 12:00:27

+0

@Gord IIRC他們已經切換到ADO作爲Access 2007(?)的默認庫。 – Tomalak 2013-03-31 12:06:02

回答

2

第一,如果你希望和答案,你應該花更多的時間在正確格式化你的解釋,你的代碼...

現在,對於一些言論和可能的問題的答案:

  • 在打開記錄集中的表之前,您應該先記下DELETE FROM Final

  • 你應該更明確一些記錄,你要打開的類型:

    ' Open as Read-only ' 
    Set rs1 = db.OpenRecordSet("...", dbOpenSnapshot) 
    ' Open as Read/Write ' 
    Set rs1 = db.OpenRecordSet("...", dbOpenDynaset) 
    
  • 你應該Dim memdate(1 To 15) As Variant而不是DateDate數據類型不能Null,因爲你是從左側拉出數據JOIN如果在Newfile表中沒有Freight的相應數據,返回值可能爲Null

  • On Error GoTo Error_MayCauseAnError可能不應該在那裏。
    僅使用On Error Goto來發現你根本無法處理的錯誤。
    在這裏使用它只會隱藏你的代碼中的錯誤。用一些適當的檢查語句,你甚至不需要On Error Goto ...

  • 它看起來像你的第一個內部循環試圖跳過一些記錄。
    但是,當該循環中斷時,可能是因爲它達到了EOF,並且您從未在循環後面的代碼中測試該循環。

  • 您從不測試您的intcounter是否超出了15個分配日期。
    你確定你永遠不會有超過15條記錄嗎?

  • 你不會說你準確得到哪個錯誤信息。這可能有助於確定手頭的問題類型。

+1

你還應該包括'Dim FinTotal,intInteroun As Integer'將聲明'FinTotal'變體。假設它將是'整數'也是一個常見的錯誤。 – Tomalak 2013-03-31 12:03:57

+0

@Tomalak是的,還有更多... – 2013-03-31 12:18:42

+0

無論如何,堅實的建議。 +1 – Tomalak 2013-03-31 12:26:40

2

而不是

mdate2 = "mail_date" & CStr(intcounter) 
rs2!mdate2 = memdate(intcounter) 

使用

rs2.Fields("mail_date" & intcounter).Value = memdate(intcounter) 

!語法DAO真的僅適用於較長rs.Fields("name")形式的簡寫。

+0

這可能是問題。這是如此明顯,我現在才意識到它...... – 2013-03-31 12:20:10

+0

當然明確使用'.Value'仍然是完全可選的。 – Tomalak 2013-03-31 12:24:37