Как использовать команды базы данных "Поиск" и результаты "NoMatch"?
Вот моя проблема:
Допустим, у меня есть эти таблицы:
Таблица 1
1 - "а"
2 - "б"
Таблица 2
1 -
2 -
3 -
Теперь я использую следующий код для сравнения таблиц:
table2.MoveFirst
Do While Not table2.EOF
table1.Seek "=", table2!field2
If table1.NoMatch Then
go do a lot of things to find that information
Else
table2.Edit
table2!Field2 = table1!field2
table2.update
End If
table2.MoveNext
Loop
Но линия
table2!Field2 = table1!field2
Не работает так хорошо. Я почти уверен, что делаю что-то не так, но у меня проблемы с поиском решения. Я даже не уверен, что я должен гуглить...
РЕДАКТИРОВАТЬ: Поле 2 проиндексировано в таблице 1, поэтому "поиск" работает.
3 ответа
Несколько заметок.
Допустим, вам нужны все записи из таблицы 2, где нет совпадений в поле с именем Field1:
sSQL = "SELECT Field1, FieldX FROM Table2 " _
& "LEFT JOIN Table1 " _
& "ON Table2.Field1 = Table1.Field1 " _
& "WHERE Table1.Field1 Is Null"
Конечно, вы могли бы построить запрос в окне конструктора запросов и переключаться между ними до тех пор, пока это не то, что вам нужно, а затем переключиться в представление SQL, чтобы получить правильную (ish) строку SQL.
Dim rs As DAO.Recordset
Set rs = CurrentDB.Openrecordset(sSQL)
''table2.MoveFirst
Do While Not rs.EOF ''table2.EOF
''You do not need no match, all these records are missing a match
'' table1.Seek "=", table2!field2
'' If table1.NoMatch Then
go do a lot of things to find that information
rs.MoveNext
Loop
''This can all be done with one update query
'' Else
'' table2.Edit
'' table2!Field2 = table1!field2
'' table2.update
'' End If
'' table2.MoveNext
'' Loop
sSQL = "UPDATE Table2 " _
& "INNER JOIN Table1 " _
& "SET table2.Field2 = table1.field2 "
CurrentDB.Execute sSQL dbFailOnerror
Пожалуйста, рассматривайте вышеизложенное как примечания, а не готовый код.
Если вы используете наборы записей DAO (как предлагает Кристиан), вы можете изменить строку
table2!Field2 = table1!field2
в
table2.Fields("Field2").value = table1.Fields("field2").value
Я предполагаю, что оба Field2 имеют текстовый тип данных.
Но линия
table2!Field2 = table1!field2
Не работает так хорошо
... не очень хорошее описание того, что идет не так.
Код останавливается / падает на этой строке?
Он работает без ошибок, но ничего не делает / что-то еще, чем вы ожидали?
Я полагаю, что вы используете наборы записей DAO.
Трудно дать совет без дополнительной информации, но я попробую:
Является
table2
полностью пустой? Ваше описание выглядит так:table2
1 -
2 -
3 -Если да, весь цикл, вероятно, никогда не выполняется вообще.
Может Рекордсет
table2
обновляться?
Не все типы наборов записей поддерживают это, это зависит от того, как вы его создали. См. MSDN: Объект набора записей (DAO), в начале приведен список типов наборов записей.
Если это не обновляется, вы должны получить сообщение об ошибке при вызове.Update
,