Как проверить наличие нуля в наборе записей VBA DAO? - PullRequest
14 голосов
/ 20 марта 2009

У меня есть дополнительное поле в базе данных, которое я извлекаю с помощью набора записей DAO. Мне нужно проверить, установлено ли поле, прежде чем объединять его с другими полями. Пока у меня есть следующий фрагмент кода, который я пробовал с Is и = (это явно неправильный синтаксис [[Is | =]]) безрезультатно. Похоже, что если я использую =, он не будет корректно сравниваться с Null, а если я использую Is, то он жалуется, что он не сравнивается с объектом.

While Not rs.EOF
    If rs.Fields("MiddleInitial") [[Is | =]] Null Then thisMiddleInitial = "" Else thisMiddleInitial = rs.Fields("MiddleInitial")
    If prettyName(myLastName, myFirstName, myMiddleInitial) = prettyName(rs.Fields("LastName"), rs.Fields("FirstName"), thisMiddleInitial) Then
        MsgBox "Yay!"
    End If
    rs.MoveNext
Wend

Если есть более простой способ сделать это, я полностью открыт для этого. prettyName принимает 3 строки в качестве параметров, и первоначально я просто пытался передать rs.Fields («MiddleName») напрямую, но он выдает значение Null. Я бы предпочел сделать что-то более прямое, как это, но это лучшее, что я мог придумать.

Ответы [ 6 ]

31 голосов
/ 20 марта 2009

Как насчет:

IsNull(rs.Fields("MiddleInitial").Value)

Вы также можете взглянуть на эту статью , в которой содержится некоторое объяснение значений Null в приложениях Access VBA и способах их обработки.

8 голосов
/ 20 марта 2009

Для примера, который вы показываете, Nz будет работать:

    thisMiddleInitial = Nz(rs!MiddleInitial,"")

Или просто объединить строку с пустой строкой:

    thisMiddleInitial = rs!MiddleInitial & ""
2 голосов
/ 20 марта 2009

Мне кажется, что на ваш вопрос ответил Рему, но мне кажется, что вы можете просто пытаться получить правильную конкатенацию полей имен. В этом случае вы можете использовать Mid () и распространение Null в VBA для получения результата.

Я не использую отдельные средние начальные поля, поэтому моя обычная формула объединения имен:

Mid(("12" + LastName) & (", " + FirstName), 3)

Строка "12" в начале будет отброшена, если LastName не равно NULL, и игнорируется, если она равна NULL, поскольку оператор конкатенации + распространяет значения NULL.

Чтобы расширить это, чтобы включить промежуточные элементы, выглядело бы так:

Mid(("12" + LastName) & (", " + FirstName) & (" " + MiddleInitial), 3)

Предполагая, что ваш UDF не выполняет какой-то сложной очистки псевдонимов / сокращений / и т. Д., Это может заменить его полностью, мне кажется.

0 голосов
/ 18 октября 2018

Я предпочитаю использовать приведенное ниже, чтобы учесть как нулевые, так и пустые строковые значения. Это хорошая проверка для использования у вас форм, собирающих значения от пользователей.

If Trim(rs.Fields("MiddleInitial") & "") = "" then
0 голосов
/ 29 июня 2018

Я думаю, что опция NoMatch может работать в этой ситуации:

Если rs.NoMatch = True, то

0 голосов
/ 12 декабря 2014

If rst.Fields("MiddleInitial").Value = "Null" Then

Это работает для меня. Я использую базу данных MS SQL.

...