Мы используем PBNI для вызова методов и открытия окон в C #, используя C ++ DLL и Crystal Reports 10.
В окне, содержащем OLE-элемент управления Crystal Reports Viewer, отображается только пустая страница без ошибок. В режиме отладки в Powerbuilder отчет отображается правильно. (Печать и экспорт данных работают, но не просмотрщик.)
Используя Process Monitor, мы видим, что исполняемый файл C # ищет и находит много DLL-файлов Crystal Reports (включая crviewer.dll). Отчеты должны подключаться к базе данных Oracle через ODBC. Изучая историю Oracle SQL, я думаю, что зритель не может подключиться к базе данных. Но когда я изменяю учетные данные подключения (псевдоним, идентификатор …) и пытаюсь получить SQLQueryString в отчете, у меня возникает ошибка (поэтому учетные данные верны).
Код Powerbuilder (событие открытия окна):
OLEObject APP_CR, APPLICATION
OLEObject CONNECTION_INFO
APPLICATION = CREATE OLEObject
long li_ret
li_ret = APPLICATION.ConnectToNewObject('CrystalRuntime.Application.10')
APP_CR = APPLICATION.OpenReport("C:\Apps\PB120\HeliosII\Dev\Etat\CLI_LST.rpt", 1)
CONNECTION_INFO = APP_CR.database.tables[1].ConnectionProperties
CONNECTION_INFO.DeleteAll
CONNECTION_INFO.Add("DSN","DATABASE O10")
CONNECTION_INFO.Add("Database", "DATABASE")
CONNECTION_INFO.Add("User ID","ETAT")
CONNECTION_INFO.Add("Password","ETAT")
// Testing the connection
string ls_SQLQuery
ls_SQLQuery = APP_CR.SQLQueryString
APP_CR.SQLQueryString = ls_SQLQuery
// Showing the report
ole_CRViewer.object.ReportSource(App_CR)
ole_CRViewer.object.ViewReport
Код C ++ Dll (вызывает функцию, которая открывает окно)
pbgroup group = session->FindGroup("nvo_lanceur", pbgroup_userobject);
if (group == NULL) return false;
pbclass cls = session->FindClass(group, "nvo_lanceur");
if (cls == NULL) return false;
pbobject pbobj = session->NewObject(cls);
if (pbobj == NULL) return false;
pbmethodID mid = session->GetMethodID(cls, "of_traitermessage", PBRT_FUNCTION, "QS");
PBCallInfo ci;
session->InitCallInfo(cls, mid, &ci);
ci.pArgs->GetAt(0)->SetString(parameters);
// Call the function
try
{
session->InvokeObjectFunction(pbobj, mid, &ci);
// Was PB exception thrown?
if (session->HasExceptionThrown())
{
// Handle PB exception
session->ClearException();
}
}
catch (...)
{
// Handle C++ exception
}
Функция «of_traitermessage» объекта «nvo_lanceur» вызывает открытие окна, содержащего средство просмотра (и многие другие окна, в зависимости от параметров). Приложение C # вызывает метод C ++ каждые 100 мс, который вызывает «session-> ProcessPBMessage ( );» для отправки сообщений о событиях powerbuilder. Как я могу сделать это отображение отчета?
Задача ещё не решена.
Других решений пока нет …