Казалось бы простой вопрос ...
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Привет сообществу !
Столкнулся с казалось бы простой задачей - должна печататься накладная с итогом по каждому листу и общим итогом.
Все хорошо создается и печатается - но итог по листу на последней странице невозможно (?!) заставить печататься перед общим итогом по всему отчету ! Он МОЖЕТ ПЕЧАТАТЬСЯ ТОЛЬКО В КОНЦЕ ОТЧЕТА !
Третий день долблюсь - может кто подскажет ?
Спасибо, за понимание ... Виктор
Столкнулся с казалось бы простой задачей - должна печататься накладная с итогом по каждому листу и общим итогом.
Все хорошо создается и печатается - но итог по листу на последней странице невозможно (?!) заставить печататься перед общим итогом по всему отчету ! Он МОЖЕТ ПЕЧАТАТЬСЯ ТОЛЬКО В КОНЦЕ ОТЧЕТА !
Третий день долблюсь - может кто подскажет ?
Спасибо, за понимание ... Виктор
Да, я смотрел архив. Ничего так и не нашел.
Я понимаю, что Clarion пишется не "по нас", но ведь
на самом деле опция "Печатать на последнем листе Page Footer
перед итогом по всему отчету" решила бы проблему ...
А правила оформления документов они и в Африке такие же ...
Неужели никто не нашел решения ?!
Виктор
Я понимаю, что Clarion пишется не "по нас", но ведь
на самом деле опция "Печатать на последнем листе Page Footer
перед итогом по всему отчету" решила бы проблему ...
А правила оформления документов они и в Африке такие же ...
Неужели никто не нашел решения ?!
Виктор
- StillZero
- Ветеран
- Сообщения: 454
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Контактная информация:
для ABC:
1. Отказаться от PAGE FOOTER
2. Сделать вместо PAGE FOOTER - DETAIL. Надо установить галку PageAfter, для того, чтобы следующая страница печаталась с нового листа. В моем случае этого было достаточно, т.е. окончательные итоги у меня печатаются на отдельном листе. Как я понимаю, для вас это неприемлимо. Поэтому, я думаю, есть как минимум два варианта: устанавливать для последней страницы PROP:PageAfter или сделать еще один такой же DETAIL без атрибута PageAfter.
3. У DETAIL-а должен быть выставлен в свойствах отчета на закладке Filters фильтр (текст) FALSE - для того чтобы не печатать detail каждый раз, будем печатать его руками (я так понял, что эта процедура вам знакома). Естественно, что у detail-а должен присутствовать FEQ, например, ?DetailPageFooter.
4. Суть: полюбому известно сколько примерно будет строк на странице отчета, небольшую коррективу вносят разные принтеры, но минимум можно подобрать, на край можно вынести это в настроки отчета, допустим минимум на странице помещается 10 строк основного detail-а, естественно, что на странице должно остаться место для печати страничных итогов.
5. В точке вставки ProcessManager/TakeRecord после ParentCall(для легаси по моему AfterNextRecordRetrieval - могу ошибаться) пишем код:
Т.е. в этом месте идет расчет переменных, которые выводятся на detail и если количество основных строк отчета достигает установленного предела, то печатаем итоги, а потом их обнуляем. Переход на след. страницу произойдет полюбому.
6. В точке вставки WindowManager/TakeCloseEvent до ParentCall (в легаси BeforeCloseReport вроде) пишем:
т.е. после того как весь отчет напечатан, проверяем есть ли на последней странице основные строки, если есть, то печатаем страничные итоги и печатаем потом общие итоги.
Написал много вроде, делать быстрее.
...удачи
Написал: PAA(27)
1. Отказаться от PAGE FOOTER
2. Сделать вместо PAGE FOOTER - DETAIL. Надо установить галку PageAfter, для того, чтобы следующая страница печаталась с нового листа. В моем случае этого было достаточно, т.е. окончательные итоги у меня печатаются на отдельном листе. Как я понимаю, для вас это неприемлимо. Поэтому, я думаю, есть как минимум два варианта: устанавливать для последней страницы PROP:PageAfter или сделать еще один такой же DETAIL без атрибута PageAfter.
3. У DETAIL-а должен быть выставлен в свойствах отчета на закладке Filters фильтр (текст) FALSE - для того чтобы не печатать detail каждый раз, будем печатать его руками (я так понял, что эта процедура вам знакома). Естественно, что у detail-а должен присутствовать FEQ, например, ?DetailPageFooter.
4. Суть: полюбому известно сколько примерно будет строк на странице отчета, небольшую коррективу вносят разные принтеры, но минимум можно подобрать, на край можно вынести это в настроки отчета, допустим минимум на странице помещается 10 строк основного detail-а, естественно, что на странице должно остаться место для печати страничных итогов.
5. В точке вставки ProcessManager/TakeRecord после ParentCall(для легаси по моему AfterNextRecordRetrieval - могу ошибаться) пишем код:
Код: Выделить всё
if loc:Counter=10
print(RPT:DetailCтраничныхИтогов)
loc:Counter=0
loc:Переменная для итогов=0
end
loc:Counter+=1
loc:Переменная для итогов+=Переменная файла
6. В точке вставки WindowManager/TakeCloseEvent до ParentCall (в легаси BeforeCloseReport вроде) пишем:
Код: Выделить всё
if loc:Counter<>0
print(RPT:DetailCтраничныхИтоговБезPageAfter)
end
print(RPT:DetailОбщиеИтоги)
Написал много вроде, делать быстрее.
...удачи
Написал: PAA(27)
Все очень хорошо и понятно, спасибо.
Практически это означает сформировать отчет вручную -
ну и что, нет проблем. Я в свое время это пыталась сделать.
Есть, по крайне мере у меня, одна проблема - переменная
высота DETAIL (товары в накладной могут печататься в
несколько строк) - которая делает невозможным расчет
кол-во строк на листе в принципе. Увы ! А узнать когда
наступил конец листа - нельзя - это событие происходит
внутри оператора print(RPT:DETAIL) и "выбить" его оттуда
нельзя.
ТАТА
Практически это означает сформировать отчет вручную -
ну и что, нет проблем. Я в свое время это пыталась сделать.
Есть, по крайне мере у меня, одна проблема - переменная
высота DETAIL (товары в накладной могут печататься в
несколько строк) - которая делает невозможным расчет
кол-во строк на листе в принципе. Увы ! А узнать когда
наступил конец листа - нельзя - это событие происходит
внутри оператора print(RPT:DETAIL) и "выбить" его оттуда
нельзя.
ТАТА
- StillZero
- Ветеран
- Сообщения: 454
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Контактная информация:
переменная высота detail - это в смысле text box, который расширяется в зависимости от текста ?
можно также обойти: неиспользовать text box. Использовать string и два detail-а.
В string известно максимальное количество букв, которое "влазит" в колонку, т.е. допустим 60.
Два detail-а - это один обычный с цифрами со string loc:PartName, второй как бы пустой только со строкой loc:AnotherPartName.
Суть: в embeds ProcessManager/TakeRecord узнаем превышает ли наименование 60 символов. Если нет, то loc:PartName=ИскомаяСтрока и все ок. Если прывышает, то разбиваем строку на строки максимум по 60 символов, обрезая по пробелу. Получим несколько строк. И печатаем их в цикле:
Я так всегда делаю и все красиво.
Вот код деления строки на две, далее можно оставшуюся строку поделить еще раз и так далее.
Все просто...удачи
Написал: PAA(27)
можно также обойти: неиспользовать text box. Использовать string и два detail-а.
В string известно максимальное количество букв, которое "влазит" в колонку, т.е. допустим 60.
Два detail-а - это один обычный с цифрами со string loc:PartName, второй как бы пустой только со строкой loc:AnotherPartName.
Суть: в embeds ProcessManager/TakeRecord узнаем превышает ли наименование 60 символов. Если нет, то loc:PartName=ИскомаяСтрока и все ок. Если прывышает, то разбиваем строку на строки максимум по 60 символов, обрезая по пробелу. Получим несколько строк. И печатаем их в цикле:
Код: Выделить всё
loop i#=1 to КолвоСтрок
loc:AnotherPartName=Часть строки
print(RPT:Detail2)
end
Вот код деления строки на две, далее можно оставшуюся строку поделить еще раз и так далее.
Код: Выделить всё
! sLenght - максимальная длина строки
loop i#=sLenght to 0 by -1 ! шагаем по строке назад до 1-ого пробела
if InputStr[i#]=' ' then break.
end
FStr=sub(InputStr,1,i#)
SStr=sub(InputStr,i#+1,len(InputStr))
Написал: PAA(27)
Действительно интересно - такой вариант даже в голову не приходил.
Использование TEXT BOX (как Вы абсолютно правильно заметили), удобно еще и из-за того, что разделение на строки производиться автоматически и более-менее корректно при создании отчета различными шрифтами (пользователю разрешается самостоятельно выбрать шрифт для отчета).
Но ... этим можно пожертвовать, ради решения проблемы с итогом по листу.
Мне подходит, спасибо - буду пробовать.
Насчет автора темы - не знаю ...
C уважением, ТАТА
Использование TEXT BOX (как Вы абсолютно правильно заметили), удобно еще и из-за того, что разделение на строки производиться автоматически и более-менее корректно при создании отчета различными шрифтами (пользователю разрешается самостоятельно выбрать шрифт для отчета).
Но ... этим можно пожертвовать, ради решения проблемы с итогом по листу.
Мне подходит, спасибо - буду пробовать.
Насчет автора темы - не знаю ...
C уважением, ТАТА
Добрый день.
Ты не написал, как все делал. Судя по всему, в твоем случае надо сделать детальку для печати итогов на последней странице, аналогичной каждой странице (если она есть, еще проще). Печатаешь ее перед общим итогом и далее противный итог по листу делаешь невидимым, типа Report$?TotalSheet{PROP:Hide} = 1. Где ?TotalSheet группа куда надо поместить все хозяйство итогов по листу.
Удачи. Сергей
Написал: ClaList(2)
Ты не написал, как все делал. Судя по всему, в твоем случае надо сделать детальку для печати итогов на последней странице, аналогичной каждой странице (если она есть, еще проще). Печатаешь ее перед общим итогом и далее противный итог по листу делаешь невидимым, типа Report$?TotalSheet{PROP:Hide} = 1. Где ?TotalSheet группа куда надо поместить все хозяйство итогов по листу.
Удачи. Сергей
Написал: ClaList(2)