DAO.Recordset,无法在表对象中移动MoveNext

时间:2019-05-21 19:20:44

标签: vba dao access recordset

目标:我正在编写一个循环,逐行遍历一个表,评估字段是否彼此匹配,然后移至下一条记录(行)并重新评估。我最终希望从中构建一个不断增长的字符串,但是现在我无法使代码进入下一个循环。值表明该代码仅求值第一条记录,然后重复自身。

我已经尝试过将“ ExDif.MoveNext”行移至循环中/从循环结束之前/之后移出循环。

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

2 个答案:

答案 0 :(得分:0)

我在工作中遇到一些不寻常的安全限制,我将此归咎于此工作不起作用。但是我看了一些Access编程板,发现了这篇帖子[https://access-programmers.co.uk/forums/showthread.php?t=171138],让我知道我可以使用“ Do While”或“ Do Before”进行循环。当我尝试将循环样式切换为“直到”时,效果很好。

执行直到ExDif.EOF

答案 1 :(得分:0)

几个问题。

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")

此代码在知道有记录之前开始读取记录集。如果记录集为空(即记录集同时为BOFEOF),则这些后续分配将因错误而失败。这些分配应该在记录读取器循环内。

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

此缩进非常容易引起误解,而且非常容易出错。考虑:

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