Crystal Reports 11 RDC (COM API) отображает диалоговое окно принтера, даже когда я говорю, чтобы он не запрашивал - PullRequest
0 голосов
/ 07 февраля 2011

Я использую RDC (COM) API Crystal Reports 11 для печати.Мой код выглядит следующим образом:

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 Reports по-прежнему показывает свой собственный диалог выбора принтера - но, похоже, только для некоторых отчетов.Почему в отчетах о кристаллах отображается диалоговое окно печати, даже если я передаю значение false для promptUser?И как тогда я могу отключить внутренний диалог выбора принтера Crystal Reports и заставить его использовать мои значения?

Редактировать: К сожалению, CR11, а не CR9.

Некоторая дополнительная информация:

  • Отчеты, которые работают должным образом (т. Е. Не отображают диалоговое окно печати), создаются внутренне с использованием RDC API;мы создаем новый объект отчета, импортируем в него вложенные отчеты, затем печатаем результат.Никаких проблем там нет.
  • Отчеты о том, что не работают неправильно (т. Е. Принудительно открывают диалоговое окно печати), были созданы с предыдущей версией отчетов Crystal;однако открытие и сохранение отчета, похоже, не помогают.
  • Примеры отчетов в каталоге установки 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)

Ответы [ 2 ]

0 голосов
/ 20 февраля 2011

Оказывается, в конце концов, это была ошибка в моем коде - я ранее поместил оболочку для RDC API, чтобы исправить некоторые другие ошибки, которые у нас были; Из-за большого количества методов в интерфейсах IReport я написал скрипт для генерации сквозных заглушек для методов, которые меня не интересовали. Оказывается, что скрипт передавал поддельные значения для параметров со значениями по умолчанию. К сожалению! Исправление кода оболочки исправило ошибку здесь.

0 голосов
/ 13 февраля 2011

Во-первых, позвольте мне предисловие, что я не программист на C / C ++, поэтому я не могу протестировать код - мое взаимодействие с SDK было с интерфейсом VB и .Net на протяжении многих лет.

Я нашел следующий код из библиотеки BO :

// 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 Reports по-прежнему показывает свои собственные диалог выбора принтера - но только для некоторых отчетов, кажется.

Вообще говоря, я обнаружил, что Crystal склонен игнорировать команды для подавления диалогов, если считает, что чего-то не хватает. Я обнаружил, что это правда в диалоге параметров. Возможно, это относится и к этой ситуации. Я хотел бы спросить, что отличается от отчетов, которые вызывают создание диалога. Существует опция «нет принтера», которую можно установить. Возможно, это общая тема.

Есть ли у вас доступ к VB6 IDE? Если вы пишете эквивалентные команды с использованием интерфейса VB6, возникает ли запрос?

Вы также можете исследовать использование CRPE32.dll вместо элемента управления конструктора отчетов. Честно говоря, я не знаю, является ли RDC оболочкой из библиотеки CRPE DLL или это совершенно отдельная база кода.

...