Java Crystal Report-使用结果集的主报表中的子报表

Java Crystal Report-使用结果集的主报表中的子报表,java,crystal-reports,report,datasource,subreport,Java,Crystal Reports,Report,Datasource,Subreport,我正在使用JavaCrystalReportSDK使用存储过程或结果集生成报告 下面是我几个月前写的一篇文章,试图使用ResultSet:在报表中执行子报表的存储过程。 在本例中,我知道要为执行存储过程设置的参数,因此“很容易” 现在,我正尝试做同样的事情(即执行一个存储过程,使用ResultSet在主报表中填充我的子报表),但一般来说:我事先不知道参数,所以我必须使用ParameterFieldController设置每个参数,但有些参数来自主ResultSet,其他来自主报告中的静态变量等

我正在使用JavaCrystalReportSDK使用存储过程或结果集生成报告

下面是我几个月前写的一篇文章,试图使用ResultSet:在报表中执行子报表的存储过程。 在本例中,我知道要为执行存储过程设置的参数,因此“很容易”

现在,我正尝试做同样的事情(即执行一个存储过程,使用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);  
 } 
IStrings subreports=clientDoc.getSubreportController().getSubreportNames();
对于(inti=0;i
问题是
links
中的每个
SubreportLink
都是半满或空的

  • 如果子报表参数链接到主报表存储过程的字段或公式字段,则在
    SubreportLink
    (使用
    getMainReportFieldName()
    )中有此参数的名称,但没有子报表中链接参数的名称(使用
    getSubreportFieldName()
    )而不是链接的价值
  • 如果子报表参数链接到主报表的参数字段,
    SubreportLink
    对象为空
因此,在这种情况下设置子报表参数非常困难,即使使用每个
子报表链接的一半
+
参数字段

我做错了什么?我能得到我的案子需要的所有信息吗


或者,当我在主报表上使用
settableLocation()
方法(而不是使用
ResultSet
设置数据源)时,是否有一种方法可以自动设置我的subreports参数?

Ok Ok,所以在进行了大量徒劳的尝试之后,我发现只有当主存储过程返回数据时,才能生成包含子报表的报表。 我使用
行集光标

这是我的密码:

// 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.");
}
//这里我只使用数据库字段创建元数据
IRowsetMetaData=new RowsetMetaData();
Fields=clientDoc.getDataDefController().getDataDefinition().getResultFields();
Fields dbFields=新字段();
对于(int i=0;i