Футер в разрыве данных
Доброго дня! Возникла такая интересная проблема:
Есть 2 датасета связанных мастер-детайл. Соответсвенно в отчета 2 бенда, для мастера и для детайл. Для мастера вставлен GroupHeader у которого указано каждый раз начинать с новой страницы. Таким образом решается задача что записи детайл для каджого мастера начинаются с новой страницы. Собственно вопрос в том, что надо вставить некий футер, который будет выводиться только в том случае, если для одного мастера не умещаются все данные на одной странице, а переходят на следующую. Но если данные детайл для мастера заканчиваются на странице, в ее конце этого футера быть не должно. Пример:
ПРичем обычный PageFooter уже есть и используется на каждой странице.
Есть 2 датасета связанных мастер-детайл. Соответсвенно в отчета 2 бенда, для мастера и для детайл. Для мастера вставлен GroupHeader у которого указано каждый раз начинать с новой страницы. Таким образом решается задача что записи детайл для каджого мастера начинаются с новой страницы. Собственно вопрос в том, что надо вставить некий футер, который будет выводиться только в том случае, если для одного мастера не умещаются все данные на одной странице, а переходят на следующую. Но если данные детайл для мастера заканчиваются на странице, в ее конце этого футера быть не должно. Пример:
---- Страница 1
[Мастер1]
-- детейл (Мастер1) 1
-- детайл (Мастер1) 2
.....
-- детайл (Мастер1) N
----- Страница 2
[Мастер 2]
-- детейл (Мастер2) 1
-- детайл (Мастер2) 2
.....
-- детайл (Мастер2) M
[тот самый нужный футер]
----- Страница 3
-- детайл (Мастер2) M+1
-- детайл (Мастер2) M+2
....
-- детайл (Мастер2) M+N
ПРичем обычный PageFooter уже есть и используется на каждой странице.
Комментарии
DataSet = null
RowCount = 1.
Stretched = true.
Туда же добавьте Memo_MasterData3
Для этого датасета создайте GroupHeader3 и GroupFooter3 (Height=0)
В обработчике GroupHeader2OnAfterCalcHeight напишите строчку
MasterData3.RowCount :=Round(abs((Engine.FreeSpace - 20) div Memo_MasterData3.Height));
(лучше не использовать MasterData3.Height, т.к. эта высота будет различной).
Эта практика подходит для одинакового размера Memo_MasterData3. Для разного размера - данный способ не подойдёт, т.к. невозможно точно высчитать RowCount и придётся рисовать всё содержимое MasterData3 вручную (где-то в руководстве программиста есть раздел посвящённый прорисовке отчёта вручную).
В том блоке, который у меня как пример, под [Мастер1] и [Мастер2] я имел ввиду записи одного бэнда. То есть как отчет формируется, а не как в дизайне.
А вот Engine.FreeSpace - это сколько сводобного места осталось на странице текущей?
Если проблема разобраться - пришлите шаблон вашего отчёта, гляну структуру.