Казалось бы простой вопрос ...

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Привет сообществу !

Столкнулся с казалось бы простой задачей - должна печататься накладная с итогом по каждому листу и общим итогом.
Все хорошо создается и печатается - но итог по листу на последней странице невозможно (?!) заставить печататься перед общим итогом по всему отчету ! Он МОЖЕТ ПЕЧАТАТЬСЯ ТОЛЬКО В КОНЦЕ ОТЧЕТА !

Третий день долблюсь - может кто подскажет ?

Спасибо, за понимание ... Виктор
Гость

Сообщение Гость »

На самом деле это непростая задача.Она уже обуждалась на форуме.См.архивы форума.
Гость

Сообщение Гость »

Да, я смотрел архив. Ничего так и не нашел.
Я понимаю, что Clarion пишется не "по нас", но ведь
на самом деле опция "Печатать на последнем листе Page Footer
перед итогом по всему отчету" решила бы проблему ...
А правила оформления документов они и в Африке такие же ...

Неужели никто не нашел решения ?!

Виктор
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Сообщение StillZero »

для 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 - могу ошибаться) пишем код:

Код: Выделить всё

if loc:Counter=10 
   print(RPT:DetailCтраничныхИтогов)
   loc:Counter=0
   loc:Переменная для итогов=0
end
loc:Counter+=1
loc:Переменная для итогов+=Переменная файла
Т.е. в этом месте идет расчет переменных, которые выводятся на detail и если количество основных строк отчета достигает установленного предела, то печатаем итоги, а потом их обнуляем. Переход на след. страницу произойдет полюбому.
6. В точке вставки WindowManager/TakeCloseEvent до ParentCall (в легаси BeforeCloseReport вроде) пишем:

Код: Выделить всё

if loc:Counter<>0
   print(RPT:DetailCтраничныхИтоговБезPageAfter)
end
print(RPT:DetailОбщиеИтоги)
т.е. после того как весь отчет напечатан, проверяем есть ли на последней странице основные строки, если есть, то печатаем страничные итоги и печатаем потом общие итоги.

Написал много вроде, делать быстрее.
...удачи
Написал: PAA(27)
Гость

Сообщение Гость »

Все очень хорошо и понятно, спасибо.
Практически это означает сформировать отчет вручную -
ну и что, нет проблем. Я в свое время это пыталась сделать.
Есть, по крайне мере у меня, одна проблема - переменная
высота DETAIL (товары в накладной могут печататься в
несколько строк) - которая делает невозможным расчет
кол-во строк на листе в принципе. Увы ! А узнать когда
наступил конец листа - нельзя - это событие происходит
внутри оператора print(RPT:DETAIL) и "выбить" его оттуда
нельзя.

ТАТА
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Сообщение StillZero »

переменная высота detail - это в смысле text box, который расширяется в зависимости от текста ?
:) можно также обойти: неиспользовать 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 уважением, ТАТА
Гость

Сообщение Гость »

Добрый день.

Ты не написал, как все делал. Судя по всему, в твоем случае надо сделать детальку для печати итогов на последней странице, аналогичной каждой странице (если она есть, еще проще). Печатаешь ее перед общим итогом и далее противный итог по листу делаешь невидимым, типа Report$?TotalSheet{PROP:Hide} = 1. Где ?TotalSheet группа куда надо поместить все хозяйство итогов по листу.

Удачи. Сергей
Написал: ClaList(2)
Ответить