【问题标题】:SSRS Report Builder IIF error with aggregateSSRS Report Builder IIF 聚合错误
【发布时间】:2016-03-05 19:19:46
【问题描述】:

我在尝试创建变量聚合时遇到了 IIF 错误。

我使用的是报表生成器 3.0

我有一份报告,用户可以在其中确定报告中包含哪些字段。这些字段作为多值参数传递。我使用来自不同数据集的查找来确定其在报表中的位置,并使用相同的顺序数据集来确定该字段是否为数字(这意味着我想根据行级分组对值求和)。标题使用相同的字段查找拉入,效果很好。在行级别,我尝试返回基于行分组的字段值的总和,或者如果不是数字,则返回该值。根据类似的帖子,我了解到对真假部分都进行了处理。我试图通过嵌套另一个IIF 来抵消这个错误。如果我删除 sum 函数,数据将返回非数字数据。但是,如果我包含 sum 函数,数字数据处理得很好,但非数字数据返回 #error。

我错过了什么?

这是我在下面引用的数据的定义:

lookupvalue:返回用户在存储过程中按照预定义的顺序选择的字段。

Fieldisnumeric:表示选择的字段是否为数字,0为假,1为真

Fielditem:tablix 中被引用的字段项

dtsselectedfields:我正在查找字段的列顺序和数值属性的数据集。

数字 1 表示用户选择的字段变量计数中的第一个位置。附加字段根据参数中传递的字段计数隐藏,并且是递增的(例如 1-n)。

=iif(Lookup(1, Fields!LookupValue.Value,
Fields!FieldIsNumeric.Value,"dtsSelectedFields")=0,
Fields(Lookup(1, Fields!LookupValue.Value, Fields!FieldItem.Value,
"dtsSelectedFields")).Value,iif(Lookup(1, Fields!LookupValue.Value,
Fields!FieldIsNumeric.Value, "dtsSelectedFields")=0,
Fields!MV.Value,sum(Fields(Lookup(1, Fields!LookupValue.Value,
Fields!FieldItem.Value, "dtsSelectedFields")).Value)))

****编辑 2015 年 12 月 1 日**** 为了更清楚起见,我提供了更多详细信息。下面是“dtsSelectedFields”数据集。

FieldItem_____LookupValue____FieldIsNumeric
项目1描述__________1__________________0
项目1总计__________2__________________1
项目 2 描述__________3__________________0
项目2总计__________4__________________1

假设我有一列数据,该列将首先查找 LookupValue 为 1。这将返回 FieldItem,“Item1Desc”。因为这个字段不是数字,所以我想返回 Item1Desc 的值。但是,假设我的第一个选择实际上是“Item1Total”,并且我不想返回非数字 Item1Desc 字段。在这种情况下,因为 'FieldIsNumeric'=1 表示一个数字字段,所以我想取这个字段的总和。

  1. 是否可以在 IIF 语句中仅在 IIF 语句的一部分上嵌套聚合函数? IE。是真还是假?
  2. 如果是这样,我做错了什么?

tablix 的一个例子:

示例布局
第 1 列标题____________第 2 列标题___________第 3 列标题
第 1 列数据______________第 2 列数据_____________第 3 列数据

样本数据

产品___________________原产国_________________单位
ABC 信封________________________中国______________________15
LMN 数据包_____________________印度_______________________30

在上面的示例中,用户选择了 3 列,“产品”、“原产国”和“单位”。如果我在存储过程中按它们分组,还有其他可用字段会导致多行(例如收购价格)。根据查找,我将列描述作为标题返回。行级详细信息如上所述(例如,返回产品名称和原产国,但总结单位)。

【问题讨论】:

  • 谢谢亚历杭德罗。表达式为Fields(Lookup(1, Fields!LookupValue.Value, Fields!FieldItem.Value, "dtsSelectedFields")).Value,这实际上返回了查找中指定的字段。例如,如果我要查找 LookupValue=1,我会返回字段项,例如 'Product' 或类似的东西。因此查找将返回“产品”,而真正的语句将返回 Fields("Product").Value。这确实返回了我正在寻找的值。问题是当我想返回数字列的总和或返回非数字列的值时。
  • @alejandrozuleta Fields() 是一个集合 - 您可以使用语法 Fields!Fieldname 或 Fields("Fieldname") 引用集合中的项目,因此第 6 行中的代码在这方面是正确的.
  • 是的,@RyanL 指出了这一点。
  • @RyanL,将Fields!MV.Value 添加到问题数据集中,以便重现您的问题。此外,预期的 tablix 的屏幕截图也会很有用,因为可能有不同的方法可以获得您需要的结果。
  • 感谢@alejandrozuleta,我已经更新了我的帖子以包含数据样本。请原谅没有截取数据,因为报告中的所有内容都将显示为<<expr>>

标签: reporting-services report ssrs-tablix reportbuilder


【解决方案1】:

作为上述问题的解决方法,我找到了一个(丑陋的?)解决方案。

如上所述,用户可以选择任意数量的列,并且报表根据存储过程根据预定义的顺序将它们组织在列中。 (例如,如果选择了这两列,则产品描述将出现在单位总和之前,但产品 ID 可能会出现在产品描述之前,但前提是选择了 ID。)

对于用户可以选择的每个可能的列数,我在报告中添加了两列(即每个字段两列)。

前两列将引用lookupvalue=1。然后我将详细信息中每个字段的表达式设置为 1) 值的总和,或 2) 值本身。然后,我将列可见性设置为“FieldIsNumeric”列的结果。因此,当 FieldIsNumeric=0 时,将对非数字数据返回错误的求和数字列将被隐藏,并且将显示引用查找值 =1 的非数字列,反之亦然。

不用说,额外的列将遵循相同的逻辑,以两组为一组,每列引用顺序查找值(例如,第 3 列和第 4 列将引用 lookupvalue=2,第 5 和第 6 列将引用 lookupvalue=3,依此类推。匹配对中的每一列将根据 FieldIsNumeric 在同一查找数据集中的返回值显示或隐藏。

我绝对愿意接受建议,但我认为我会将其发布为解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多