#Func! MS Access中的iif查询出错

时间:2015-07-09 09:47:07

标签: sql ms-access

以下是我的SQL查询:

IIf(remedy_src.Position Is Null,(mid(remedy_src.User,instr(1,remedy_src.User,"(")+1,instr(1,remedy_src.User,")")-2-instr(1,remedy_src.User,"(")+1)),remedy_src.Position) AS [Adjusted User]

重点是从字段中提取字符串。以下是值的示例:

n123456 (name lastname)

IIf函数返回括号中的内容:

name lastname

但是。有时源值看起来像这样:

n123456

没有括号,IIf返回丑陋的#Func!错误,该错误阻止在我的Excel文件中刷新查询(访问数据库的外部数据连接)。

我想以某种方式处理这个错误。如果存在错误,最好使IIf函数返回原始源值。

3 个答案:

答案 0 :(得分:1)

您可以尝试捕获错误:

IIF(IsERROR(IIf(remedy_src.Position Is Null,(mid(remedy_src.User,instr(1,remedy_src.User,"(")+1,instr(1,remedy_src.User,")")-2-instr(1,remedy_src.User,"(")+1)),remedy_src.Position)),
remedy_src.user,
IIf(remedy_src.Position Is Null,(mid(remedy_src.User,instr(1,remedy_src.User,"(")+1,instr(1,remedy_src.User,")")-2-instr(1,remedy_src.User,"(")+1)),remedy_src.Position)) 
AS [Adjusted User]

IIF(InStr("(",remedy_src.user)=0,
remedy_src.user,
IIF(IsERROR(IIf(remedy_src.Position Is Null,(mid(remedy_src.User,instr(1,remedy_src.User,"(")+1,instr(1,remedy_src.User,")")-2-instr(1,remedy_src.User,"(")+1)),remedy_src.Position))
As [Adjusted User]

答案 1 :(得分:0)

我认为这个SQL字符串变得有点过于复杂而无法轻松使用。我已经创建了一个VBA函数,它应该能够做同样的事情,但是易于理解且更容易使用。

守则:

 
Public Function ExtractString(str As String) As String

    Dim intFirstBracket As Integer
    Dim intSecondBracket As Integer
    Dim blnValidString As Boolean

    blnValidString = False

    If Nz(str, "") <> "" Then
        intFirstBracket = InStr(1, str, "(", vbTextCompare)
        If intFirstBracket > 0 Then
            intSecondBracket = InStr(1, str, ")", vbTextCompare)

            If intSecondBracket > 0 Then
                str = Mid(str, intFirstBracket + 1, intSecondBracket - (intFirstBracket + 1))
                blnValidString = True
            End If
        End If
    End If

    If blnValidString Then
        ExtractString= str
    Else
        ExtractString= "Default Value" 'Handle this how you want
    End If

End Function

所以你的SQL字符串就是:

IIf(remedy_src.Position Is Null, ExtractString(remedy_src.User) ,remedy_src.Position) AS [Adjusted User]

我测试的功能,SQL我还没有考虑到这一点。

答案 2 :(得分:0)

以下是我如何获得此问题的解决方案,完全重新编写代码以排除任何缺陷返回错误。

 IIf(remedy_src.Position Is Null,replace(replace(right(remedy_src.User,len(remedy_src.User)-instr(1,remedy_src.User,' ')),'(',''),')',''),remedy_src.Position) AS [Adjusted User]