Java 以编程方式附加Crystal报表,而不使用子报表

Java 以编程方式附加Crystal报表,而不使用子报表,java,jsp,crystal-reports,business-objects,crystal-reports-xi,Java,Jsp,Crystal Reports,Business Objects,Crystal Reports Xi,我的任务是创建一个应用程序,该应用程序将允许以下内容:给定服务器上的Crystal报表列表,用户可以选择任意数量的报表组合成一个长报表,只需附加在一起即可。他们必须能够为每个报告设置参数 我认为通常的方法是生成一个主报告,其中包含所有作为子报告的单独报告,但我不认为这是一个选项,因为一些单独的报告可能已经包含了它们自己的子报告,并且不能有嵌套的子报告 >报告以水晶报表为企业席4创建。我正试图使用BusinessObjects Java SDK将其作为一组JSP页面来完成。输出类型最好是灵活的,

我的任务是创建一个应用程序,该应用程序将允许以下内容:给定服务器上的Crystal报表列表,用户可以选择任意数量的报表组合成一个长报表,只需附加在一起即可。他们必须能够为每个报告设置参数

我认为通常的方法是生成一个主报告,其中包含所有作为子报告的单独报告,但我不认为这是一个选项,因为一些单独的报告可能已经包含了它们自己的子报告,并且不能有嵌套的子报告

<> >报告以水晶报表为企业席4创建。我正试图使用BusinessObjects Java SDK将其作为一组JSP页面来完成。输出类型最好是灵活的,但如果需要,只生成PDF是可以接受的

最好的办法是什么

更新:我还应该注意,当尝试将单个报告导出为PDF时,我考虑的是只制作每个报告的PDF,然后以某种方式将它们连接起来,以下代码失败:

// Get the ID of the current working report.
int reportID = Integer.parseInt(request.getParameter("ReportID"));

// Retrieve the BOE Session and InfoStore objects
IEnterpriseSession eSession = (IEnterpriseSession)session.getAttribute("EnterpriseSession");
IInfoStore iStore = (IInfoStore)eSession.getService("InfoStore",ServiceNames.OCA_I_IINFO_STORE);

// Query to get the report document
String infoStoreQuery = "select SI_NAME,SI_PARENTID from CI_INFOOBJECTS where SI_ID=" + reportID;
IInfoObjects infoObjects = iStore.query(infoStoreQuery);
IInfoObject report = (IInfoObject)infoObjects.get(0);

IReportAppFactory reportAppFactory = (IReportAppFactory)eSession.getService("RASReportFactory");
ReportClientDocument clientDoc = reportAppFactory.openDocument(report, OpenReportOptions._openAsReadOnly, java.util.Locale.CANADA);

//Use the report document's PrintOutputController to export the report to a ByteArrayInputStream
ByteArrayInputStream byteIS = (ByteArrayInputStream)clientDoc.getPrintOutputController().export(ReportExportFormat.PDF);
clientDoc.close();

//Create a byte[] that is the same size as the exported ByteArrayInputStream
byte[] buf = new byte[2000 * 1024];
int nRead = 0;
//Set response headers
response.reset();
response.setHeader("content-disposition", "inline;filename=untitled.pdf");
response.setContentType("application/pdf");
//Send the Byte Array to the Client
while ((nRead = byteIS.read(buf)) != -1) {
  response.getOutputStream().write(buf, 0, nRead);
}
//Flush the output stream
response.getOutputStream().flush();
//Close the output stream
response.getOutputStream().close();
在reportAppFactory.openDocument行中,出现以下错误:

javax.servlet.ServletException: com.crystaldecisions.sdk.occa.managedreports.ras.internal.ManagedRASException: Cannot open report document. --- This release does not support opening SAP Crystal Reports for Enterprise reports.

因此,如果您对整个问题没有更好的解决方案,我仍然希望您能提供一些帮助,甚至可以将一份报告导出为PDF。

我将仅回答您问题中最难的部分-将输出合并到一个文件中

除非您创建一个“主”报告并将每个报告附加为子报告,否则您所描述的内容在Crystal Reports中听起来是不可能的。这确实有您提到的缺点,即丢失任何已嵌入的子报表

之所以需要这样做,是因为Crystal报表具有以下属性:

一个报表可以有一个数据源;不同的数据源必须封装在子报表中 报表由报表页眉、页眉、组页眉、详细信息、组页脚、报表页脚、页脚组成-始终按此顺序排列。 如果一个报告包含多个附加报告,如果它们有不同的数据源,则很可能会中断1,并且肯定会中断2

现在,您并非没有选项—您可以将报表导出为各种格式,并以编程方式将它们附加到导出的格式:MS Excel/Word、PDF,然后以该格式操作它们。有一些免费的pdf编写器可以让你将一个文档打印成pdf格式,这样你甚至不需要依赖CR的导出功能;有一些工具可以将多个PDF合并在一起。请尝试从或中的选项


编辑-在出现错误时,此版本不支持打开SAP Crystal Reports for Enterprise Reports。-听起来好像您正试图在旧SDK中打开更新版本的报表。请确保您使用的SDK支持您尝试使用的报表版本,可能是安装不正确,或者存在多个版本冲突?

谢谢您提供的信息。我刚刚下载了我发现的内容,并使用了\java\lib中的JAR。无论如何,我已经找到了解决openDocument问题的方法。为了将来参考,我能够使用ReportExportControl成功地将报表导出为PDF,如中所示。此外,还演示了如何组合PDF。