Cristal Report -производительность.
От: Grizzlick  
Дата: 25.10.01 12:53
Оценка:
Привет ALL!!!

вопрос состоит в следующем:

создаётся я большой отчёт ( 400 страниц и больше ).По времени это занимает несколько часов, да и памяти жрётся немерено. Все данные беру не из базы данных, а из внутреннего массива,поэтому использую AddTextObject(...).

Кто-нибудь работал с такими большими отчётами?
Можно ли как-нибудь оптимизировать и ускорить сохранение?

Заранее благодарен.
Re: Cristal Report -производительность.
От: PeterG  
Дата: 29.10.01 13:58
Оценка:
Попробуйте данные хранить в ADO Recordset, а потом передавать их в отчет через метод Report.Database.SetDataSource. У нас достаточно быстро работают отчеты > 1000000 записей (около 20 000 страниц). Посмотрите в Сrystal Reports Help статьи "Creating Data Definition Files ", "Active Data Driver Functions " и т.п.
Re[2]: Cristal Report -производительность.
От: Grizzlick  
Дата: 29.10.01 14:42
Оценка:
Здравствуйте PeterG, Вы писали:

PG>Попробуйте данные хранить в ADO Recordset, а потом передавать их в отчет через метод Report.Database.SetDataSource. У нас достаточно быстро работают отчеты > 1000000 записей (около 20 000 страниц). Посмотрите в Сrystal Reports Help статьи "Creating Data Definition Files ", "Active Data Driver Functions " и т.п.



Сэнкс за совет, только вот данные мы хранить в ADO Recordset ну ни как не можем.. ;)

поэтому вопрос остаётся открытым.... :)
Re[3]: Cristal Report -производительность.
От: PeterG  
Дата: 29.10.01 14:47
Оценка:
Здравствуйте Grizzlick, Вы писали:

G>Здравствуйте PeterG, Вы писали:


PG>>Попробуйте данные хранить в ADO Recordset, а потом передавать их в отчет через метод Report.Database.SetDataSource. У нас достаточно быстро работают отчеты > 1000000 записей (около 20 000 страниц). Посмотрите в Сrystal Reports Help статьи "Creating Data Definition Files ", "Active Data Driver Functions " и т.п.



G>Сэнкс за совет, только вот данные мы хранить в ADO Recordset ну ни как не можем.. ;)


G>поэтому вопрос остаётся открытым.... :)


Я неточно выразился. Мы тоже данные хранить в ADO Recordset ну ни как не можем;-) данные у нас тоже берутся из внутренних массивов, и мы складываем их в Recordset непосредственно перед показом отчета,ну а уже Recordset передаем в отчет через метод Report.Database.SetDataSource. И никаких особых тормозов из-за Crystal'а не испытываем.
Re[4]: Cristal Report -производительность.
От: Grizzlick  
Дата: 29.10.01 14:55
Оценка:
Здравствуйте PeterG, Вы писали:


PG>Я неточно выразился. Мы тоже данные хранить в ADO Recordset ну ни как не можем;-) данные у нас тоже берутся из внутренних массивов, и мы складываем их в Recordset непосредственно перед показом отчета,ну а уже Recordset передаем в отчет через метод Report.Database.SetDataSource. И никаких особых тормозов из-за Crystal'а не испытываем.



;) эт уже интереснее.... спасибо за идею....

а небольшого примерчика не будет? или куска вырезанного кода...
Re[5]: Cristal Report -производительность.
От: alex2808 Украина  
Дата: 23.05.02 12:33
Оценка:
Привет всем!
Хочу оживить старый топик, а то самого мучает такой вопрос.
Как с пом.SetDataSource в VC или другим методом передать отчету ADO Recordset.
А то делаю так, хотя понимаю, что через спину голову достаю :)
    pJob = m_crpEngine.OpenJob("FormRecordFull.rpt");
    if(!pJob->SetNthTableLogonInfo(0,  &logonInfo, FALSE)) goto lblError;
    if(!pJob->TestNthTableConnectivity(0)) goto lblError;
    if(!pJob->DiscardSavedData ()) goto lblError;
    if(!pJob->SetSQLQuery("SELECT * FROM FormRecordFull")) goto lblError;

Приходиться выгребать все записи отчета в Recordset и сохранять их в отдельную таблицу а потом задавать SELECT всех записей этой таблицы в SetSQLQuery. :)

Если можно, пример кода.
Всех благ
Re[6]: Cristal Report -производительность.
От: PeterG  
Дата: 24.05.02 05:44
Оценка:
А через какую библиотеку (craxdrt.dll, cpeauto.dll или другую) Вы подключаетесь к Кристалу? Ответ на Ваш вопрос зависит от этого.
Re[7]: Cristal Report -производительность.
От: alex2808 Украина  
Дата: 24.05.02 08:10
Оценка:
Здравствуйте PeterG, Вы писали:

PG>А через какую библиотеку (craxdrt.dll, cpeauto.dll или другую) Вы подключаетесь к Кристалу? Ответ на Ваш вопрос зависит от этого.


Честно говоря, я в этом еще мало понимаю, может поможете разобраться с какой библиотекой?
Я импортирую crpe32m.lib. Посмотрел во все добавленные классы, и там много всяких dll подключается.
Вот код...
#include "crpe.h"
#include "peplus.h"
#include "uxddisk.h"
#include "uxftext.h"

