所以我有一个内置的系统,它设置了一些不同的标志,依此类推,但我要做的其中一件事就是获取一个临时表的内容并将其发送到另一个用于跟踪。我正在尝试使用insert into循环,但我根本无法弄清楚如何使其按预期工作。
Private Sub Form_Load()
DoCmd.SetWarnings False
DoCmd.OpenQuery ("qryDeleteEmail")
Dim db As Object
Dim rst As Object
Dim test As Object
Set db = Application.CurrentDb
Set rst = db.OpenRecordset("qryDate")
Set test = db.OpenRecordset("tblEmailTemp")
If Me.RecordsetClone.RecordCount = 0 Then
MsgBox ("No delinquent accounts. No email will be generated.")
Me.Refresh
DoCmd.Close acForm, "qryDate", acSaveNo
DoCmd.CancelEvent
Else
rst.MoveFirst
Do Until rst.EOF
rst.Edit
rst!NeedsEmail = 1
rst.Update
rst.MoveNext
Loop
'DoCmd.Requery
'rst.Close
DoCmd.RunMacro ("StagingTable")
test.MoveFirst
Do Until test.EOF
CurrentDb.Execute "Insert Into EmailTracking (Account, ExpirationDate)" & _
"Values ('" & AccountName & "', '" & ExpirationDate & "')"
test.MoveNext
Loop
test.Close
rst.MoveFirst
Do Until rst.EOF
rst.Edit
rst!EmailSent = 1
rst.Update
rst.MoveNext
Loop
'DoCmd.Requery
rst.Close
DoCmd.RunMacro ("Close")
'DoCmd.OpenQuery ("qryDeleteEmail")
End If
Exit Sub
End Sub
现在正在发生的事情是它正在复制登台表的第一条记录两次。例如,我有一个帐户名A和一个帐户名S,但它不是插入A的记录和S的记录,而是简单地插入A两次。
非常感谢任何帮助!
答案 0 :(得分:4)
创建并测试一个更简单的程序,该程序仅关注您尝试解决的问题。不幸的是,我不确定那个问题是什么。无论如何我会建议......
Public Sub TestLoopThruTable()
Dim db As DAO.database
Dim test As DAO.Recordset
Dim strInsert As String
DoCmd.SetWarnings True ' make sure SetWarnings is on
Set db = CurrentDb
Set test = db.OpenRecordset("tblEmailTemp")
Do While Not test.EOF
strInsert = "INSERT INTO EmailTracking (Account, ExpirationDate)" & vbCrLf & _
"VALUES ('" & AccountName & "', '" & ExpirationDate & "')"
Debug.Print strInsert
'db.Execute strInsert, dbFailOnError
test.MoveNext
Loop
test.Close
Set test = Nothing
Set db = Nothing
End Sub
请注意,在原始版本中,ExpirationDate)
和Values
之间没有空格。我使用换行符(vbCrLf
)而不是空格,但要么保持数据库引擎满意。
我确保SetWarnings
已开启。在您的代码中,您在开始时将其关闭但从未再次打开它。使用SetWarnings
关闭操作可以抑制您可以用来理解代码问题的重要信息。
当代码循环遍历记录集时,它只是创建一个INSERT
语句并为每一行显示它。您可以在立即窗口中查看输出(使用 Ctrl + g 键盘快捷键转到那里)。复制其中一个INSERT
语句并通过粘贴到新的Access查询的SQL视图进行测试。如果它在那里失败,找出你需要改变什么来满足db引擎。如果INSERT
成功,请尝试从代码中执行它们:通过从该行的开头删除单引号来启用db.Execute
行。
您编写VALUES
子句的方式显示[ExpirationDate]
是文本字段。但是,如果其数据类型实际上是日期/时间,则不要在要插入的值周围包含引号;使用#
日期分隔符而不是引号。
还要确保在代码模块的声明部分中包含Option Explicit
,如下所示:
Option Compare Database
Option Explicit
我提到了这一点,因为在此问题的早期版本中,您展示的是Option Compare
,而不是Option Explicit
。尝试在没有Option Explicit
的情况下对代码进行故障排除是浪费时间IMO。
答案 1 :(得分:1)
我不确定你在这里想要做什么;很难理解ErrorHandler
语句中Else
正在做什么(即使已注释)。
就循环记录集而言,我建议你阅读一些关于MS-Access中VBA编程基础的内容。您可以从阅读以下文章开始。它是关于VBA记录集的快速介绍,然后是VBA中最常见的错误。
http://allenbrowne.com/ser-29.html
http://www.techrepublic.com/blog/10things/10-mistakes-to-avoid-when-using-vba-recordset-objects/373
它可以帮助您改进代码。