SSRS选择动态列

时间:2014-10-08 17:54:15

标签: string dynamic reporting-services composite

对于我的报告,我需要选择从动态数据库中访问哪些列。更准确:

在数据库中,列的命名方式如下:

FCST_Sales_2014_Q4_with_SF
FCST_Sales_2015_Q1_with_SF
FCST_Sales_2015_Q2_with_SF
FCST_Sales_2015_Q3_with_SF

我需要报告来选择当前年份和季度,因此我使用Now()函数来合成我需要的表达式。例如:

=Year(Now())

=Switch(
  Month(Now()) = 1, 1, 
  Month(Now()) = 2, 1, 
  Month(Now()) = 3, 1, 
  Month(Now()) = 4, 2,
  Month(Now()) = 5, 2,
  Month(Now()) = 6, 2, 
  Month(Now()) = 7, 3, 
  Month(Now()) = 8, 3,
  Month(Now()) = 9, 3,
  Month(Now()) = 10, 4,
  Month(Now()) = 11, 4,
  Month(Now()) = 12, 4)

结果为20144,这正是我所需要的。如果我使用以下内容:

=("Fields!FCST_Sales_" + CStr(Year(Now())) + "_Q" + CStr(Switch(Month(Now()) = 1, 1, Month(Now()) = 2,1,Month(Now()) = 3,1,Month(Now()) = 4, 2, Month(Now()) = 5,2,Month(Now()) = 6,2,Month(Now()) = 7,3,Month(Now()) = 8,3,Month(Now()) = 9,3,Month(Now()) = 10, 4, Month(Now()) = 11,4,Month(Now()) = 12,4)) + "_with_SF")

我得到了我需要的字符串(FCST_Sales_2014_Q4_with_SF),但问题是,我不知道我不能使用.Value操作。如果我将Sum().Value添加到我创建的表达式中,我会收到错误消息,.Value不是String的成员。我使用的表达是:

=Sum(("Fields!FCST_Sales_" + CStr(Year(Now())) + "_Q" + CStr(Switch(Month(Now()) = 1,1, Month(Now()) = 2,1,Month(Now()) = 3,1,Month(Now()) = 4,2, Month(Now()) = 5,2,Month(Now()) = 6,2,Month(Now()) = 7,3,Month(Now()) = 8,3,Month(Now()) = 9,3,Month(Now()) = 10, 4, Month(Now()) = 11,4,Month(Now()) = 12,4)) + "_with_SF").Value)

这个问题有解决方案吗?

1 个答案:

答案 0 :(得分:3)

你不能像这样构建一个字段 - 你实际上在构建一个字符串。你想要做的是建立要在Fields集合中查找的字段的名称,而不是这样:

Fields!FieldName.Value

看起来像这样:

Fields("FieldName").Value

所以你可以使用你非常大的表达式:

=Sum(Fields("FCST_Sales_" + CStr(Year(Now())) + "_Q" + CStr(Switch(Month(Now()) = 1, 1, Month(Now()) = 2, 1, Month(Now()) = 3, 1, Month(Now()) = 4,2, Month(Now()) = 5, 2,Month(Now()) = 6, 2, Month(Now()) = 7, 3, Month(Now()) = 8, 3, Month(Now()) = 9, 3, Month(Now()) = 10, 4, Month(Now()) = 11, 4, Month(Now()) = 12, 4)) + "_with_SF").Value)

您还可以简化该表达式。要获得该季度,您只需要这样做:

(Month(Today) + 2) \ 3

所以你的表达归结为

=Sum(Fields("FCST_Sales_" + CStr(Year(Today)) + "_Q" + CStr((Month(Today) + 2) \ 3) + "_with_SF").Value)

替代方法:使用SQL动态构建字段名称

使用返回一致字段名称的动态SQL字符串还有另一种可能更简单的方法。例如,如果您的SQL看起来像这样:

SELECT FCST_Sales_2014_Q4_with_SF 
FROM MyTable

您可以将其转换为解析为SQL语句的字符串表达式。右键单击数据集,选择“数据集属性”,然后单击查询旁边的表达式编辑器fx按钮。现在我们可以从字符串构建SQL语句,如此

="SELECT FCST_Sales_" + CStr(Year(Today)) + "_Q" + CStr((Month(Today) + 2) \ 3) + "_with_SF AS FCST_Sales "
&"FROM MyTable"

现在,您正在SQL查询中动态构建字段名称,并在数据集中将其返回别名为FCST_Sales,以便您可以在整个报表中轻松使用已知字段值,从而使计算更加轻松:

=Fields!FCST_Sales.Value

=SUM(Fields!FCST_Sales.Value)
相关问题