- PR -

CrystalReport「PrintReportメソッドは失敗しました」となります

1
投稿者投稿内容
未記入
会議室デビュー日: 2006/04/07
投稿数: 4
投稿日時: 2006-04-10 17:37
こんにちは。
VB6.0+CrystalReport10でオラクルデータを帳票にしています。

さて、VB側でデザイナを追加し、レポートをプレビュー表示させることはできました。
ただ、プレビューーせずに直接印刷しようとすると、エラーになります。
(コンボを使って処理を分岐しています)
コードは

Private Sub cmdGO_Click()

If Combo1.Text = "選択してください" Then
'無視
ElseIf Combo1.Text = "画面表示(印刷も可)" Then
frm未検収LIST_data1.Show
frm未検収LIST_data2.Show

ElseIf Combo1.Text = "印刷のみ" Then
MsgBox "画面表示は行いません。直接帳票を印刷します。"
frm未検収LIST_menu.CrystalReport1.Destination = crptToPrinter
frm未検収LIST_data1CRViewer1.PrintReport
frm未検収LIST_data2.CRViewer1.PrintReport
End If

印刷したいフォームはfrm未検収LIST_data1 とfrm未検収LIST_data1と、計2つ
あるのですが、1つめの「frm未検収LIST_data1CRViewer1.PrintReport」で
"実行時エラー '2147418113 'printReportメソッドは失敗しました。
'ICrystal Report Viewer10'オブジェクト"
となってしまいます。
data2をコメント化しても、data1のところで失敗します。

ヘルプファイルやネットなどをみて、
frm未検収LIST_data1CRViewer1.PrintReport true
としてもダメでした。いったい何が悪いのでしょうか?
プレビューはdata1もdata2の分も、正しく表示されています。

参照設定が何か間違っているのでしょうか。それとも
単純にコードがおかしいですか?

なお、エラーのダイアログボックスにデバッグで応答し、
そのまままたコードを実行させると、今度はただしく印刷のダイアログボックスが
表示され、印刷も可能となります。
1回で印刷できるようにするにはどうすればいいでしょうか。

どうぞご教授くださいますようよろしくお願いいたします。


未記入
会議室デビュー日: 2006/04/07
投稿数: 4
投稿日時: 2006-04-10 17:39
■スイマセン訂正です■

肝心なところ・・・
印刷したいフォームはfrm未検収LIST_data1 とfrm未検収LIST_data1と、計2つ
      ↓
印刷したいフォームはfrm未検収LIST_data1 とfrm未検収LIST_data2と、計2つ

data1とdata2 が正しいです。

失礼しました。どうぞよろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-10 17:53
引用:

未記入さんの書き込み (2006-04-10 17:37) より:

印刷したいフォームはfrm未検収LIST_data1 とfrm未検収LIST_data1と、計2つ
あるのですが、1つめの「frm未検収LIST_data1CRViewer1.PrintReport」で
"実行時エラー '2147418113 'printReportメソッドは失敗しました。
'ICrystal Report Viewer10'オブジェクト" となってしまいます。


もしかしたら経由してるだけかもしれませんが、

引用:

frm未検収LIST_menu.CrystalReport1.Destination = crptToPrinter
frm未検収LIST_data1.CRViewer1.PrintReport
frm未検収LIST_data2.CRViewer1.PrintReport


# 勝手に「.」を補足しました。(data2 は付いていましたので)

最初に設定している CrystalReports コンポーネントは frm未検収LIST_menu ですが、
実際に PrintReport しているのは frm未検収LIST_data1.CRViewer1 になっています。

つまり、ReportSource の設定があべこべになっていたりしませんか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
未記入
会議室デビュー日: 2006/04/07
投稿数: 4
投稿日時: 2006-04-11 15:23
じゃんぬねっと様

ありがとうございます。
さっそくですが

  引用: --------------------------------------------------------------------------

     # 勝手に「.」を補足しました。(data2 は付いていましたので)

  --------------------------------------------------------------------------------

