Изменить порядок страниц
Здраствуйте...
Возник еще один вопрос....
Как мне можно изменить порядок выводимых страниц в отчета?
Допустим есть 6 страниц с какими-то данными... так вот как мне сделать, чтобы они показывались (и соответсвенно печатались) в окне превью в моем, предустановленном порядке, к примеру так - 1,4,2,5,3,6?
Какие события надо ловить и что менять?
Спасибо...
Возник еще один вопрос....
Как мне можно изменить порядок выводимых страниц в отчета?
Допустим есть 6 страниц с какими-то данными... так вот как мне сделать, чтобы они показывались (и соответсвенно печатались) в окне превью в моем, предустановленном порядке, к примеру так - 1,4,2,5,3,6?
Какие события надо ловить и что менять?
Спасибо...
Комментарии
P.S.
Делать это надо до построения отчёта.
я имел ввиду, изменить порядок уже сгенерированных страниц...
допустим имею 3 страницы на которых есть MasterDat`ы с разными полями из одной таблицы. При выводе в превью каждая страничка "расширяется" данными на 4 листа.... то есть итого получается 12 страниц. так вот изменить этот порядок? До вызова ShowReport() их разумеется нет в листе объектов frxReport1.
Там все property READ ONLY, так что вам нужно искать другой путь.
генерирую !все! страницы в памяти, заполняю матрицой ячеек с нужными значениями.... но скорость работы - убийственная....... клиент подохнет моментом....
Хотя, гораздо проще, сформировать всего 3-4страницы, посадить на них мастердата, закидать мемки с нужными полями и пусть себе генерит странички... а потом рассортировать их в необходимом порядке....
Ну неужели нет решения, господа разработчики?.....
Ну просто оооочень не хочется переходить на квикрепорт (других альтернатив нету)....хотя на том же квикрепорте реализовал тот же алгоритм, но как там рассортировать страницы еще большая загадка, чем в фастрепорте....
Ну уважаемые девелоперы, ну плиз! оч нада
1. Сначала генерирую динамичесский массив с записями, в которых по определенным правилам раскидываются все поля на страницы. Каждая запись содержит в себе координаты и высоту/ширину для мемо, выравнивание, рамку, привязку к датасету и полю, номер страницы. Тем самым, мы точно знаем сколько страниц займет один блок данных.
2. В цикле создаю новые страницы в отчете. На странице хедер, футер и мастердата. На мастердату создаю мемки из массива.
3. Подготавливаем отчет PrepareReport.
4. Получаем количество получившихся страниц.
5. Теперь начинается самое интересное. нам нужно отсортировать получившиеся страницы, таким образом, чтобы выводился отчет по блокам страниц. Для этого используем еще один временный отчет.
6. Сортировка - приведу код.
Заполняем временный отчет пустыми страницами. Количество берется из основного отчета: Затем просто заменяем страницы в новом отчете, страницами в нужном порядке из старого:
7. Осталось только показать временный отчет ShowPreparedReport.
Воть..... теперь о минусах и плюсах.
Плюсы:
.Скорость генерации страниц - хорошая.
.Скорость сортировки - хорошая
.Скорость генерации и отрисовки раз в 5 выше чем у CrossView (он тоже умеет переносить поля и отрисовывать все в нужном порядке)
. Проход по приходящему корсору (датасету) происходит один раз.
Минусы:
Боюсь даж говорить ...
.Нам необходимо полность подготовить основной отчет. На это уходит время.
.Нужно пользовать временный отчет =( (я не нашел другого решения)
.Отжирается немерянное количество памяти =(
. Нужно попробовать сделать тоже самое в QuickReport
Вот такой вот расклад. Остаются еще несколько вопросов.
К примеру, EngineOptions.UseFileCache = true и EngineOptions.MaxMemSize, кажется некорректно работают... память все равно "кушается" очень дико. Но с 1000-5000 записями вроде нормально все кешируется и не превышает 23Мб....
Надеюсь, что есть другое, более быстрое и изящное решение задачи, буду ооочень рад, если кто поделится.
1. frxReport1.PrepareReport;
2. добавил в конец отчета равное исходому
PageCount:=frxReport1.PreviewPages.Count;
for i := 0 to PageCount - 1 do frxReport1.PreviewPages.AddEmptyPage(PageCount);
// здесь пришлось поправить баг в frxPreviewPages.AddEmptyPage. Найдете легко... там всего 3 строчки))
3. по своему алгоритму скопировал в хвост отчета на новые пустые места страницы
for i:=0 to PageCount-1 do
begin
indexTo:=<вычислить по нужному алгоритму>
frxReport1.PreviewPages.ModifyPage(PageCount+IndexTo, frxReport1.PreviewPages.Page);
end;
4. удалил исходные
for i:=0 to PageCount-1 do
frxReport1.PreviewPages.deletePage(0);
по скорости - если не знать - не заметить добавки кода
неплохо бы перенести в FAQ
Подскажите какой баг Вы там исправили.
Вероятно, изменил расположение вставляемой страницы.