Использование возможностей SQL
Простой
SELECT QC_LoopTestTable.ID
,QC_LoopTestTable.IMY_Up1
,QC_LoopTestTable.IMY_Up2
,IIf(IsNull([QC_LoopTestTable_1].[id]), "No", "Yes") AS Linked_IMY
FROM QC_LoopTestTable
LEFT JOIN QC_LoopTestTable AS QC_LoopTestTable_1
ON QC_LoopTestTable.IMY_Up2 = QC_LoopTestTable_1.IMY_Up1;
делает то же самое намного чище и быстрее (если индексируются IMY_Up1 и IMY_Up2).
Получает QC_LoopTestTable
и присоединяется к себе (QC_LoopTestTable AS QC_LoopTestTable_1
), где Up2 = Up1.Если совпадений нет, результат для скопированной таблицы (QC_LoopTestTable_1
) равен NULL
, что можно проверить (Iif-Statement), и используется соответствующее значение (Да / Нет).
Если выЕсли вы хотите сохранить результат Linked_IMY
, вы можете использовать аналогичный запрос UPDATE
, но это не рекомендуется (обычно не храните вычисленные значения), потому что если вы редактируете запись, ее нужно обновить снова.
Если IMY_Up2
совпадает с несколькими IMY_Up1
, эти значения будут двойными, но при необходимости их можно отфильтровать
Почему ваш код не работает
Ваш код обновляетсятолько первая строка, потому что вы не указываете набор записей, чтобы перейти к следующей записи.
Тогда вам понадобятся два независимых набора записей, чтобы зациклить один в другом (Внутренний цикл с rs.MoveFirst также установит внешний цикл rs на первую строку (та же переменная rs
))
После того, как вы нашли совпадение, внутренний цикл должен выйти (Exit Do
), или следующий ряд вызовет возврат, поскольку он закончится Else
частичной записью в Linked_IMY
.
Избегайте Integer
переменных, поскольку они выходят из строя выше 2 ^ 15-1, используйте Long
вместо.
Используйте Do Until rs.eof ... Loop
для циклического перебора наборов записей.
Код может быть таким (просто для демонстрации, не использовать ):
Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Set db = CurrentDb
Set rs1 = db.OpenRecordset("QC_LoopTestTable")
Set rs2 = db.OpenRecordset("QC_LoopTestTable")
Do Until rs1.eof
Do Until rs2.eof
If rs1.Fields("IMY_Up2").Value = rs2.Fields("IMY_Up1").Value Then
...
End If
rs2.MoveNext
Loop
rs1.MoveNext
rs2.MoveFirst
Loop