前一篇博文谈到使用exec dbo.spGetOrdersByCustomerIDs @CustomID获取数据集的服务器报表使用多值参数必须间接使用一个“内部”的String类型的报表参数作为该多值参数的级联参数将其(多值参数返回int类型的数组)拼接为String类型的ID串再作为存储过程参数处理。如上例的话,除了接受用户录入的多值参数@CustomID(整型),还需要一个用户看不见的“内部”参数@CustomIDs(String类型)作为其级联参数(如何设置该参数默认值属性参见上一篇博文)。
本文再提另一种情况,如果将数据集类型设置为存储过程的则可直接使用多值参数,如下图:
那么pd_Transfer需要的ID串参数就可以直接为多值参数了,如下图红框得参数:
另外,记录几点报表表达式设置容易混淆的常见问题:
1、SSRS的表达式中的变量类型与SQL Server数据类型不是相同的,如SQL中的bit类型对应到表达式中就成了布尔型,如这样的写法是错误的:=IIf(Fields!IsTemporary.Value = 1, Fields!PurchaseAmount.Value, 0);
必须修改为: =IIf(Fields!IsTemporary.Value, Fields!PurchaseAmount.Value, 0)
2、聚合函数必须保证获取的值的数据类型一致。
如这样的写法是错误的:=Sum( IIf(Fields!IsTemporary.Value, Fields!PurchaseAmount.Value, 0) );
必须修改为: =Sum( IIf(Fields!IsTemporary.Value, Fields!PurchaseAmount.Value, CDec(0)) )
因为Fileds!PurchaseAmount.Value的类型是Decimal类型。
3、SSRS服务器报表中用到的自定义程序集类型的静态方法或者实例方法除了引用自定义程序集外,还必须声明对应的实例名,换言之,即使没有用到实例方法也必须定义实例名,否则将报“错误号”。如下图:
4、用VS2008设计ReportingService报表服务器项目必须将自定义程序集部署到C:\Program Files\Microsoft Visual Studio 9\Common7\IDE\PrivateAssemblies中;使用VS2005开发则必须部署到C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PrivateAssemblies;否则编译报错。另外项目部署所在的服务器SQL Server相关路径也需要部署该dll:C:\Program Files\Microsoft SQL Server\MSSQL.3\Reporting Services\ReportServer\bin;
5、“筛选器”是报表参数的补充:如数据集是通过存储过程获取的,那报表参数通常对应存储过程参数。但针对返回的数据我们仍可以设置“筛选条件”,如Fields!ProductName.Value like "*" & Pramaters!ProductName.Value & "*",值得注意的一点是这里的通配符是“*”,不是SQL的“%”