2010-04-30 2 views
3

пункт в наборе записей rstImportData ("Flat Size") является = NullПроблема оценки NULL в операторе IIF (Access)

При этом, учитывая следующее утверждение:

IIF(IsNull(rstImportData("Flat Size")), Null, cstr(rstImportData("Flat Size"))) 
Result: Throws error 94: Invalid use of Null 

Если я изменю заявление удаления преобразования типа на ложное сравнение:

IIF(IsNull(rstImportData("Flat Size")), Null, 0) 
Result: Null 

он возвращает Null, как это должно быть в первый раз. Похоже, что я не могу преобразовать тип в IIF, если переданное значение должно быть нулевым, даже если оно проходит тест IIF, оно все равно пытается оценить его как в истинном, так и в ложном ответе. Единственная причина, по которой я использую IIF, - это потому, что у меня есть 25-строчное сравнение для сравнения данных из Импорта с соответствующей записью в базе данных, чтобы увидеть, нужно ли добавлять до истории.

Любые мысли? То, как данные импортируются, будет иметь нулевые даты и где импорт электронной таблицы будет в строчном формате. Я должен преобразовать обе стороны в другую, чтобы сравнить значения правильно, но если какая-либо сторона имеет значение null, это исключение происходит :(

EDIT Пример того, почему я использую IIF (и принимая во внимание, используя универсальную функцию)

If master("one") <> import("one") Or _ 
    master("two") <> import("two") Or _ 
    master("date") <> import("date") Or _ //import("date") comes from a spreadsheet, it comes in as string, CAN be a null value 
    master("qty") <> import("qty") Or _ //import("qty") comes from spreadsheet, comes in as a string can CAN be null 
    master("etc") <> import("etc") Then 

....stuff.... 

End If 

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

Варианты я вижу,

  • Создание темп вары, чтобы сделать работу до сравнения и использования этих новых ВАР вместо набора записей
  • Создание объекта передать запись в к предварительно отформатированные и работать, хотя дополнительная работа обеспечила бы эту функциональность для каждого типа импорта, так как есть разные файлы со схожими полями.

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

+0

Как насчет: cstr (rstImportData ("Flat Size") и "") или просто: rstImportData ("Flat Size") & "" – Fionnuala

+0

IIf() не замыкается в коде, и вы предполагаете, что он делает , В любом случае, я не думаю, что кто-то должен использовать код IIf(). Его цель - предоставить функциональность If/Then/Else в выражениях вне контекста кода. –

+0

Вы уверены, что вам нужно принудить результат к строковому значению? Вы считали функцию Nz()? –

ответ

3

Простой способ изменить значение на строку помогает чрезвычайно. Хитрость в том, что обрезка строки, которая имеет NULL, получит пустую строку. Которая может работать, как если бы она не была нулевой базой данных.
Я часто использую форму:

CInt("0" & Trim(SomeVariant & " ")) 

Чтобы получить правильный номер без необходимости проходить через кучу шуток. Нуль - это ничтожество для этой проблемы.

+0

Интересный трюк, чтобы разобрать нуль в другой тип данных ... Я буду тестировать это с помощью '03 и '07, чтобы использовать перемещение вперед, но это довольно интересная идея, это то, что мне нравится учить :) thx для подсказки. Моя первоначальная попытка в IIF включала использование IIF с IsDate или IsNumeric, в случае, если он не соответствует этим параметрам после преобразования, тогда он остается равным нулю, иначе я могу вставить новое значение в базу данных. – Mohgeroth

+0

Это не сработало в ранних версиях .NET. Он отлично работает в более поздних версиях. – Dave

+0

Что делает .NET с этим вопросом? –

3

Поведение, которое вы описали, является стандартным способом IIf, работает под управлением VBA. Это часть того, что Access 2003 Помощь говорит об этом:

"IIf всегда оценивает как truepart и falsepart, даже если он возвращает только один из них Из-за этого, вы должны. наблюдать за нежелательные побочные эффекты. Например, если оценки falsepart результатов в делении на ноле, то возникает ошибка, даже если выражение является True."

Однако, если вы используете оператор IIf в запросе, короткое замыкание оценки после truepart когда выража является Истинной --- falsepart не вычисляется в этом случае К сожалению, эта информация вам не подходит ... если вы не можете включить запрос в свои сравнения.

Я не знаю другого способа избежать вашей ошибки с IIf. y добавление данных Excel в таблицу, структура которой соответствует структуре таблицы, с которой вы сравниваете, тем самым устраняя необходимость преобразования строк в то же время, когда вы выполняете сравнение.

+0

Учитывая это поведение, я могу сделать функцию, которая оценивает данный типа, который я бы прошел, чтобы устранить необходимость в IIF в этом огромном заявлении If, которое я поддерживаю ... Я получил выходные, чтобы придумать отличный ответ, определенно стену, которую я не ожидал попасть. – Mohgeroth

+0

Вы работаете с набором записей, так что это код, поэтому просто используйте простой старый блок If/Then/Else. –

Смежные вопросы