AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.04.2010, 15:07   #1  
Yakuza is offline
Yakuza
Участник
 
124 / 10 (1) +
Регистрация: 26.10.2004
Есть Navision 2.0, при распечатке накладных и счетов-фактур иногда случается такая ситуация: кол-во позиций в счете немного, они все помещаются на одной странице, но "подвал" с подписями и печатями уже не помещается, и т.к. он нарисован в одной секции, он переносится на вторую страницу. Из-за этого начинается ругань, что по правилам положено. чтобы хотя бы одна строка позиций также переносилась на вторую страницу. Или на третью, если позиций много, и они умещаются на двух листах... Ломаю голову, и не могу понять как это сделать. Считать кол-во помещающихся позиций и ставить какой-нибудь счетчик, чтобы в нужный момент вставлять NEWPAGE ? Или можно как-то более кардинально и универсально это решить ?
Старый 07.04.2010, 16:22   #2  
Cheb is offline
Cheb
Участник
Лучший по профессии 2017
 
138 / 13 (1) ++
Регистрация: 22.09.2002
Адрес: Ростов-на-Дону -> Москва
Делали вариант со счетчиком, но честно говоря, получилось очень сложно и нормально не заработало. В итоге пришли к простому решению: в параметры отчета просто добавили галку, которую пользователь указывает в том случае, если нужно перенести одну позицию на последнюю страницу.
Старый 07.04.2010, 19:54   #3  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
спасибо.
чувствую себя идиотом
около 20-ти часов программирования, подбор ДИАПАЗОНОВ значений строк для 1 листа, 2,3,4... коррекция диапазонов при изменении хедера или футера... короче, веселуха была...
Старый 07.04.2010, 20:18   #4  
Yakuza is offline
Yakuza
Участник
 
124 / 10 (1) +
Регистрация: 26.10.2004
Ох, весь день сидел, но что-то вышло. Более-менее работает. Сделал в виде счетчика. Осложняется все тем, что необходимо припереносе печатать промежуточное "итого" на предыдущем листе. Я использовал как своё итого, так и из трансфутера.
Привоже примерно сам алгоритм, т.к форма накладной сто раз переделывалась. Вот, кто захочет, разберется:
Код:
NumLines := COUNT;  // кол-во строк в счете
Exited := NumLines; // оставшееся до конца счета кол-во строк
p1 := 21;           // кол-во строк на первой странице с шапкой, максиамльное
p2 := 22;           // кол-во строк на последующих страницах, после которого надо перносить остаток на следующий лист, чтобы влез "подвал"
p2tot := 45;        // кол-во строк масимальное на второй и последующих страницах
page := 1;          // счетчик номера страницы
QtyItog := 0;       // накопитель кол-ва товара для промежуточного "итого"
AmItog := 0;        // накопитель суммы счета для промежуточного "итого"
NoLine - номер текущей строки.
Код:
OnAfterGetRecord:

IF NumLines > 1 THEN BEGIN  // если всего одна строка, то и так помещается на одном листе
// Определяем, если следующую строку будем переносить на другой лист, то поднимаем флаг для печати "итого" минуя трансфутер
IF (page = 1) THEN BEGIN
                 IF (NumLines <= p1) AND (NumLines = NoLine+1) THEN itog := TRUE ELSE itog := FALSE;
                   END;
IF (page > 1) THEN BEGIN 
                 IF (Exited < p2tot) AND (Exited > (p2-1)) AND (NumLines = NoLine+1) THEN itog := TRUE ELSE itog := FALSE;
                   END;
// Если первая страница, то всегда при кол-ве строк меньше 21 последнюю строку переносить
IF (page = 1) AND (NumLines <= p1) AND (NoLine = NumLines) THEN BEGIN CurrReport.NEWPAGE;
                                                                      page := page + 1;
                                                                      Exited := NumLines - NoLine + 1;
                                                                      END;
// Если вторая и далее - то при оставшихся 45 и менее строках, но больше 21 последнюю строку переносить
IF (page > 1) AND (Exited < p2tot) AND (Exited > (p2-1)) AND (NoLine = NumLines) THEN BEGIN CurrReport.NEWPAGE;
                                                                      page := page + 1;
                                                                      Exited := NumLines - NoLine + 1;
                                                                      END;
// В остальных случаях используется стандартный pagebreak с печатью transfooter (см. код в секции трансфутера)
END;
QtyItog := QtyItog + Quantity; // в накопитель добавляем кол-во и сумму из строки
AmItog := AmItog + Amount;
Код:
В секции стандартного трансфутера добавить код :
OnPostSection:
 page := page + 1;
 Exited := NumLines - NoLine + 1;
Ну и нарисовать новую секцию отображения строки счета и под ней "Итого: QtyItog AmItog", в старой секции условие отображения itog = FALSE, в новой itog = TRUE
Старый 08.04.2010, 10:20   #5  
prefreitor is offline
prefreitor
Участник
 
214 / 11 (1) +
Регистрация: 03.10.2006
Делал подобное) Без счетчиков не обойтись.
Без подитогов основная суть такова:
Код:
// конструкция для переноса последней строки на новую
Counter2 +=1; //Счетчик строк выведенных на странице
Counter +=1;  //Счетчик строк выведенных в док-те
IF ((SL1Count - Counter) = 1)  THEN  BEGIN //ВНИМАНИЕ - последняя строка! Как с ней поступить?
  IF ((CurrReport.PAGENO = 1) AND (Counter2 >= 3)) THEN //Страница №1 и строк вывели уже 3 - значит стартуем новую страницу.
    CurrReport.NEWPAGE;
  IF ((CurrReport.PAGENO > 1) AND (Counter2 >= 13)) THEN
    CurrReport.NEWPAGE;
END;
Если печатаем несколько копий нужно предусмостреть сброс счетчиков. Если печатаем подитогикод немного усложняется, но суть остается)
Старый 08.04.2010, 10:49   #6  
Yakuza is offline
Yakuza
Участник
 
124 / 10 (1) +
Регистрация: 26.10.2004
Цитата:
Сообщение от prefreitor Посмотреть сообщение
Делал подобное) Без счетчиков не обойтись.
Без подитогов основная суть такова:
Код:
// конструкция для переноса последней строки на новую
Counter2 +=1; //Счетчик строк выведенных на странице
Counter +=1;  //Счетчик строк выведенных в док-те
IF ((SL1Count - Counter) = 1)  THEN  BEGIN //ВНИМАНИЕ - последняя строка! Как с ней поступить?
  IF ((CurrReport.PAGENO = 1) AND (Counter2 >= 3)) THEN //Страница №1 и строк вывели уже 3 - значит стартуем новую страницу.
    CurrReport.NEWPAGE;
  IF ((CurrReport.PAGENO > 1) AND (Counter2 >= 13)) THEN
    CurrReport.NEWPAGE;
END;
Если печатаем несколько копий нужно предусмостреть сброс счетчиков. Если печатаем подитогикод немного усложняется, но суть остается)
Ну почти то же самое, только короче.)
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:15.