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,它是一个启发式常量表达式,可能是错字。是要比较 Field01aField01b 吗?

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