使用数据集进行 Microsoft 报告
Posted
技术标签:
【中文标题】使用数据集进行 Microsoft 报告【英文标题】:Using Dataset for Microsoft reporting 【发布时间】:2016-11-29 14:25:43 【问题描述】:当我们使用 s-s-rS 创建报表时,我们可以使用数据集窗口中的查询框来创建自定义查询。但是在本地报表(.RDLC)中,当我们要创建报表时,我们应该为报表设置一个设计好的数据集。
问题是当我们有 100 个报告时,我们还应该有 100 个数据集。目前我们使用具有这些字段(F1、F2、F3、...、F100)的数据集,并且在将数据表绑定到报告之前,我们更改了名称数据表列。但它的可读性很低。
我想问有没有更好的方法来解决这个问题?
谢谢
【问题讨论】:
您是否接受在运行时创建动态数据集并将其设置为报告的数据源的解决方案? 我真的无法理解您的问题。您是否想知道您的 GUI 是否过于复杂,或者您的代码的可读性是否需要一些提升?无论哪种方式,它都会对一些代码 sn-ps 和/或屏幕截图有很大帮助。 【参考方案1】:我可能需要更多信息来提供帮助 - 你是否真的说你有带有标记为 F1、F2、F3 的字段的数据集......并且你现在需要绑定到实际列标记为(例如)Id、CustType、IsActive、...的表?
如果是这种情况,那么我建议使用将每个字段名别名为 F1、F2、...
可以通过脚本来创建这 100 个视图。该脚本可以通过运行一些智能 T-SQL 来生成,该 T-SQL 获取存储在 SQL Server 中的架构数据并输出所需的脚本。
查看How can I get column names from a table in SQL Server? 以开始使用。
您可能需要在 T-SQL 中使用游标来循环模式数据并输出脚本以创建视图。
最后,如果您需要以相同的方式修改 100 个 s-s-rS 报告中的每一个,请不要忘记每个都以报告定义语言 (XML) 存储,因此您可以编写一个读取每个 XML 的小实用程序文件并进行必要的更改。不要忘记在使用新实用程序之前先备份这些文件。
我希望所有这些都对您有所帮助,并且答案还不算太晚。
【讨论】:
谢谢,但我知道你所说的一切,我尝试了其中的一些。所以我寻找更好的解决方案【参考方案2】:最好的解决方案是将数据集分组。 您可以按他们的业务对数据集进行分组。例如 POLICY.xsd 、 USER.xsd 、 INVOICE.xsd 并将其他数据集添加到 xsd 文件中。
例如,在 Visual Studio 中,您会看到 10 个数据集文件。但是每个项目都有不同的数据表。
第二次升级是你会写出更好的t-sql。当您一般选择类似报告的列时,您将使用相同的数据表。
例如一个报告包括 5 列 A1,A2,A3,A4,A5 B报表包括6列A1,A2,A3,A4,A5,A6
对于这些报告,您将使用 B 报告的数据表
【讨论】:
【参考方案3】:我必须承认,到目前为止,我还没有完全理解所提供信息的问题,但这里有一个解决方案,它可能对您有很大的好处。
您是否尝试过从存储过程创建报告?通过这种方式,您的 RDLC 文件将不包含查询,而是查看存储过程中查询的定义,并在 RDLC 文件中创建数据集。然后在运行时,在代码中执行存储过程,并将返回的数据传递到 RDLC 文件中执行。
这样做的好处是查询被封装为数据库对象,您最终不会在项目中拥有一百万个数据集,并且您可以将查询与报告分离,所以如果您有相同报告的 6 个版本都使用相同的字段,但使用了不同的 WHERE 子句,例如,您可以只使用 1 个报告(并在运行时调用相关的存储过程)。
【讨论】:
【参考方案4】:虽然很高兴看到Minimal, Complete, and Verifiable example,但我也会试一试。
您可以做的是,在您的数据库中创建一个表,将您需要的数据与每个 DataSet
相关联并循环访问该数据。
即
ID......................字段...... ..........QueryType........SqlQuery/StoredProcedure
1.......产品ID,产品名称............0...... .............SP_GetBasicProductInfo
2......订单ID,产品ID............ .........................SP_GetOrderIdsByProduct
3.............客户ID,客户名称....1 .................... .......从 Northwind.Customers 中选择 CustomerID、CustomerName
等等
这样,您可以获得要映射到的字段和要执行的 sql 查询。
最后您可以将此信息传递给您的Data Access Layer
以执行查询并填写您需要的DataSet。
您可以尝试将所有内容都转换为字符串,甚至为每种类型使用分隔符,例如int|ProductID,string|ProductName
【讨论】:
以上是关于使用数据集进行 Microsoft 报告的主要内容,如果未能解决你的问题,请参考以下文章
发生错误:“生成报告时无法加载文件或程序集 'Microsoft.Reportviewer.Winforms Version=10.0.0.0”