DAO.Recordset, невозможно MoveNext в табличном объекте - PullRequest
0 голосов
/ 21 мая 2019

Цель: я пишу цикл для просмотра таблицы, строка за строкой, оценки соответствия полей друг другу, затем перехода к следующей записи (строке) и повторной оценки.В конце концов я хочу построить из этого постоянно растущую строку, но сейчас я не могу заставить Код перейти к следующему циклу.Значения показывают, что код оценивает только первую запись и повторяется.

Я пытался переместить строку 'ExDif.MoveNext' в / из цикла, до / после 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

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Несколько проблем.

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), эти последующие назначения завершатся с ошибкой. Эти назначения должны быть внутри цикла чтения-записи.

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

Этот отступ очень вводит в заблуждение и очень, очень подвержен ошибкам. Рассмотрим:

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
0 голосов
/ 21 мая 2019

У меня есть некоторые необычные ограничения безопасности на моей работе, которые я обвиняю в том, что это не работает.Но я посмотрел на некоторые доски по программированию доступа и нашел этот пост [https://access -programmers.co.uk / forums / showthread.php? T = 171138] , который дает мне знать, что я могу сделать цикл, используялибо «Делай Пока», либо «Делай До».Когда я попытался переключить стиль цикла на «До», он работал нормально.

До тех пор, пока ExDif.EOF

...