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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.11.2011, 15:46   #1  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Опять ситуация: то ли лыжи не едут, то ли я .... ;-/
Догадываюсь, что где-то чего-то я крывенько сделала. Помогите, плиз, разобраться где и как это исправить. Сразу поршу порщения, что многа букафф.
Начну с предистории. Есть у нас отчет один: к заказу печатает Packing list (Packzettel) со штрих-кодами. Захотелось кладовщику склада зап.частей печатать кроме Packing list еще и Return list. Выглядят они практически одинаково, только несколько различается текст в шапке и Footer отчета.
Дабы не плодить два почти одинаковых отчета, решила я совместить 2 в 1, а именно в Request Form юзер выбирает какой из отчетов хочет печатать. Для этого создана переменная WasDrucken типа Option и на Request Form созданы соотв. контролы.
Кр.того, поскольку обычно надо печатать оба отчета, то было высказано пожелание печатать всё за один раз. Поэтому переменная WasDrucken имеет три значения:
0 - Packing list
1 - Return list
2 - Both (т.е. должны быть напечатаны оба варианта один за другим, но, разумеется, каждый с нового листа)

В отчете есть след. DataItems:
Код:
DataItem               Name
Integer                DruckVariante
  Sales Header         Verkaufsrechnungskopf
    Integer            KopieSchleife
      Integer          SeiteSchleife
        Sales Line     <Sales Line>
          и проч.
Дальше начинается самое интересное. Если WasDrucken = Packing list, то всё печататется как полагается.
Если = Return list, тогда два раза на печать выводится секция для ВТОРОЙ страницы, вместо того, чтобы один раз вывести секцию для первой (с футером всё в порядке - он выводтся правильно)
Если = Both, то Packing list распечатывается правильно, а Return list - см. предыдущий пункт
В разделе секций имеем след. секции:
> > >SeiteSchleife, Header (1) - шапка для Return list (для страницы 1)
> > >SeiteSchleife, Header (2) - шапка для Packing list (для страницы 1)
> > >SeiteSchleife, Header (3) - шапка для второй страницы (обоих отчетов)
> > >SeiteSchleife, Header (4) - еще для чего-то
> > > >Sales Line, Body (1)...(4) - тут понятно что
и проч.

Вот так выглядят триггеры для секций:
Код:
SeiteSchleife, Header (1) - OnPreSection()
//CurrReport.SHOWOUTPUT(CurrReport.PAGENO = 1);
1) pgno := CurrReport.PAGENO;
2) CurrReport.SHOWOUTPUT((CurrReport.PAGENO = 1) AND (NOT PackZettel));
3) pgno := CurrReport.PAGENO;


SeiteSchleife, Header (2) - OnPreSection()
//CurrReport.SHOWOUTPUT(CurrReport.PAGENO = 1);
pgno := CurrReport.PAGENO;
CurrReport.SHOWOUTPUT((CurrReport.PAGENO = 1) AND PackZettel);


SeiteSchleife, Header (3) - OnPreSection()
pgno := CurrReport.PAGENO;
CurrReport.SHOWOUTPUT(CurrReport.PAGENO <> 1);
pgno := CurrReport.PAGENO;


SeiteSchleife, Header (4) - OnPreSection()
pgno := CurrReport.PAGENO;
CurrReport.SHOWOUTPUT((Kopf_Liefernan <> '') AND (CurrReport.PAGENO = 1));
pgno := CurrReport.PAGENO;
Запустила с отладчиком. Выяснилось: для Packing list всё отрабатывает как и должно быть, а вот для Return list последовательность выполнения триггеров следующая:
Заходит в триггер SeiteSchleife, Header (1) - OnPreSection()
(для удобства я пронумеровала строки и в доп. переменную pgno считываю номер текущей страницы. Буду писать последовательность выполнения и чему равна эта переменная)
1) pgno = 1
2) pgno = 1
3) pgno = 1
после выполнения третьей строки снова переходит на первую
1) Pgno = 2
2) Pgno = 2
3) Pgno = 2

Вопрос: почему он вернулся снова в начало этого триггера, вместо того чтобы перейти к выполнению триггеров для остальных секций Header(2)...(4)?

После втрого "прохода" триггера SeiteSchleife, Header (1) - OnPreSection()
выполняются последовательно:
SeiteSchleife, Header (2) - OnPreSection()
SeiteSchleife, Header (3) - OnPreSection()
SeiteSchleife, Header (4) - OnPreSection()

Потом (почему-то ;-/) опять:
SeiteSchleife, Header (2) - OnPreSection()
SeiteSchleife, Header (3) - OnPreSection()
SeiteSchleife, Header (4) - OnPreSection()

Вопрос: почему он вернулся снова на вторую секцию?

Потом выполнение триггеров идет по нормальной логике:
Sales Line - OnPreDataItem()
Sales Line - OnAfterGetRecord()
Sales Line, Body (1) - OnPreSection()
Sales Line, Body (2) - OnPreSection()
и т.д.

Написала тут много, но, догадываюсь, что ответ будет довольно простым и коротким
Старый 08.11.2011, 17:19   #2  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Экспериментировала я долго и нудно. Вот что обнаружила: если я в той злополучной секции Header (1) поменяю параметр KeepWithNext с Yes на No, тогда печатает всё корректно.
Но почему оно так, я так и не въехала Может кто объяснить?
Замечу, что у секции Header (2) этот параметр = Yes, но эту секцию выводит корректно
 


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

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

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