Как использовать команды базы данных "Поиск" и результаты "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.
Трудно дать совет без дополнительной информации, но я попробую:

  1. Является table2 полностью пустой? Ваше описание выглядит так:

    table2
    1 -
    2 -
    3 -

    Если да, весь цикл, вероятно, никогда не выполняется вообще.

  2. Может Рекордсет table2 обновляться?
    Не все типы наборов записей поддерживают это, это зависит от того, как вы его создали. См. MSDN: Объект набора записей (DAO), в начале приведен список типов наборов записей.
    Если это не обновляется, вы должны получить сообщение об ошибке при вызове .Update,

Другие вопросы по тегам