0

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

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

我想将每个日期的 15 个不同日期编译为Client_id一个包含 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
4

2 回答 2

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数据类型 cannot be ,并且由于您从 LEFT JOIN 中提取数据,因此如果表中没有相应的数据Null,则返回的值可能是。NullFreightNewfile

  • On Error GoTo Error_MayCauseAnError可能不应该在那里。
    仅用于On Error Goto捕获您根本无法处理的错误。
    在这里使用它只会隐藏代码中的错误。使用一些适当的检查语句,您甚至不需要On Error Goto...

  • 看起来您的第一个内部循环正在尝试跳过一些记录。
    但是,当该循环中断时,可能是因为它达到了 EOF,而您永远不会在循环后面的代码中测试它。

  • 你永远不会测试你是否intcounter超过了 15 个分配的日期。
    您绝对确定您的记录永远不会超过 15 条吗?

  • 你没有说你得到了哪个错误信息。这可能有助于确定手头的问题类型。

于 2013-03-31T12:00:04.417 回答
2

代替

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

利用

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

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

于 2013-03-31T12:02:35.453 回答