String SSRS选择动态列

String SSRS选择动态列,string,dynamic,reporting-services,composite,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 Fields("FieldName").Value SELECT FCST_Sales_2014_Q4_with_SF FROM MyTable 我需要报表选择当前年度和季度,因此我使用

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

在数据库中,列的名称如下:

FCST_Sales_2014_Q4_with_SF
FCST_Sales_2015_Q1_with_SF
FCST_Sales_2015_Q2_with_SF
FCST_Sales_2015_Q3_with_SF
Fields("FieldName").Value
SELECT FCST_Sales_2014_Q4_with_SF 
FROM MyTable
我需要报表选择当前年度和季度,因此我使用
Now()
函数来合成我需要的表达式。例如:

=Year(Now())

结果是
2014
4
,这正是我需要的。如果我正在使用以下命令:

=("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\u Sales\u 2014\u Q4\u with\u SF
),但问题是,我不知何故无法使用
.Value
操作。如果我将
Sum()
.Value
添加到我创建的表达式中,我会得到错误消息,
.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)

这个问题有解决方案吗?

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

Fields!FieldName.Value
看起来像这样:

FCST_Sales_2014_Q4_with_SF
FCST_Sales_2015_Q1_with_SF
FCST_Sales_2015_Q2_with_SF
FCST_Sales_2015_Q3_with_SF
Fields("FieldName").Value
SELECT FCST_Sales_2014_Q4_with_SF 
FROM MyTable
因此,您可以使用非常大的表达式:

=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如下所示:

FCST_Sales_2014_Q4_with_SF
FCST_Sales_2015_Q1_with_SF
FCST_Sales_2015_Q2_with_SF
FCST_Sales_2015_Q3_with_SF
Fields("FieldName").Value
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


这非常有效,而且你的简化表达也非常有用。谢谢你的帮助。