создаётся я большой отчёт ( 400 страниц и больше ).По времени это занимает несколько часов, да и памяти жрётся немерено. Все данные беру не из базы данных, а из внутреннего массива,поэтому использую AddTextObject(...).
Кто-нибудь работал с такими большими отчётами?
Можно ли как-нибудь оптимизировать и ускорить сохранение?
Попробуйте данные хранить в ADO Recordset, а потом передавать их в отчет через метод Report.Database.SetDataSource. У нас достаточно быстро работают отчеты > 1000000 записей (около 20 000 страниц). Посмотрите в Сrystal Reports Help статьи "Creating Data Definition Files ", "Active Data Driver Functions " и т.п.
Здравствуйте PeterG, Вы писали:
PG>Попробуйте данные хранить в ADO Recordset, а потом передавать их в отчет через метод Report.Database.SetDataSource. У нас достаточно быстро работают отчеты > 1000000 записей (около 20 000 страниц). Посмотрите в Сrystal Reports Help статьи "Creating Data Definition Files ", "Active Data Driver Functions " и т.п.
Сэнкс за совет, только вот данные мы хранить в ADO Recordset ну ни как не можем.. ;)
Здравствуйте 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'а не испытываем.
PG>Я неточно выразился. Мы тоже данные хранить в ADO Recordset ну ни как не можем;-) данные у нас тоже берутся из внутренних массивов, и мы складываем их в Recordset непосредственно перед показом отчета,ну а уже Recordset передаем в отчет через метод Report.Database.SetDataSource. И никаких особых тормозов из-за Crystal'а не испытываем.
;) эт уже интереснее.... спасибо за идею....
а небольшого примерчика не будет? или куска вырезанного кода...
Привет всем!
Хочу оживить старый топик, а то самого мучает такой вопрос.
Как с пом.SetDataSource в VC или другим методом передать отчету ADO Recordset.
А то делаю так, хотя понимаю, что через спину голову достаю :)
Приходиться выгребать все записи отчета в Recordset и сохранять их в отдельную таблицу а потом задавать SELECT всех записей этой таблицы в SetSQLQuery. :)
Здравствуйте PeterG, Вы писали:
PG>А через какую библиотеку (craxdrt.dll, cpeauto.dll или другую) Вы подключаетесь к Кристалу? Ответ на Ваш вопрос зависит от этого.
Честно говоря, я в этом еще мало понимаю, может поможете разобраться с какой библиотекой?
Я импортирую crpe32m.lib. Посмотрел во все добавленные классы, и там много всяких dll подключается.
Вот код...
Теперь понятно. AFAIK тот способ, которым Вы работаете с Кристалом — самый старый, поддерживаемый Кристалом только для совместимости со старыми приложениями. Соответственно, многих новых вещей (в том числе и подсовывания ADO Recordsets) в нем не реализовано. Наиболее новый способ привязаться к Кристалу — через СОМ, конкретно через CRAXDRT.DLL. Код:
Здравствуйте 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 надо работать?
Примеров не жалко, просто они большие все. Идеология работы с 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
архивчик С-шных примеров с этого каталога на Ваш выбор сбросьте.