java - Crystal Report - 使用 ResultSet 的主报表中的子报表

标签 java crystal-reports report datasource subreport

我使用 Java Crystal Report SDK 通过存储过程或结果集生成报告。

这是我几个月前发表的一篇文章,尝试使用 ResultSet 在报表中执行我的子报表的存储过程:Java Crystal Report SDK - Report & SubReport . 在这种情况下,我知道为执行我的存储过程设置的参数,所以它很“容易”。

现在,我正在尝试做同样的事情(即执行一个存储过程,使用 ResultSet 在主报表中填充我的子报表)但是以一种通用的方式:我事先不知道参数,所以我必须使用 ParameterFieldController 设置每一个,但有些来自主 ResultSet,其他来自主报告中的静态变量等。

我意识到要尽可能通用,还有很多工作要做,需要涵盖很多案例。当我没有为我的主报告设置数据源时,所有这些东西都会自动完成。

那么,是否有一种“简单”的方法可以在报表和子报表中混合使用 ResultSet 和存储过程?

或者有没有办法绕过 useDatasource() 方法?这当然决定为每个子报表使用主结果集而不是给定的存储过程。

(出于性能原因,我必须保留主报表的结果集并且不重新执行其存储过程)。

经过多次尝试,我又回来了。不幸的是,我仍然想知道如何使用 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);  
 } 

问题是 links 中的每个 SubreportLink 都是半填充或空的。

  • 如果子报表参数链接到主报表存储过程的字段或公式字段,我在 SubreportLink 中有这个参数的名称(使用 getMainReportFieldName()) 但不是子报表中链接参数的名称(使用 getSubreportFieldName())而不是链接的值。
  • 如果子报表参数链接到主报表的参数字段,则 SubreportLink 对象为空。

因此,在这种情况下设置子报表参数非常棘手,即使使用每个 Subreportlink 的一半 + ParameterField 等。

我做错了什么?我可以获得案件所需的所有信息吗?

或者,有没有一种方法可以自动设置子报表参数,就像我在主报表上使用 setTablesLocation() 方法时所做的那样(而不是使用 ResultSet< 设置数据源)/) ?

最佳答案

好吧好吧,经过大量无果而终的尝试后,我发现只有在主存储过程返回数据时才能生成包含子报告的报告。 我使用 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 的其他“迷路用户”:)

关于java - Crystal Report - 使用 ResultSet 的主报表中的子报表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18311093/

相关文章:

java - 如果不能与查询和实体管理器一起使用,@MappedSuperclass 的意义何在?

azure - 标准网站 (Windows Azure) 上的 Crystal Reports

C# - 从对象模板化打印

sql - 如何在 SQL 2005 Reporting Services 报表的标题中显示数据?

reporting-services - 报告服务: Join all field on a dataset

java - 无法找到或加载主类 - 通过命令提示符运行时出错

java - 线程是如何在内存中执行的?

java - 如何让 Eclipse 从 POM 中获取 Java 9 选项?

visual-studio-2010 - .rdlc 中组内的条件计数?

sql-server - 从 SQL Server 报表服务器导出非 Unicode CSV