我是一名老Foxpro程序员,我使用数组来发布变量字段。
我想要做的是在我设计的新表中有15个日期字段 在我的查询中,我有个人记录,其中包含一个活动日期。
我想将每个Client_id
的15个不同日期编译成一个包含15个日期的记录,但我似乎无法将表数据作为数组引用。
我尝试了几种不同的方法来定义数组,但似乎没有任何工作。
这是我的代码。在我的表格中,我有15个日期字段,分别为Mail_date1
,Mail_date2
,Mail_date3
等
我首先尝试将其定义为数组,但不喜欢它;当我尝试在结果表rs2!mdate2 = memdate(intcounter)
如何将结果表输出字段作为数组引用?
我是否需要添加一大堆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 :(得分: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")
形式的简写。