1

私の仕事は、次のことを可能にする「アプリ」を作成することです。サーバー上のCrystal Reportsのリストがあれば、ユーザーはそれらをいくつでも選択して1つの長いレポートにまとめることができます(一緒に追加するだけです)。各レポートのパラメータを設定できる必要があります。

通常の方法は、すべての個別のレポートをサブレポートとして含むメインレポートを生成することですが、一部の個別のレポートにはすでに独自のサブレポートが含まれている可能性があるため、これはここでのオプションではないと思います(ネストされたサブレポートを持つことはできません)。

レポートは、Crystal Reports for EnterpriseXI4.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.

したがって、全体的な問題に対するより良い解決策がない場合でも、1つのレポートをPDFにエクスポートすることについての助けをいただければ幸いです。

4

1 に答える 1

3

私の答えは、あなたの質問の中で最も難しいと思われる部分、つまり出力を 1 つのファイルにまとめることに限定します。

あなたが説明していることは、「マスター」レポートを作成して各レポートをサブレポートとして追加しない限り、Crystal Reports では実現できません。これには、すでに埋め込まれているサブレポートが失われるという欠点があります。

このようにする必要がある理由は、Crystal Report の次のプロパティによるものです。

  1. レポートは単一のデータソースを持つことができます。異なるデータソースをサブレポート内にカプセル化する必要があります
  2. レポートは、レポート ヘッダー、ページ ヘッダー、グループ ヘッダー、詳細、グループ フッター、レポート フッター、ページ フッターで構成され、常にこの順序で作成されます。

複数のレポートを一緒に追加することで構成されるレポートは、おそらく #1 (データソースが異なる場合) を壊し、間違いなく #2 を壊します。

オプションがないわけではありません。レポートをさまざまな形式にエクスポートし、エクスポートされた形式 (MS Excel/Word、PDF) にプログラムで追加し、その形式で操作することができます。1 つのドキュメントを PDF に出力できる無料の PDF ライターがいくつかあります (そのため、CR のエクスポート機能に頼る必要さえありません)。複数のpdfを一緒にマージできるツールがいくつかあります。このGoogle検索またはこのSO回答のオプションを試してください。

編集- 発生しているエラーについて ( This release does not support opening SAP Crystal Reports for Enterprise reports.) - 古い SDK で新しいバージョンのレポートを開こうとしているようです。使用している SDK が、使用しようとしているレポートのバージョンをサポートしていることを確認してください (おそらく、正しくインストールされていないか、複数のバージョンが競合していますか?)

于 2013-03-21T04:05:27.923 に答える