Как инкапсулировать вызов IIF и ISNULL в Access 2010 VBA?

Я часто использую следующий шаблон выражения в моей базе данных Access 2010:

IIF(ISNULL(fieldName), Null, myFunction(fieldName))

Здесь myFunction — определяемая пользователем функция, которая преобразует значение fieldName в другой формат, если он существует.

Просто для небольшого сокращения ввода я попытался определить следующую функцию:

Function IifIsNull(p AS Variant, v AS Variant) AS Variant
    If IsNull(p) Then IifIsNull = p Else IifIsNull = v
End Function

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

IifIsNull(fieldName, myFunction(fieldName))

Но это не работает. Когда fieldName имеет значение Null, возвращаемое значение IifIsNull равно #Error, а IifIsNull даже не вызывается!

Можно ли вообще упростить данный шаблон кода с помощью определяемой пользователем функции или системной функции?

ОБНОВИТЬ:

Есть пара myFunction, и все эти функции в настоящее время строго типизированы, простой пример:

Function RemoveSpace(str AS String) AS String
    For i=1 to Len(str)
        If Mid(str,i,1) <> " " Then RemoveSpace = RemoveSpace + Mid(str,i,1)
    Next
End Function

person Earth Engine    schedule 13.07.2012    source источник


Ответы (2)


Я предполагаю, что myFunction(fieldName) выдает ошибку, когда fieldName равно нулю.

Когда вы вызываете IifIsNull(fieldName, myFunction(fieldName)), первое, что оценивается, это myFunction(fieldName). Поэтому, если fieldName равно нулю, вы получите сообщение об ошибке.

person Jean-François Corbett    schedule 13.07.2012
comment
Вы указываете причину #Error, а мой вопрос не о причине, а о решении. - person Earth Engine; 13.07.2012
comment
Мне кажется, один мудрый человек как-то сказал что-то вроде: пойми причину, а потом ищи решение. Или это было печенье с предсказанием... Во всяком случае, в этом есть смысл, не так ли. - person Jean-François Corbett; 14.07.2012

Почему бы просто не оценить имя поля в MyFunction?

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

=MyFunction(FieldName & "")

Function MyFunction(Fieldname) As Variant
   ''Depending on what your function does, it is may not necessary to check
   If FieldName<>"" Then
       MyFunction = FieldName & " was here"
   End If
End Function
person Fionnuala    schedule 13.07.2012
comment
Дело в том, что MyFunction является строго типизированным, скажем, Function MyFunction(fildName AS String) As String. А также есть пара таких функций, так что будет сложно изменить их все. - person Earth Engine; 13.07.2012
comment
В этом случае передайте строку. Добавлю заметку. - person Fionnuala; 13.07.2012