07.04.2010, 15:07 | #1 |
Участник
|
Есть Navision 2.0, при распечатке накладных и счетов-фактур иногда случается такая ситуация: кол-во позиций в счете немного, они все помещаются на одной странице, но "подвал" с подписями и печатями уже не помещается, и т.к. он нарисован в одной секции, он переносится на вторую страницу. Из-за этого начинается ругань, что по правилам положено. чтобы хотя бы одна строка позиций также переносилась на вторую страницу. Или на третью, если позиций много, и они умещаются на двух листах... Ломаю голову, и не могу понять как это сделать. Считать кол-во помещающихся позиций и ставить какой-нибудь счетчик, чтобы в нужный момент вставлять NEWPAGE ? Или можно как-то более кардинально и универсально это решить ?
|
|
07.04.2010, 16:22 | #2 |
Участник
|
Делали вариант со счетчиком, но честно говоря, получилось очень сложно и нормально не заработало. В итоге пришли к простому решению: в параметры отчета просто добавили галку, которую пользователь указывает в том случае, если нужно перенести одну позицию на последнюю страницу.
|
|
07.04.2010, 19:54 | #3 |
Administrator
|
спасибо.
чувствую себя идиотом около 20-ти часов программирования, подбор ДИАПАЗОНОВ значений строк для 1 листа, 2,3,4... коррекция диапазонов при изменении хедера или футера... короче, веселуха была... |
|
07.04.2010, 20:18 | #4 |
Участник
|
Ох, весь день сидел, но что-то вышло. Более-менее работает. Сделал в виде счетчика. Осложняется все тем, что необходимо припереносе печатать промежуточное "итого" на предыдущем листе. Я использовал как своё итого, так и из трансфутера.
Привоже примерно сам алгоритм, т.к форма накладной сто раз переделывалась. Вот, кто захочет, разберется: Код: NumLines := COUNT; // кол-во строк в счете Exited := NumLines; // оставшееся до конца счета кол-во строк p1 := 21; // кол-во строк на первой странице с шапкой, максиамльное p2 := 22; // кол-во строк на последующих страницах, после которого надо перносить остаток на следующий лист, чтобы влез "подвал" p2tot := 45; // кол-во строк масимальное на второй и последующих страницах page := 1; // счетчик номера страницы QtyItog := 0; // накопитель кол-ва товара для промежуточного "итого" AmItog := 0; // накопитель суммы счета для промежуточного "итого" Код: 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; |
|
08.04.2010, 10:20 | #5 |
Участник
|
Делал подобное) Без счетчиков не обойтись.
Без подитогов основная суть такова: Код: // конструкция для переноса последней строки на новую 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 |
Участник
|
Цитата:
Сообщение от 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; |
|