1

問題定義

Crystal レポートに大量のデータの結果セットを表示すると、パフォーマンスの問題が発生します。結果セットのサイズにもよりますが、レポートには約 4 分以上かかります。

パフォーマンスの問題なしに Crystal Reports で大きな結果セットを処理するにはどうすればよいですか?

環境

クリスタルレポートXI

アパッチ WebSvr 2.X

Jボス4.2.3

支柱

Java レポート コンポーネント(JRC)

Crystal Report Viewer (CRV)

ファイアフォックス

詳細

CRXI シック クライアントを使用してレポート (.rpt) を作成し、それを Jboss の下の Web アプリケーション (webapp) で使用します。

ユーザーは、レポートを生成するためのフィルター基準 (日付範囲など) を指定し、要求を webapp に送信します。Webapp はデータベースにクエリを実行し、「結果セット」を取得します。

すべての仕様に従って JRC と CRV を初期化し、最後に Crystal Report Viewer の「processHttpRequest」メソッドを呼び出して、ブラウザにレポートを表示します。

そう.....

  • フィルタ基準を使用してレポートを生成するリクエストを受け取りました

  • DB にクエリを実行して結果セットを取得する

  • JRCとCRVの初期化

  • 最後に呼び出してレポートを表示します

    reportViewer.processHttpRequest(リクエスト、レスポンス、request.getSession().getServletContext()、null);

パフォーマンスの問題は最後のステップにあります。ログをどこにでも置いて、データベース クエリが結果セットを返すのに時間がかかりすぎないことに気付きました。CRV の processHttpRequest を呼び出すまで、すべてが非常に迅速に処理されます。このメソッドは、ブラウザにレポートを表示する前に長時間ハングします。

結果セットが小さい場合、CRV は非常に高速に実行されますが、結果セットが大きい場合は長い時間がかかります。

サブレポートがあり、レポートで Crystal レポート式を使用しています。それらのいくつかは、グループ化にも使用されます。しかし、サブレポートがここでの本当の犯人だとは思いません。サブレポートを持たない他のレポートがいくつかあり、それらも大きな結果セットの表示が非常に遅くなるためです。

ソリューション?

したがって、明らかに、「Crystal Reports で大きな結果セットをどのように処理しますか?」という一般的な問題に対する適切な解決策が必要です。

中途半端なアイデアをいくつか考えました。

A) 外部ページネーションを使用し、現在表示されているページのデータのみを取得します。ただし、このためには、CRXI で独自のボタン (前、次、最後) を作成できるようにする必要があります。これにより、クリック イベントを制御し、それに応じてデータを取得できます。CRVのイベントハンドラ「addToolbarCommandEventListener」を登録してイベントをキャプチャしてみました。しかし、リスナーは processHttpRequest メソッドが完了した「後」に呼び出されますが、これは役に立ちません。

独自の前のページ、次のページ、最後のページのボタンを追加し、そのクリック イベントを制御することで、UI を制御できるようにする必要があります。

B) CRXI で jquery タイプの機能を使用して、ブラウザ側のページ ナビゲーションを許可する。したがって、最初はレポートを表示するのに 5 分かかるかもしれませんが、一度表示されると、ユーザーは要求をサーバーに送り返すことなく、任意のページに移動できます。

C) Crystal Reports 2008 を試してみてください。このバージョンを使用しても構いませんが、役立つ機能があるかどうかわかりませんでした。

D) BIRT または JasperReports を使用します。データセットの一部をディスクにキャッシュするなどして、大規模なデータセットを処理できるように思われるためです。

E) キャッシュ サーバー、アプリケーション サーバーなどの Crystal Reports サーバーを使用すると、何らかの形で役立ちますか? Crystal Page Viewer、Interactive Viewer、Part Viewer などについて少し読みましたが、これらのいずれかで問題が解決するかどうかはわかりません。

誰かが私を正しい方向に向けることができれば幸いです。

4

0 に答える 0