我正在尝试在SSRS中创建报告。该报告为其数据调用存储过程。我想在表格中显示数据。 但事实是,存储过程的结果不时有所不同,因为每个客户都有自己的“模板”。这意味着客户A的结果可能是:
AccountNumber |的客户id
1234567890 0987654321
1579086421 1234565465
...................... ....................
对于客户B可能是:
客户名称 |的地址
客户B Teststreet 1
客户测试测试街2
...................... ....................
有50种不同的列可供选择。列的顺序也是可编辑的。我的存储过程负责这一点。我唯一想要的是将storedprocedure 1:1的结果集放在我的报告中(标题+正文)。你们知道怎么做吗?
如果那不可能,那么有没有C#解决方案?即在C#中创建报表对象,调整设置等。
由于
答案 0 :(得分:4)
您可以根据存储过程返回的数据集动态创建SSRS报告。报告格式(RDL)已记录在案,其格式为XML格式。因此,您可以使用System.XML命名空间生成RDL。备用(和不支持)方式是引用RDL对象模型程序集(Microsoft.ReportingServices.RdlObjectModel) - 您可以在SSRS 2008服务器计算机上找到程序集并将其复制到本地计算机上。它提供了一个读取/生成RDL的对象模型。
我采用的方法是基于数据表动态生成RDL(作为XML),然后使用Web服务API在SSRS服务器上发布RDL。
答案 1 :(得分:1)
一种解决方案可能是修改您的SP,以便返回的数据类似于:
ColNameA DataA ColNameB DataB
AccountNumber, 1234567890, CustomerID, 948477586
AccountNumber, 5466584426, CustomerID, 458852244
然后,在SSRS中拖出一张表。在ColNameA上创建一个组。在该组行中,将Field ColNameA放在第一列中,将ColNameB放在第二列中。
在Details Row中,将DataA放在第一列中,将DataB放在第二列中,它应如下所示:
我使用的示例查询是:
select 'AccountNumber' as ColNameA, 1234567890 as DataA, 'CustomerID' as ColNameB, 0987654321 as DataB UNION
select 'AccountNumber' as ColNameA, 5546488393 as DataA, 'CustomerID' as ColNameB, 4747599393 as DataB
获取列的名称(AccountNumber,CustomerID或CustomerName,CustomerAddress)将是关键。你可以通过以下方式获得它们:
select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'my_table_name'
答案 2 :(得分:0)
您可以使用报表设计器提供的Rdlobjectmodel创建和更改报表。
您可以在项目中引用Microsoft.ReportingServices.Designer.Controls,但其中还包括所有依赖项(即20多个程序集),也可以在项目根目录级别的单独文件夹中复制以下DLL组,并用它来引用DLL
Microsoft.ReportingServices.QueryDesigners
Microsoft.ReportingServices.Designer.Controls
Microsoft.ReportingServices.RdlObjectModel
Microsoft.ReportingServices.ReportDesign.Common
Microsoft.ReportingServices.RichText
Microsoft.ReportingServices.RPLObjectModel
private Report LoadReportTemplate()
{
const string docPath = "template.rdl";//path for your template report
using (var fs = new FileStream(docPath, FileMode.Open))
{
var report = Report.Load(fs);
return report;
}
}
关注Documentation的链接