2013-08-19 120 views
2

我正在使用Java Crystal Report SDK来使用存储过程或ResultSets生成报告。Crystal Report - 使用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); 
} 

事情是从links的每个SubreportLink是半满或空。

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

所以,这是非常棘手的设置子报表参数在这种情况下,即使使用的半部分的每个Subreportlink +的ParameterField

我做错了什么?我可以得到我案例中所需的所有信息吗?

或者,有没有办法自动设置我的子报表参数,因为它是在我的主报表上使用setTablesLocation()方法时完成的(而不是使用ResultSet设置数据源)?

回答

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."); 
} 

我希望这将有助于其他 “失去用户” 水晶报表的Java SDK的:)

相关问题