我在Access 2016中使用VBA运行多个插入查询时遇到问题。
我将tbl_Routes
中的相关记录加载到DAO.Recordset
中,然后使用外部循环对其进行迭代,然后使用内部循环在tbl_Route_Times
中为来自以下位置的每条记录插入五条记录(每个工作日插入一条记录) tbl_Routes
。
所以,我想在代码运行时发生的事情是这样(从左到右):
(1, 1) (1, 2) (1, 3) (1, 4) (1, 5)
(2, 1) (2, 2) (2, 3) (2, 4) (2, 5)
(3, 1) (3, 2) (3, 3) (3, 4) (3, 5)
...等等,用于数百条记录。
机械上,循环工作正常。它按照您的期望逐步执行每一行,但实际上仅在每次(1, 1) (2, 1) (3, 1)
内循环的第一次迭代时才实际执行查询。
它将在第一次通过内循环时正确地插入记录,但是在随后的循环中它将不执行任何操作而命中.Execute
行-不插入任何记录,不引发任何错误,什么也没有。它只是达到目标并继续前进。一旦它运行了5次并中断了内循环,它将前进到rs
中的下一条记录,并再次执行相同的操作,在通过内循环的第一个记录上插入一条记录,但不再执行。
我已经尝试过使用DoCmd.RunSQL
并每次将值注入查询中,但是无论查询实际如何运行,结果都是相同的。
我仅用一个无意义的测试整数重新构建了所有内容,并且递增[rs
,然后运行插入查询有关,但是我目前还不知道该尝试什么。
我在这里想念什么?
这里是循环本身:
' For reference...
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb()
Set rs = db.OpenRecordset(strSqlSelect)
...
Do While Not rs.EOF
Do While dayCount < 6
With db.CreateQueryDef("", strSqlInsert)
.Parameters!pRid = rs!routeID
.Parameters!pDay = dayCount
.Parameters!pIn = rs!checkIn
.Parameters!pOut = rs!checkOut
.Execute
End With
dayCount = dayCount + 1
Loop
dayCount = 1
rs.MoveNext
Loop
正在讨论的SQL语句:
/* strSqlSelect (note: G_SCHOOLYEAR returns the value 2) */ SELECT tbl_Routes.routeID , tbl_Routes.checkInTime AS checkIn , tbl_Routes.checkOutTime AS checkOutFROM tbl_Routes WHERE ( ( ( tbl_Routes.schoolYearID ) =G_SCHOOLYEAR() ) ) ; /* strSqlInsert */ INSERT INTO tbl_Route_Times ( routeID , dayID , checkIn , checkOut ) VALUES ( [pRoute] , [pDay] , [pIn] , [pOut] ) ;
DAO用于此类任务-简单得多且way更快:
Public Function InsertDays()
Dim db As DAO.Database
Dim rsSource As DAO.Recordset
Dim rsTarget As DAO.Recordset
Dim dayCount As Integer
Set db = CurrentDb()
Set rsSource = db.OpenRecordset("tbl_Routes")
Set rsTarget = db.OpenRecordset("tbl_Route_Times")
Do While Not rsSource.EOF
Do While dayCount < 5
dayCount = dayCount + 1
With rsTarget
.AddNew
!Rid.Value = rsSource!routeID.Value
!Day.Value = dayCount
!In.Value = rsSource!CheckIn.Value
!Out.Value = rsSource!CheckOut.Value
.Update
End With
Loop
dayCount = 0
rsSource.MoveNext
Loop
rsTarget.Close
rsSource.Close
End Function