DAO.Recordset,无法在 table 对象中进行 MoveNext
DAO.Recordset, unable to MoveNext in table object
目标:我正在编写一个循环来逐行遍历 table,评估字段是否彼此匹配,然后移至下一条记录(行)并重新评估。我最终想用它构建一个不断增长的字符串,但现在我无法让代码进入下一个循环。值表明代码仅评估第一条记录,并重复自身。
我尝试移动循环的 'ExDif.MoveNext' into/out 行,before/after End If,没有变化。
Option Compare Database
Option Explicit
Sub Export_Library_Compare_Process()
'Identify the variables
Dim Tang As DAO.Database
Dim ExDif As DAO.Recordset
Dim Field01a As DAO.Field
Dim Field01b As DAO.Field
Dim ID As DAO.Field
'Set the database and recordsets to database and tables
Set Tang = CurrentDb
Set ExDif = Tang.OpenRecordset("Staging_LOG_ExportDifferences")
Set Field01a = ExDif.Fields("a_Client Name")
Set Field01b = ExDif.Fields("b_Client Name")
Set ID = ExDif.Fields("ID")
'Start a series to look to see what matches
Do While Not ExDif.EOF
'Move to first row in table
ExDif.MoveFirst
'Field 01 - Client Name
If Field01a.Value <> Field01a.Value Then
MsgBox "Client Name does not match"
Else: MsgBox "Client Name matches"
'Move to next record (row) in table
ExDif.MoveNext
'End the Else - If
End If
'End Loop
Loop
我的工作有一些不寻常的安全限制,我将其归咎于它不起作用。但我查看了一些 Access Programming 开发板,发现 post [https://access-programmers.co.uk/forums/showthread.php?t=171138] 让我知道我可以使用 "Do While" 或 "Do Until" 进行循环。当我尝试将循环样式切换为 "Do Until" 时,效果很好。
直到ExDif.EOF
几个问题。
Set ExDif = Tang.OpenRecordset("Staging_LOG_ExportDifferences")
Set Field01a = ExDif.Fields("a_Client Name")
Set Field01b = ExDif.Fields("b_Client Name")
Set ID = ExDif.Fields("ID")
此代码在知道有记录之前开始读取记录集。如果记录集为空(即记录集既是 BOF
又是 EOF
),这些后续分配将失败并出现错误。这些赋值应该在 record-reader 循环内。
ExDif.MoveFirst
您已经第一条记录;在每次迭代中无条件地将光标移回第一条记录,这就是您的循环卡在第一条记录上的原因。删除此行。
If Field01a.Value <> Field01a.Value Then
此表达式的计算结果将始终为 False
,它是一个启发式常量表达式,可能是错字。是要比较 Field01a
和 Field01b
吗?
Else: MsgBox "Client Name matches"
'Move to next record (row) in table
ExDif.MoveNext
'End the Else - If
End If
这种缩进非常具有误导性,非常非常 error-prone。考虑:
Else
MsgBox "Client Name matches"
ExDif.MoveNext
End If
现在,.MoveNext
是有条件的(某种程度上 - 请参阅前面关于条件表达式的观点),这是一个问题:无论循环体中发生什么,你想在完成后出现在下一张唱片上。所以 .MoveNext
永远不应该是有条件的。
这应该可以解决问题:
Set exportDiffs = Tang.OpenRecordset("Staging_LOG_ExportDifferences")
Do Until exportDiffs.EOF
Dim clientNameA As String
clientNameA = exportDiffs.Fields("a_Client Name").Value
Dim clientNameB As String
clientNameB = exportDiffs.Fields("b_Client Name").Value
If clientNameA <> clientNameB Then
'client name mismatch
GoTo Skip
End If
Dim id As Long
id = exportDiffs.Fields("ID").Value
' do stuff...
Skip:
exportDiffs.MoveNext
Loop
目标:我正在编写一个循环来逐行遍历 table,评估字段是否彼此匹配,然后移至下一条记录(行)并重新评估。我最终想用它构建一个不断增长的字符串,但现在我无法让代码进入下一个循环。值表明代码仅评估第一条记录,并重复自身。
我尝试移动循环的 'ExDif.MoveNext' into/out 行,before/after End If,没有变化。
Option Compare Database
Option Explicit
Sub Export_Library_Compare_Process()
'Identify the variables
Dim Tang As DAO.Database
Dim ExDif As DAO.Recordset
Dim Field01a As DAO.Field
Dim Field01b As DAO.Field
Dim ID As DAO.Field
'Set the database and recordsets to database and tables
Set Tang = CurrentDb
Set ExDif = Tang.OpenRecordset("Staging_LOG_ExportDifferences")
Set Field01a = ExDif.Fields("a_Client Name")
Set Field01b = ExDif.Fields("b_Client Name")
Set ID = ExDif.Fields("ID")
'Start a series to look to see what matches
Do While Not ExDif.EOF
'Move to first row in table
ExDif.MoveFirst
'Field 01 - Client Name
If Field01a.Value <> Field01a.Value Then
MsgBox "Client Name does not match"
Else: MsgBox "Client Name matches"
'Move to next record (row) in table
ExDif.MoveNext
'End the Else - If
End If
'End Loop
Loop
我的工作有一些不寻常的安全限制,我将其归咎于它不起作用。但我查看了一些 Access Programming 开发板,发现 post [https://access-programmers.co.uk/forums/showthread.php?t=171138] 让我知道我可以使用 "Do While" 或 "Do Until" 进行循环。当我尝试将循环样式切换为 "Do Until" 时,效果很好。
直到ExDif.EOF
几个问题。
Set ExDif = Tang.OpenRecordset("Staging_LOG_ExportDifferences") Set Field01a = ExDif.Fields("a_Client Name") Set Field01b = ExDif.Fields("b_Client Name") Set ID = ExDif.Fields("ID")
此代码在知道有记录之前开始读取记录集。如果记录集为空(即记录集既是 BOF
又是 EOF
),这些后续分配将失败并出现错误。这些赋值应该在 record-reader 循环内。
ExDif.MoveFirst
您已经第一条记录;在每次迭代中无条件地将光标移回第一条记录,这就是您的循环卡在第一条记录上的原因。删除此行。
If Field01a.Value <> Field01a.Value Then
此表达式的计算结果将始终为 False
,它是一个启发式常量表达式,可能是错字。是要比较 Field01a
和 Field01b
吗?
Else: MsgBox "Client Name matches" 'Move to next record (row) in table ExDif.MoveNext 'End the Else - If End If
这种缩进非常具有误导性,非常非常 error-prone。考虑:
Else
MsgBox "Client Name matches"
ExDif.MoveNext
End If
现在,.MoveNext
是有条件的(某种程度上 - 请参阅前面关于条件表达式的观点),这是一个问题:无论循环体中发生什么,你想在完成后出现在下一张唱片上。所以 .MoveNext
永远不应该是有条件的。
这应该可以解决问题:
Set exportDiffs = Tang.OpenRecordset("Staging_LOG_ExportDifferences")
Do Until exportDiffs.EOF
Dim clientNameA As String
clientNameA = exportDiffs.Fields("a_Client Name").Value
Dim clientNameB As String
clientNameB = exportDiffs.Fields("b_Client Name").Value
If clientNameA <> clientNameB Then
'client name mismatch
GoTo Skip
End If
Dim id As Long
id = exportDiffs.Fields("ID").Value
' do stuff...
Skip:
exportDiffs.MoveNext
Loop