【发布时间】: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