Как использовать команды базы данных «Поиск» и результаты «NoMatch»? - PullRequest
0 голосов
/ 21 ноября 2011

Вот моя проблема:

Допустим, у меня есть эти таблицы:

table1

1 - "а"

2 - "b"

table2

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 ]

1 голос
/ 21 ноября 2011

Несколько заметок.

Допустим, вам нужны все записи из таблицы 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

Пожалуйста, относитесь к вышесказанному как к примечаниям, а не к готовому коду.

1 голос
/ 22 ноября 2011

Если вы используете наборы записей DAO (как предлагает Кристиан), вы можете изменить строку

table2!Field2 = table1!field2

на

table2.Fields("Field2").value = table1.Fields("field2").value

Я предполагаю, что оба поля Field2 имеют текстовые данныетип.

1 голос
/ 21 ноября 2011

Но строка table2!Field2 = table1!field2 работает не так хорошо

... не является хорошим описанием того, что идет не так.

Останавливает ли код /сбой в этой строке?
Работает ли он без ошибок, но ничего не делает / делает что-то еще, чем вы ожидали?

Полагаю, вы используете наборы записей DAO.
Трудно дать совет безинформация, но я попробую:

  1. Является ли table2 полностью пустым?Ваше описание выглядит следующим образом:

    table2<br> 1 -<br> 2 -<br> 3 -

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

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

...