Доступ: Несоответствие типов данных с использованием логической функции в критериях запроса - PullRequest
2 голосов
/ 16 июня 2010

У меня есть функция VBA IsValidEmail(), которая возвращает логическое значение.У меня есть запрос, который вызывает эту функцию: Expr1: IsValidEmail([E-Mail]).Когда я запускаю запрос, он показывает -1 для True и 0 для False.Пока все хорошо.

Теперь я хочу отфильтровать запрос, чтобы показывать только недействительные электронные письма.Я использую Query Designer, поэтому я просто добавляю значение 0 в поле Criteria.Это дает мне ошибку «Несоответствие типов данных».Так же "0" (с кавычками) и False.Как мне указать критерии для булевой функции?

Ответы [ 2 ]

2 голосов
/ 16 июня 2010

Для логического столбца «0» обязательно выдаст ошибку «Несоответствие типов данных в выражении критерия». Однако 0 или False без кавычек должны работать. Я не понимаю, почему они генерируют ту же ошибку.

Посмотрите, можете ли вы создать рабочий запрос, отредактировав SQL напрямую. Создайте новый запрос, переключитесь на SQL View и вставьте этот оператор (заменив YourTableName именем вашей таблицы).

SELECT IsValidEmail([E-Mail]) AS valid_email
FROM YourTableName
WHERE IsValidEmail([E-Mail]) = False;

Будет ли ваш запрос выполняться без ошибок при его создании?

Обновление : так как этот запрос также выдал ту же ошибку, все, что я могу предложить, это попробовать без каких-либо критериев.

SELECT
    IsValidEmail([E-Mail]) AS valid_email,
    TypeName(IsValidEmail([E-Mail])) AS type_of_valid_email
FROM YourTableName;

Однако, это похоже на длинный выстрел, потому что вы уже сказали нам, что ваша более ранняя попытка без критериев прошла без ошибок. Если это не идентифицирует проблему, рассмотрите ли вы по электронной почте мне урезанную копию вашей базы данных? Дайте мне знать, если вы заинтересованы, и я дам вам мой адрес электронной почты.

1 голос
/ 16 июня 2010

Ошибка была вызвана тем, что некоторые записи в моей таблице имеют нулевой E-Mail. В моем запросе есть условие where для исключения пустых записей электронной почты, поэтому, когда я запустил его без условия в столбце IsValidEmail, моя функция была вызвана только для записей с ненулевой электронной почтой. Однако, когда я добавил условие в IsValidEmail, оно вызывало функцию для каждой записи, и ошибка возникла из-за попытки передать значение null функции, ожидающей строку.

Еще один способ сказать все это:

SELECT [E-Mail],
       IsValidEmail([E-Mail]) <--Executed only for rows matching where clause
FROM   Contacts
WHERE  IsValidEmail([E-Mail]) = False; <-- Gets executed for all rows

Изменение выражения моего запроса с IsValidEmail([E-Mail]) на IsValidEmail(nz([E-Mail],"X")) решило проблему.

...