CRPEngine m_crpEngine;
CRPEJob* pJob;
CRPELogOnInfo logonInfo;

strcpy(logonInfo.m_serverName, "RealRep");
strcpy(logonInfo.m_userID, "admin");

pJob = m_crpEngine.OpenJob("FormPricelist.rpt");
if(!pJob->SetNthTableLogonInfo(0,  &logonInfo, FALSE)) goto lblError;
if(!pJob->TestNthTableConnectivity(0)) goto lblError;
if(!pJob->DiscardSavedData ()) goto lblError;

if(!pJob->SetSQLQuery("SELECT * FROM FormPricelist ORDER BY NumRecord")) goto lblError;
if(!pJob->SetMargins (432, 0, 567 /* 1 cm */, 0)) goto lblError;

    CMDIFrameWnd* pWndFrame;
    pWndFrame = (CMDIFrameWnd* )pApp->GetMainWnd();
    if(!pJob->OutputToWindow ("Окно вывода", 10, 20, 500, 300, 
        WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_MAXIMIZE, pWndFrame)) goto lblError;

    if(!pJob->Start()) goto lblError;

    pJob->Close();
    return;

lblError:
    sError = pJob->GetErrorText();
    AfxMessageBox(sError);
    pJob->Close();


Может этот кусок кода что-то скажет.
Заранее благодарен.
Всех благ
Re[8]: Cristal Report -производительность.
От: PeterG  
Дата: 24.05.02 08:52
Оценка:
Теперь понятно. AFAIK тот способ, которым Вы работаете с Кристалом — самый старый, поддерживаемый Кристалом только для совместимости со старыми приложениями. Соответственно, многих новых вещей (в том числе и подсовывания ADO Recordsets) в нем не реализовано. Наиболее новый способ привязаться к Кристалу — через СОМ, конкретно через CRAXDRT.DLL. Код:

#import "msado25.tlb" no_namespace rename("EOF", "EndOfFile")
#import "craxdrt.dll" no_namespace rename("Application","CRApp") rename ("IApplication","ICRApp")
...
IApplicationPtr pApp(__uuidof(CRApp));
IReportPtr pRpt = pApp->OpenReport("report1.rpt")
...
IRecordsetPtr pRs;
_variant_t vtDs(pRs, true);
pRpt->Database->SetDataSource(vtDs, (_variant_t)3L);

Вот вроде и все.
Re[9]: Cristal Report -производительность.
От: Аноним  
Дата: 24.05.02 11:07
Оценка:
Здравствуйте PeterG, Вы писали:

PG>Теперь понятно. AFAIK тот способ, которым Вы работаете с Кристалом — самый старый, поддерживаемый Кристалом только для совместимости со старыми приложениями. Соответственно, многих новых вещей (в том числе и подсовывания ADO Recordsets) в нем не реализовано. Наиболее новый способ привязаться к Кристалу — через СОМ, конкретно через CRAXDRT.DLL. Код:


PG>#import "msado25.tlb" no_namespace rename("EOF", "EndOfFile")

PG>#import "craxdrt.dll" no_namespace rename("Application","CRApp") rename ("IApplication","ICRApp")
PG>...
PG>IApplicationPtr pApp(__uuidof(CRApp));
PG>IReportPtr pRpt = pApp->OpenReport("report1.rpt")
PG>...
PG>IRecordsetPtr pRs;
PG>_variant_t vtDs(pRs, true);
pRpt->>Database->SetDataSource(vtDs, (_variant_t)3L);

PG>Вот вроде и все.


Спасибо... Для меня этот способ совершенно новый. И что ставить вместо многоточия — я даже не догадываюсь :(
Не подскажете, где можно посмотреть примеры реализации, или если не жалко кусок кода, пожалуйста, где можно посмотреть загрузку предварительного просмотра и печати отчета.
Или тут как и по старому методу через CRPEJob надо работать?
Re[10]: Cristal Report -производительность.
От: PeterG  
Дата: 24.05.02 11:26
Оценка:
Примеров не жалко, просто они большие все. Идеология работы с Preview у Кристала слегка изменилась — теперь для этого ActiveX используется и в него надо свой report подсовывать. Если у Вас стоит полная инсталляция Кристала — то с ним примеры должны ставиться. Обычно в директорию
C:\Program Files\Crystal Reports\Samples\Code
Re[11]: Cristal Report -производительность.
От: Аноним  
Дата: 24.05.02 11:36
Оценка:
Здравствуйте PeterG, Вы писали:

PG>Примеров не жалко, просто они большие все. Идеология работы с Preview у Кристала слегка изменилась — теперь для этого ActiveX используется и в него надо свой report подсовывать. Если у Вас стоит полная инсталляция Кристала — то с ним примеры должны ставиться. Обычно в директорию

PG>C:\Program Files\Crystal Reports\Samples\Code
У меня 7 версия. Такого каталога в Samples я не нашел.
Если не трудно и есть возможность, пожалуйста, по адресу
alex2808@ua.fm
архивчик С-шных примеров с этого каталога на Ваш выбор сбросьте.
Re[12]: Cristal Report -производительность.
От: alex2808 Украина  
Дата: 24.05.02 12:37
Оценка:
Да и у меня там одни VB примеры.
Спасибо за посылку... Вот теперь будем разбираться :user:
Всех благ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.