【问题标题】:embedded IIF States in SSRSSSRS 中的嵌入式 IIF 状态
【发布时间】:2017-07-19 16:04:18
【问题描述】:

感谢您今天抽出宝贵时间帮助我。我正在尝试使用多个 if 语句来控制显示的值,具体取决于每个语句是否为真。所以现在我在下面有这个基本上是:

IIF(expression = NULL
, CompanyAddress
, IIF(Expression='TX'
    , IIF(BOOL=TRUE
        ,CompanyAddress
        , SWITCH(DEALER ADDRESSES))
    ,CompanyAddress)
)

我已经分别测试了每个单独的 IIF 语句,并且得到了我期望的结果。目前在第一个 IIF 语句中且 Expression = NULL 为 TRUE ,它只输出 #Error 而不是“Nothin” OR 在我的真实案例公司地址中。但如果 Expression = NULL 为 FAlSE,我会得到 companyAddress 或 Dealer 的正确输出。

=IIF(IsNothing(Fields!CoOppId.Value)
,("nothin")
, (IIF(Fields!Addr1.Value.Contains("TX")
    , IIF(Fields!UDFCustProv.Value = 1
        , Fields!Addr0.Value
        , Switch(
            Fields!UDFMake.Value.Contains("Chevy")
            , "Knapp Chevrolet" + chr(10) + "PO box " + chr(10) + "Houston TX 77210"
            , Fields!UDFMake.Value.contains("Ford") 
            , "Sterling McCall Ford" + chr(10) + "6445 Southwest Freeway" + chr(10) + "Houston TX 77074"
            , Fields!UDFMake.Value.contains("International")
            , "Pliler International" + chr(10) + "2016 S. Eastman Rd" + chr(10) + "Longview TX 75602"
            , Fields!UDFMake.Value.contains("Freightliner")
            , "Houston Freightliner, Inc" + chr(10) +"9550 North Loop East" + chr(10) + "Houston TX 77029"
            , Fields!UDFMake.Value.contains("RAM")
            , "Max Haik Dodge Chrysler Jeep" +chr(10)+ "11000 I-45 North Freeway" + chr(10) + "Houston TX 77037")),Fields!Addr0.Value)))

【问题讨论】:

  • 试试这个答案:StackOverflow
  • 该线程不走运
  • 您说主 IIF 上的 ELSE 条件可以正常工作,那么您能否将其简化为单个顶级 IIF 并告诉我们这是否仍会产生错误?实际上,我现在看到您说您确实已经确认这可行。下一个问题,如果 CoOppId 为 NULL,那么该行中的其他字段是否也为 NULL?
  • 不,我只是检查该字段是否为空,然后显示如果 CoOppId 为空则应填充的字段。
  • 我认为丹尼尔说得有道理。当 CoOppId 为 Null 时,您的表达式中至少还有一个字段为 null,这就是 #Error 的原因。尝试在 SQL 代码中为其余的字符串字段使用 COALESCE(fieldname,''),或在数字字段中使用 COALESCE(fieldname,0)

标签: vba reporting-services ssrs-2008 iif


【解决方案1】:

我同意@Daniel,当值为空时,Fields!UDFMake.Value.Contains 很可能会产生错误,因为 IIF 不会短路。 除了@Daniel 提到的好选项之外,您还可以用函数 InStr 替换 contains 方法:

... , Switch(
            InStr(Fields!UDFMake.Value,"Chevy") > 0
            , "Knapp Chevrolet" + chr(10) + "PO box " + chr(10) + "Houston TX 77210" ...

即使该字段的值为 Null,也不会产生错误。

【讨论】:

    【解决方案2】:

    我将猜测当您的 CoOppId 值为 NULL 时,该行中的其他字段也为 NULL。因为 IIF 不使用短路逻辑(它总是评估 IIF 的两侧),所以您尝试评估表达式“NULL.Contains("TX")”,这将生成 #ERROR,因为 NULL 不是字符串并且不能用 CONTAINS 函数操作。

    对于这种情况有两种解决方法,但是在我看来它们都不是特别好:

    1) 使用嵌套的 IIF 来确保没有任何东西是无效的。

    IIF(expression is NULL 
    , CompanyAddress
    , IIF(**IIF(expression is NULL, "", expression)** ='TX'
        , IIF(BOOL=TRUE
            ,CompanyAddress
            , SWITCH(DEALER ADDRESSES))
        ,CompanyAddress)
    )
    

    查看上面的伪代码并注意使用 CONTAINS 功能的表达式周围的附加嵌套 IIF。如果 CoOppId 不存在,它将用空字符串替换 CONTAINS 检查。尽管这个分支从来没有显示出它对于 null 场景的价值,但它至少现在是有效的。

    2) 创建一个真正为您执行短路逻辑的代码隐藏函数:

    Public Function CheckForNull(ByVal CoOppId As String, ByVal Addr1 as String, ByVal UDFMake As String, ... all fields)
    If String.IsNullOrEmpty(CoOppId) 
      Return "Nothing"
    Else
      Return *** do your calculation with your fields here
    End If
    End Function 
    

    您在报告中使用的内容如下:

    =Code.CheckForNull(values....)
    

    我只是粗略地列出了这样一个函数背后的代码是如何工作的,它显然不完整,但应该足以为您指明正确的方向。

    【讨论】:

    • 这似乎是我进一步研究的正确方向。我会尝试这个,然后用我的发现回复你
    • 自定义代码将是避免错误并让您的表达式更易于阅读的好方法
    • 感谢丹尼尔的出色回应。看来您的想法是正确的,但是 Jayvee 的答案是使我的方案可行的解决方案。如果我可以将两者都标记为答案,我会的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多