我正在使用 Java Crystal Report SDK 使用存储过程或结果集生成报告。
这是我几个月前发表的一篇文章,试图使用 ResultSet 在报告中执行我的子报告的存储过程:Java Crystal Report SDK - Report & SubReport。在这种情况下,我知道为执行我的存储过程设置的参数,所以它很“容易”。
现在,我正在尝试做同样的事情(即执行一个存储过程以使用 ResultSet 在主报表中填充我的子报表),但是以一种通用的方式:我事先不知道参数,所以我必须设置每个都使用,ParameterFieldController
但一些来自主结果集,其他来自主报告中的静态变量等。
我意识到有很多事情要做,而且要涵盖很多案例,以便尽可能通用。当我没有为我的主报告设置数据源时,所有这些东西都会自动完成。
那么,是否有一种“简单”的方法可以在报表和子报表中混合 ResultSet 和存储过程?
或者有没有办法绕过该useDatasource()
方法?这当然决定为每个子报表使用主 ResultSet 而不是给定的存储过程。
(出于性能原因,我必须保留主报告的 ResultSet 而不是重新执行其存储过程)。
经过多次尝试,我回到了这里。不幸的是,我仍然想知道如何使用 ResultSet 将我的参数简单地传递给主报告的子报告......
这是我用于检索主报表和子报表以及子报表参数之间的链接的内容:
IStrings subreports = clientDoc.getSubreportController().getSubreportNames();
for (int i = 0; i < subreports.size(); i++) {
// Get subreport
String subreportName = subreports.getString(i);
ISubreportClientDocument subreport = clientDoc.getSubreportController().getSubreport(subreportName);
// Get datasource tables
databaseController = subreport.getDatabaseController();
tables = databaseController.getDatabase().getTables();
// Get links between subreport and main report
SubreportController subreportController = clientDoc.getSubreportController();
SubreportLinks links = subreportController.getSubreportLinks(subreportName);
Fields params = subreport.getDataDefController().getDataDefinition().getParameterFields();
// Set datasource
setTablesLocation(tables, databaseController, args);
}
问题是每个SubreportLink
fromlinks
都是半满或空的。
- 如果子报表参数链接到主报表存储过程的字段或公式字段,我在
SubreportLink
(usinggetMainReportFieldName()
) 中有此参数的名称,但没有来自子报表 (usinggetSubreportFieldName()
) 的链接参数的名称,而不是链接。 - 如果子报表参数链接到主报表的参数字段,则
SubreportLink
对象为空。
因此,在这种情况下设置子报表参数非常棘手,即使使用每个Subreportlink
+ParameterField
等的一半。
我做错了什么?我可以获得我的案件所需的所有信息吗?
setTablesLocation()
或者,当我在主报告上使用该方法(而不是使用 a 设置数据源)时,有没有办法自动设置我的 subreports 参数ResultSet
?