我正在使用Java Crystal Report SDK使用存储过程或ResultSet生成报告。
这是我几个月前发布的一篇文章,尝试使用ResultSet在报表中执行子报表的存储过程:Java Crystal Report SDK - Report & SubReport。 在这种情况下,我知道为执行我的存储过程而设置的参数,因此它很“简单”。
现在,我正在尝试做同样的事情(即执行存储过程以使用ResultSet在主报表中填充我的子报表)但是以一般方式:我事先不知道参数,所以我必须使用ParameterFieldController
设置每一个,但有些来自主ResultSet,有些来自主报告中的静态变量等。
我意识到要做很多工作和许多案例,以尽可能通用。当我没有为主报告设置数据源时,所有这些都是自动完成的。
那么,是否有一种“简单”的方法将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
的每个links
都是半满或空的。
SubreportLink
(使用getMainReportFieldName()
)中具有此参数的名称,但不具有来自子报表的链接参数(使用getSubreportFieldName()
)而不是链接的值。SubreportLink
对象为空。因此,在这种情况下设置子报表参数非常棘手,即使使用每个Subreportlink
+ ParameterField
等的半部分也是如此。
我做错了什么?我可以获得案件中所需的所有信息吗?
或者,当我在主报表上使用setTablesLocation()
方法(而不是使用ResultSet
设置数据源)时,有没有办法自动设置我的子报表参数?
答案 0 :(得分:1)
好的,所以在经过大量尝试之后,我发现只有在主存储过程返回数据时,才能生成包含子报表的报表。
我使用RowsetCursor
。
这是我的代码:
// Here I create a metadata using ONLY the database fields
IRowsetMetaData metadata = new RowsetMetaData();
Fields fields = clientDoc.getDataDefController().getDataDefinition().getResultFields();
Fields dbFields = new Fields();
for (int i = 0; i < fields.size(); i++) {
IField field = fields.getField(i);
if (field instanceof DBField) {
dbFields.add(field);
}
}
metadata.setDataFields(dbFields);
// Create the rowset cursor with metadata
RowsetCursor cursor = clientDoc.getRowsetController().createCursor(null, metadata);
FetchedRecordCountInfo countInfo = new FetchedRecordCountInfo();
countInfo.setIsTotalRecordsKnown(false);
// Here, if I don't have any record from my stored procedure, I don't execute the report process
int nbRecords = cursor.getRecordCount(countInfo);
if (nbRecords <= 0) {
throw new ReportingException("UnmanagedJob - Report generation : No data, generation aborted.");
}
我希望这会有助于Crystal Report java SDK的其他“丢失用户”:)