1

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

我收集到通常的方法是生成一个主报告,其中包括所有单独的报告作为子报告,但我不认为这是一个选项,因为一些单独的报告可能已经包含他们自己的子报告(并且您不能有嵌套的子报表)。

这些报表是使用 Crystal Reports for Enterprise XI 4.0 创建的。我正在尝试将其作为一组使用 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,我仍然希望能得到一些帮助。

4

1 回答 1

3

我将把我的答案限制在你的问题中似乎最难的部分——将输出合并到一个文件中。

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

之所以需要这样做是由于 Crystal Report 的以下属性:

  1. 一个报告可以有一个单一的数据源;不同的数据源必须封装在子报表中
  2. 报表由报表页眉、页眉、组页眉、详细信息、组页脚、报表页脚、页脚组成 - 始终按此顺序排列。

包含将多个报告附加在一起的报告很可能会破坏 #1(如果它们具有不同的数据源),并且肯定会破坏 #2。

现在,您并非没有选择- 您可以将报告导出为各种格式,并以编程方式将它们附加为该导出格式:MS Excel/Word、PDF,并以该格式操作它们。有一些免费的 pdf 编写器可以让您将单个文档打印为 PDF(因此您甚至不需要依赖 CR 的导出功能);有一些工具可以将多个 pdf 合并在一起,试试这个谷歌搜索的选项,或者这个 SO 答案

编辑-关于您遇到的错误(This release does not support opening SAP Crystal Reports for Enterprise reports.)-听起来您正在尝试在较旧的 SDK 中打开较新版本的报告。确保您使用的 SDK 支持您尝试使用的报告版本(可能安装不正确,或者有多个版本冲突?)

于 2013-03-21T04:05:27.923 回答