【问题标题】:How to create report textbox aggregate expression in SQL Server Reporting?如何在 SQL Server 报表中创建报表文本框聚合表达式?
【发布时间】:2019-06-21 18:19:21
【问题描述】:

我有一个 SQL Server Reporting Services 报告,该报告有一个包含大量字段的表,然后是一个我想要显示总重量的文本框。现在,总重量由一个巨大的表达式决定:

=Sum(Round(Code.ConvertWgt(Switch(Parameters!OrderLength.Value = 
"T",Fields!TotalTheorWeight.Value
    ,Parameters!OrderLength.Value = "C",Fields!TotalCutWeight.Value
    ,Parameters!OrderLength.Value = "P",Fields!TotalPayWeight.Value
    ,Parameters!OrderLength.Value = 
"OD",Switch(Fields!Calculate_Weight_Using_ID.Value = 
"T",Fields!TotalTheorWeight.Value                                    
,Fields!Calculate_Weight_Using_ID.Value = "C",Fields!TotalCutWeight.Value
,Fields!Calculate_Weight_Using_ID.Value = "P",Fields!TotalPayWeight.Value
)
),Switch(Parameters!WeightUnit.Value = "orderdflt"
,Fields!Default_Weight.Value,True,Parameters!WeightUnit.Value))
,CInt(IIF(Parameters!WeightPrecision.Value="uomdefault",Fields!Weight_Precision.Value,Parameters!WeightPrecision.Value))))

但是,我在尝试预览报告时看到以下错误:

文本框“TotalWeight”的值表达式使用没有范围的聚合表达式。除非报表只包含一个数据集,否则在数据区域之外使用的所有聚合都需要范围。

所以我尝试通过将其更改为来修复它:

=Sum(IiF(Round(Code.ConvertWgt(Switch(Parameters!OrderLength.Value = 
"T",Fields!TotalTheorWeight.Value
    ,Parameters!OrderLength.Value = "C",Fields!TotalCutWeight.Value
    ,Parameters!OrderLength.Value = "P",Fields!TotalPayWeight.Value
,Parameters!OrderLength.Value = "OD",Switch(Fields!Calculate_Weight_Using_ID.Value = "T",Fields!TotalTheorWeight.Value
                                            ,Fields!Calculate_Weight_Using_ID.Value = "C",Fields!TotalCutWeight.Value
                                            ,Fields!Calculate_Weight_Using_ID.Value = "P",Fields!TotalPayWeight.Value
    )
),Switch(Parameters!WeightUnit.Value = "orderdflt"
    ,Fields!Default_Weight.Value,True,Parameters!WeightUnit.Value))
    ,CInt(IIF(Parameters!WeightPrecision.Value="uomdefault",Fields!Weight_Precision.Value,Parameters!WeightPrecision.Value)))), "Order")

Order 是我要使用的数据集的名称。但是,然后我看到了这个错误:

文本运行“TotalWeight.Paragraphs[0].TextRuns[0]”的值表达式包含错误:[BC30516] 重载解析失败,因为没有可访问的“IIf”接受此数量的参数。

我该如何解决这个问题?谢谢!

【问题讨论】:

    标签: sql sql-server reporting-services


    【解决方案1】:

    IIF 就像 Excel 中的 IF - 其中 =IF([some test],[if true do this],[if false do this]) ... 所以根据你所拥有的括号和逗号,你是基本上省略了 [if true do this] 和 [if false do this] 这就是为什么您会收到第二条关于没有足够参数的错误消息。

    至于原来的报错信息,可以不使用文本框,而是在一个一行一列的空白表中输入,并连接到数据集?

    或者您是否考虑过在数据集中设置该值 - 然后将该数据集设置为参数值,然后在您的文本框中使用该参数?

    您还可以深入阅读这篇文章:https://docs.microsoft.com/en-us/sql/reporting-services/report-design/built-in-collections-reportitems-collection-references-report-builder?view=sql-server-2017

    或者这个交叉发布的问题在这里 - 我认为这是你需要做的:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/7d1c401c-e31d-4bc5-8c89-8684e63d3cd3/rsfieldreference-the-value-expression-for-the-textbox-8216allcustomcpi18217-refers-to-the?forum=sqlreportingservices

    【讨论】:

    • 我什至没有考虑创建另一个表并将其连接到数据集。这就是我最终要做的,因为这是最简单的解决方案,谢谢!
    【解决方案2】:

    所以要解决每个表达式,第一个错误表明您需要为 SUM 聚合指定范围。这就像在最后一个括号内添加数据来自的数据集的名称一样简单。您需要添加..., "YourDatasetName"),以便以下内容可以正常工作——尽管如此复杂的表达式必然会有其他问题。例如,如果不知道参数需要什么,我们就不可能知道ConvertWgt 是否能正常工作。

    =Sum(Round(
        Code.ConvertWgt(
        Switch(
            Parameters!OrderLength.Value = "T", Fields!TotalTheorWeight.Value
            ,Parameters!OrderLength.Value = "C",Fields!TotalCutWeight.Value
            ,Parameters!OrderLength.Value = "P",Fields!TotalPayWeight.Value
            ,Parameters!OrderLength.Value = "OD",
                Switch( Fields!Calculate_Weight_Using_ID.Value = "T",Fields!TotalTheorWeight.Value                                    
                        ,Fields!Calculate_Weight_Using_ID.Value = "C",Fields!TotalCutWeight.Value
                        ,Fields!Calculate_Weight_Using_ID.Value = "P",Fields!TotalPayWeight.Value
                      )
              ),Switch(Parameters!WeightUnit.Value = "orderdflt"
        ,Fields!Default_Weight.Value,True,Parameters!WeightUnit.Value))
        ,CInt(IIF(Parameters!WeightPrecision.Value="uomdefault",
                  Fields!Weight_Precision.Value,
                  Parameters!WeightPrecision.Value)))
        , "Order")
    

    不幸的是,第二个表达式只是一团糟,我不确定它是否可以挽救。您正在尝试添加IIF,但没有条件语句可以根据我的判断进行评估。您基本上只是对一个巨大的 switch 语句进行四舍五入,没有真假部分,表达式也不能以提供真假结果的方式进行评估。

    我看到你已经接受了一个答案,但我已经完成了这个答案的一半,所以我会发布它,因为另一个答案没有解释如何修复这些表达式。

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多