循环遍历数组并将数组发布到表

时间:2013-03-26 13:07:44

标签: ms-access access-vba

我是一名老Foxpro程序员,我使用数组来发布变量字段。

我想要做的是在我设计的新表中有15个日期字段 在我的查询中,我有个人记录,其中包含一个活动日期。

我想将每个Client_id的15个不同日期编译成一个包含15个日期的记录,但我似乎无法将表数据作为数组引用。
我尝试了几种不同的方法来定义数组,但似乎没有任何工作。

这是我的代码。在我的表格中,我有15个日期字段,分别为Mail_date1Mail_date2Mail_date3等 我首先尝试将其定义为数组,但不喜欢它;当我尝试在结果表rs2!mdate2 = memdate(intcounter)

中引用日期字段时,我的代码总是失败
  1. 如何将结果表输出字段作为数组引用?

  2. 我是否需要添加一大堆if语句来加载我的结果? 看起来像浪费....应该能够将它们作为数组加载。

  3. 我是一名新的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
    

2 个答案:

答案 0 :(得分: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而不是Date,因为Date数据类型不能是Null,并且由于您要从LEFT JOIN中提取数据,因此可能如果表Null中没有与Freight相对应的数据,则返回的值可能为Newfile

  • On Error GoTo Error_MayCauseAnError应该不在那里 仅使用On Error Goto来捕捉您根本无法处理的错误 在此使用它只会隐藏代码中的错误。通过一些适当的检查声明,您甚至不需要On Error Goto ...

  • 看起来你的第一个内部循环试图跳过一些记录 但是,当该循环中断时,可能是因为它达到了EOF,并且您从未在循环之后的代码中测试它。

  • 您永远不会测试intcounter是否超出了15个分配日期 你绝对相信你永远不会有超过15条记录吗?

  • 您没有说明您收到的错误消息。这可能有助于确定手头的问题类型。

答案 1 :(得分:2)

而不是

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

使用

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

DAO的!语法实际上只是较长rs.Fields("name")形式的简写。