ASP.Net ページから Crystal Reports レポートを印刷しようとすると、重大な問題が発生します。現在の設定は次のとおりです。
- Crystal Reports ビューアがページに設定されています。レポートを表示すると、レポートは正常に表示されます。
- レポート ビューアの PrintMode が ActiveX に設定されている
- SAP の推奨に従って、セッション変数からレポート データ ソースを設定しています (ナレッジ ベース記事の 1 つに記載されています)。レポート データ ソースは、WCF サービスへの呼び出しによって設定されています。レポートに渡されるデータは問題ありません。(ここでも、レポートは問題なく表示され、すべてのコンテンツが適切に表示されます)。
- ASP.Net アプリケーションと関連サービスのビルド ターゲットは x86 です。
- すべてが Crystal Reports バージョン 13 を使用しており、ASP.Net Web アプリケーションは .Net 4 を使用しています。これは Internet Explorer 8 で表示されています。
- Internet Explorer 8 で ActiveX の設定を確認してみましたが、問題はありません (すべて許可またはプロンプトに設定されています)。
- このエラーは、IDE から実行した場合でも、別のサーバーにセットアップされた Web サイトから実行した場合でも発生します。
- 他のサーバーの IIS のアプリケーション プールの設定は、32 ビット アプリケーションを許可するように設定されています。
レポート ビューアーの [印刷] アイコンをクリックすると、次のエラー メッセージが表示されます。
「通信エラーが発生しました。印刷を中止します。」
この同じエラーが複数のマシンで発生します。エラー メッセージで [OK] をクリックすると、その下のダイアログに「Crystal Reports Print Control が読み込まれるまでお待ちください。」と表示されます。待っていても何も起こりません。ActiveX コントロールをインストールするプロンプトは表示されず、プリンターを選択するためのポップアップも表示されません (いくつかのプリンターがインストールされていることはわかっています)。
私は次のことを試みましたが、どれもうまくいきませんでした:
- レポートの種類を PDF に切り替えます。これを実行してレポート ビューアーの [印刷] ボタンをクリックすると、次のエラーが表示されます。
Microsoft JScript ランタイム エラー: オブジェクトが必要です。」
特にこの行で壊れます:
bobj.crv.stateManager.setComponentState('MainContent_reportViewer_ UI',eval('('+document.getElementById(' _CRYSTALSTATEctl00$MainContent$reportViewer').value+')'));
レポートにはいくつかの動的画像がありますが、レポートを表示するとすべて正しく表示されています。これらは、このレポートに関連付けられると私が考えることができる唯一のバイナリ オブジェクトです。ページの動的に作成されたコードでエラーが発生しています-私が書いたものではありません。
- 正しい .cab ファイルから ActiveX コントロールを手動でインストールしようとしました。これは、どのシナリオでも違いはありませんでした。
- 最新の Crystal Reports サービス パック (サービス パック 3) をインストールしました。繰り返しますが、これは何も変わりませんでした。
- 私が遭遇したいくつかのフォーラム投稿で推奨されているように、デフォルト Web サイト内に CrystalReportViewers13 用の仮想ディレクトリを設定しようとしました。これも効果がありませんでした。
- ページで ViewState を有効にしても、印刷が機能するかどうかには影響しません。
- 独自の印刷ボタンと、使用可能なプリンターのリストを含むドロップダウン リストを追加してみました。独自のカスタム印刷ボタンをクリックして PrintToPrinter() を呼び出すと、PDF レポートを印刷しようとした場合と同じエラー メッセージが表示されます。
「Microsoft JScript ランタイム エラー: オブジェクトが必要です」
...そして、[印刷] ボタンをクリックして PDF レポートを印刷しようとしたときと同じ行で壊れます。
私はこれに対して少なくとも 1 日は頭を悩ませてきましたが、アイデアがまったくありません。誰がこれを引き起こしているのか考えていますか?
編集:
さて、これが私が物事を機能させるためにしたことです。それは、私が考えていたものよりもはるかに簡単な修正になりました。
ReportDocument 全体をセッションに詰め込みます。ページの読み込みは次のようになります。
protected void Page_Load(object sender, EventArgs e) { if (Session["report"] != null) { reportViewer.ReportSource = Session["report"]; } BuildReport(); }
ReportViewer はできるだけシンプルに保ちます。レポートの種類 (PDF または ActiveX) を指定しないでください。それを何かに設定すると、問題が発生するように見えました。これは、ページのソースで次のように表示されます。
...そしてそれだけでした。こんなに簡単な作業になってしまったのに、それを機能させるために約 1 日を費やしたなんて信じられません。この投稿が、同じ問題に直面している他の人に役立つことを願っています。