我的任务是创建一个允许以下内容的“app”:给定服务器上的Crystal Reports列表,用户可以选择任意数量的Crystal Reports组合成一个长报告(只是附加在一起)。他们必须能够为每个报告设置参数。
我已经知道通常的方法是生成一个主要报告,其中包含所有单个报告作为子报告,但我不认为这是一个选项,因为某些单独的报告可能已包含它们自己的子报告(并且您不能拥有嵌套的子报告)。
报告是使用Crystal Reports for Enterprise XI 4.0创建的。我正在尝试使用BusinessObjects Java SDK将其作为一组JSP页面。输出类型最好是灵活的,但如果需要,只需生成PDF即可。
最好的方法是什么?
更新:我还应该注意,在尝试将单个报告导出为PDF时(我正在考虑制作每个报告的PDF,然后以某种方式连接它们),以下代码失败:< / p>
// 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,我仍然会感激一些帮助。
答案 0 :(得分:3)
我会将答案限制在您的问题中最难的部分 - 将输出合并到一个文件中。
除非您创建“主”报告并将每个报告附加为子报告,否则通过Crystal Reports无法实现您所描述的内容。这确实有你提到丢失任何已经嵌入的子报告的缺点。
需要这样做的原因是由于Crystal Report的以下属性:
一起包含多个报告的报告很可能会破坏#1(如果它们有不同的数据源),肯定会打破#2。
现在,您不是没有选项 - 您可以将报告导出为各种格式,并以编程方式将它们以导出的格式附加:MS Excel / Word,PDF,并以该格式操作它们。有一些免费的pdf编写器允许您将单个文档打印为PDF(因此您甚至不需要依赖CR的导出功能);有些工具可以将多个pdf合并在一起,尝试this google search或this SO answer中的选项。
修改 - 关于您收到的错误(This release does not support opening SAP Crystal Reports for Enterprise reports.
) - 听起来您正试图在较旧的SDK中打开较新的版本化报告。确保您使用的SDK支持您尝试使用它的报告版本(可能是安装不正确,或者有多个版本冲突?)