【问题标题】:Crystal reports 11 RDC (COM API) displays printer dialog even when I tell it not to promptCrystal 报告 11 RDC (COM API) 显示打印机对话框,即使我告诉它不要提示
【发布时间】:2011-02-20 22:10:59
【问题描述】:

我正在使用 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);

然而,在这一切结束时,水晶报表仍会显示其自己的打印机选择对话框 - 但似乎仅适用于某些报表。为什么即使我为 promptUser 传递 false,水晶报告也会显示打印对话框?那么,我怎样才能抑制水晶报表的内部打印机选择对话框并强制它使用我的值呢?

编辑:哎呀,CR11,不是 CR9。

一些进一步的信息:

  • 正常工作的报告(即不显示打印对话框)是使用 RDC API 在内部生成的;我们创建一个新的报表对象,将子报表导入其中,然后打印结果。没问题。
  • 不能正常工作的报告(例如,强制打开打印对话框)是用以前版本的水晶报告创建的;但是,打开和保存报告似乎没有帮助。
  • Crystal Reports 安装目录中的示例报表显示相同的问题。

我尝试使用 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)

【问题讨论】:

  • “打开并保存报告”是指使用 RDC 还是 IDE (crw32.exe)?您能否尝试打开、刷新,然后使用 RDC 保存“旧”报告,然后使用 IDE 对原始“旧”报告执行相同操作?有什么不同吗?
  • @craig,刷新是什么意思? Report 对象 afaics 上没有 Refresh 方法
  • @bdonlan,抱歉,这是 IDE 中使用的术语。我的目标是让水晶(两个版本(IDE 和 RDC),所以 2 个测试)将数据加载到 RPT 中,以查看是否会重置任何可能导致此问题的内部标志(或 wahtever)。实际上,这似乎是一个错误——您检查过 RDC 的修补程序或服务补丁吗?另一种选择,假设我们不能让这个工作,将报告导出为 PDF 格式,然后打印。
  • @craig,这不会是我第一次处理 RDC 中的错误 - 我在其他地方有一些丑陋的补丁来解决另一个不相关的问题 :) 不幸的是,这是最新的服务包,并且上游已经转移到 .NET API 以用于未来的版本 - 不幸的是我们还不能迁移。我会试试你的建议;如果失败了,我只需要修补内存中的PrintDlgExW :)
  • @bdonian,“只需要修补内存中的 PrintDlgExW”到底是怎么回事?为了理智起见,您可能希望迁移到 MSRS。你可能会发现这个项目很有用:code.google.com/p/rpttoxml/downloads/list

标签: com printing crystal-reports crystal-reports-xi


【解决方案1】:

首先,让我先声明一下,我不是 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 认为缺少某些内容,它往往会忽略用于抑制对话框的命令。我发现参数对话框确实如此。也许它也适用于这种情况。我会问导致生成对话框的报告有什么不同。可以设置“无打印机”选项。也许这是共同点。

您可以访问 VB6 IDE 吗?如果用VB6的界面写等价的命令,会出现提示吗?

您还可以使用 CRPE32.dll 代替报表设计器控件进行调查。老实说,我不知道 RDC 是封装了 CRPE DLL 还是完全独立的代码库。

【讨论】:

  • 您发布的代码(以及对 CLSID 和报告路径的更正)会导致显示打印对话框。我很快就会简短地介绍一下 VB 的内容。至于报表的区别,给出对话框的报表是在以前版本的水晶报表中创建的; 创建对话框的报告是使用内存中的 RDC API 从头开始​​创建的(尽管通过 ImportSubreport 调用导入其他报告
  • 用 VBScript 试过,见我上面的回答。另外,最初我的问题标题是关闭的 - 我在 CR11,而不是 CR9(当我们切换到 CR11 时引入了这个错误)
  • 我在这里奖励赏金,尽管问题还没有完全解决,因为克雷格为解决这个问题付出了所有努力 - 谢谢 :)
  • 我很乐意为您提供帮助——我非常理解显然应该有效但无效的事情可能导致的挫败感。谢谢,奖励,即使我不确定我的解决方案是否值得。
【解决方案2】:

事实证明,这毕竟是我的代码中的一个错误——我之前为 RDC API 放入了一个包装器,以修复我们遇到的某些其他错误;由于 IReport 接口中有大量方法,我编写了一个脚本来为我不感兴趣的方法生成传递存根。结果该脚本正在为具有默认值的参数传递虚假值。哎呀!修复包装器代码修复了这里的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多