0

Crystal Reports 11のRDC(COM)APIを使用して印刷しています。私のコードは次のようになります:

HRESULT res = m_Report->SelectPrinter(b_driver, b_device, b_port);
if (FAILED(res)) return res;
// For these calls, the #import wrapper throws on error
m_Report->PutPrinterDuplex(dmDuplex);
m_Report->PutPaperSize(dmPaperSize);
m_Report->PutPaperSource((CRPaperSource)pdlg->GetDevMode()->dmDefaultSource);
if (m_Report->GetPaperOrientation() == crDefaultPaperOrientation)
    m_Report->PutPaperOrientation(crPortrait);

VARIANT vfalse;
VariantInit(&vfalse);
vfalse.vt=VT_BOOL;
vfalse.boolVal=0;

res = m_Report->PrintOut(vfalse);

ただし、このすべての最後に、Crystalレポートには独自のプリンタ選択ダイアログが表示されますが、一部のレポートについてのみ表示されます。falseを渡しても、Crystalレポートに印刷ダイアログが表示されるのはなぜpromptUserですか?それでは、Crystal Reportsの内部プリンター選択ダイアログを抑制して、自分の値を使用するように強制するにはどうすればよいですか?

編集:おっと、CR9ではなくCR11。

いくつかの詳細情報:

  • 正しく機能する(つまり、印刷ダイアログが表示されない)レポートは、RDCAPIを使用して内部的に生成されます。新しいレポートオブジェクトを作成し、それにサブレポートをインポートして、結果を出力します。問題ありません。
  • 正しく機能しない(つまり、印刷ダイアログを強制的に開く)レポートは、以前のバージョンのCrystalレポートで作成されています。ただし、レポートを開いて保存しても効果がないようです。
  • CrystalReportsインストールディレクトリのサンプルレポートにも同じ問題があります。

VBScriptで再現してみました。ただし、その結果、何も印刷されませんでした(ダイアログも何もありません)。

Set app = CreateObject("CrystalRuntime.Application.11")
Set report = app.OpenReport("C:\Program Files\Business Objects\Crystal Reports 11.5\Samples\en\Reports\General Business\Inventory Crosstab.rpt")
report.PrintOut(True)
rem Testing with a True parameter to force a print dialog - but no printout and nothing appears (no error either though)
4

2 に答える 2

0

まず、私はC / C ++プログラマーではないため、コードをテストできません。SDKとのやり取りは、長年にわたってVBおよび.Netインターフェイスで行われてきました。

BOのdevlibraryから次のコードを見つけました:

// A dummy variant
VariantInit (&dummy);
dummy.vt = VT_EMPTY;
HRESULT       hr = S_OK;
// Specify the path to the report you want to print                                    
_bstr_t ReportPath("c:\\Program Files\\Business Objects\\Crystal Reports 11.5\\Samples\\En\\Reports\\General Business\\Inventory.rpt");
_variant_t vtEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR);
// Instantiate the IApplication object
m_Application.CreateInstance("CrystalRuntime.Application.115");
//Open the Report using the OpenReport method
m_Report = m_Application->OpenReport(ReportPath, dummy)
//Print the Report to printer
m_Report->PrintOut(dummy, dummy, dummy, dummy);

それは機能しますか?「デフォルト」のプリンタ設定で、プロンプトなしでレポートを印刷する必要があります。

あなたが書いた:

ただし、このすべての終わりに、Crystalレポートには引き続き独自のプリンタ選択ダイアログが表示されますが、一部のレポートについてのみ表示されます。

一般的に言って、Crystalは何かが足りないと思った場合、ダイアログを抑制するコマンドを無視する傾向があることがわかりました。私はこれがパラメータダイアログで真実であることを発見しました。おそらくそれはこの状況にも当てはまります。ダイアログが生成される原因となるレポートについて、何が違うのかを尋ねます。設定できる「プリンタなし」オプションがあります。おそらくこれは共通のスレッドです。

VB6 IDEにアクセスできますか?VB6のインターフェイスを使用して同等のコマンドを作成した場合、プロンプトは表示されますか?

report-designerコントロールの代わりにCRPE32.dllを使用して調査することもできます。正直なところ、RDCがCRPE DLLをラップするのか、それとも完全に別個のコードベースなのかはわかりません。

于 2011-02-13T15:27:51.663 に答える
0

結局のところ、それは私のコードのバグであることがわかりました。以前は、RDC APIのラッパーを入れて、他の特定のバグを修正していました。IReportインターフェイスには多数のメソッドがあるため、興味のないメソッドのパススルースタブを生成するスクリプトを作成しました。スクリプトがデフォルト値のパラメーターに偽の値を渡していたことがわかりました。おっと!ラッパーコードを修正すると、ここでバグが修正されました。

于 2011-02-20T14:10:59.630 に答える