失礼しました。これは、「.」があるのが正しいです。

  引用: --------------------------------------------------------------------------
     最初に設定している CrystalReports コンポーネントは frm未検収LIST_menu ですが、
     実際に PrintReport しているのは frm未検収LIST_data1.CRViewer1 になっています。

     つまり、ReportSource の設定があべこべになっていたりしませんか?
  --------------------------------------------------------------------------------

この部分が、自分でも理解できていませんので、
もう少しお付き合いいただいてもよろしいでしょうか。

今回の手順は、
1.デザイナでレポートファイル(ADOでオラクル接続)を指定
2.自動的に作成されたフォーム(CRViewer1がある)を
  frm未検収LIST_data1(あとdata2も)にリネーム
3.新たにfrm未検収LIST_menuを作成し、コンボボックスとcmdGOボタンを配置
  それプラス、CrystalReportコンポーネンツも配置
4.frm未検収LIST_menuにコードを書く

という流れでした。

実際のデータはfrm未検収LIST_data1.CRViewer1に表示されるので、
そちらを印刷する=つまりfrm未検収LIST_data1.CRViewer1.PrintReport と
書いたのですが、そもそもこれが間違っているのでしょうか。

あと、frm未検収LIST_menuには、CrystalReportコンポーネンツを配置しましたが
どう関連しているのかイマイチ理解できていないままです(恐縮)
(下記のサンプルを元に作ってみたのですが...)
http://homepage2.nifty.com/inform/vbdb/boundreport.htm

レポートソースの設定があべこべというのは、どう判断したらいいのでしょうか?
frm未検収LIST_menuのCrystalReport1のプロパティでReportSourceを見ると
crptReportとなっています。ここのことなのでしょうか・・・?

どうかご教授くださいますようよろしくお願いいたします。

未記入
会議室デビュー日: 2006/04/07
投稿数: 4
投稿日時: 2006-04-11 17:16
スイマセン自己解決できたようですので、ご報告いたします。

ステップインで1行ごとに実行していくと、エラーがでずに
ちゃんと印刷のダイアログボックスがでました。
そこで、一定の間時間をおくようにタイマーを設定して、
コードをこう書きかえたらエラーがでなくなりました。
(タイマー部分は省略します)

If Combo1.Text = "選択してください" Then
'無視
ElseIf Combo1.Text = "画面表示" Then
frm未検収LIST_data1.Show
Wait 2    '2秒停止
frm未検収LIST_data2.Show

ElseIf Combo1.Text = "印刷" Then
MsgBox "印刷します。"
frm未検収LIST_menu.CrystalReport1.Destination = crptToPrinter

frm未検収LIST_data1.Show
Wait 1
frm未検収LIST_data1.CRViewer1.PrintReport

frm未検収LIST_data2.Show
Wait 1
frm未検収LIST_data2.CRViewer1.PrintReport
Edn If

当初はフォームを表示させない予定でしたが、上司に確認したら印刷後にリストが
表示されているほうが都合がいいかも・・・ということになり、この形で一応
要求は満たされたことになりました。
もっとスマートな書き方があると思うのですが、今回は
「フォームをいったん表示してしばし待つ」という方法で解決しました。

アドバイスを下さったじゃんぬねっと様
ありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-11 17:34
引用:

未記入さんの書き込み (2006-04-11 15:23) より:

あと、frm未検収LIST_menuには、CrystalReportコンポーネンツを配置しましたが
どう関連しているのかイマイチ理解できていないままです(恐縮)


このコンポーネントは CrystalReports コントロールのことでしょうか?
であれば、プレビューコントロールを経由する必要はなく、

コード:

    CrControl.Destination = crptToPrinter
    CrControl.PrintReport
    'または、
    'CrControl.Action = 1
    '後期バージョンだと、
    'CrControl.PrintOut(...)


ではないかと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)