插入查询不在循环内执行

问题描述 投票:0回答:1

我在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] ) ;

vba ms-access access-vba ms-access-2016
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.