Отправляет email-рассылки с помощью сервиса Sendsay

Navision - советы и секреты

  Все выпуски  

Презентация naviart.ru и задача на пересечение в NAV.


Добрый день!

Начну с главной новости :-)

У рассылки появился свой сайт!

NAVIART.RU

Сейчас на нем выложен архив статей из прошлых выпусков. Статьи постоянно дополняются, добавляются примеры и ссылки.
+ еще кое-что, что не попало (и никогда не попадет!) в рассылку :-)

Так что – милости просим на «Navision: технологии как Искусство»!

А в сегодняшнем выпуске – оригинальная и даже, не побоюсь этого слова – олимпиадная! – задачка по NAV.

Пересечение в Navision решается просто, а как объединить записи?

"Мне нужно вывести на экран не все записи. Причем просто фильтрами не обойдешься.
Менеджер видит свои сделки + все сделки, подчиненных где он босс.
Грубо говоря, юзер должен видеть все сделки, в которых он фигурирует как менеджер + если ты начальник,
то должен видеть все сделки подчиненных менеджеров и менеджеров нижестоящих депратаментов.
Департаменты могут быть разные.
Я Вася Пупкин, должен видеть все свои сделки + сделки Иванова и Петрова, которые работают в соседнем департаменте, который мне подчиняется."

Сначала мне даже захотелось отдать задачку на откуп подписчикам, то есть – вам :-)
Но т.к. рассылка все-таки из тех, где отвечают на вопросы, а не задают их, то вот оригинальное решение:

Надо обмануть OnFindRecord и OnNextRecord (об этом был предыдущий выпуск).

1. Получаем 2 набора (свои и подчиненных).
2. на Find и Next устанавливаем ключевое поле на 1 и 2 наборы.
3. Делаем им Next или Find соответственно... обоим!
4. Смотрим, что меньше (чтобы записи шли подряд), и присваиваем текущую запись 1 или 2.

Ограничение - будет работать только с сортировкой по первичному ключу.


OnFindRecord=
BEGIN
  recLO := Rec;
  recLO.SETRANGE("Manager Code", recManager.Code);
  blnFound1 := recLO.FIND(Which);

  recLO2 := lRec;
  IF recManager."Department Filter" <> '' THEN BEGIN
    recLO2.SETFILTER("Department Code", recManager."Department Filter");
    blnFound2 := recLO2.FIND(Which);
  END;

  IF (blnFound1 = FALSE) AND (blnFound2 = FALSE) THEN
    EXIT(FALSE);
  
  IF (blnFound1) AND (NOT blnFound2) THEN BEGIN
    lRec := recLO;
    EXIT(TRUE);
  END;

  IF (NOT blnFound1) AND (blnFound2) THEN BEGIN
    lRec := recLO2;
    EXIT(TRUE);
  END;

  IF (blnFound1 AND blnFound2) THEN BEGIN
    IF recLO."Document No." > recLO2."Document No." THEN 
      lRec := recLO2
    ELSE 
      lRec := recLO;
    EXIT(TRUE);
  END;

  EXIT(FALSE);
END;


OnNextRec(VAR lRec : Record "Leasing Order";Steps : Integer) : Integer
BEGIN

  recLO := lRec;
  recLO2 := lRec;

  recLO.SETRANGE("Manager Code", recManager.Code);
  intResultSteps1 := recLO.NEXT(Steps);

  IF recManager."Department Filter" <> '' THEN BEGIN
    recLO2.SETFILTER("Department Code", recManager."Department Filter");
    intResultSteps2 := recLO2.NEXT(Steps);
  END;

  IF (intResultSteps1 <> 0) AND (intResultSteps2 = 0) THEN BEGIN
    lRec := recLO;
    EXIT(intResultSteps1);
  END;

  IF (intResultSteps1 = 0) AND(intResultSteps2 <> 0) THEN BEGIN
    lRec := recLO2;
    EXIT(intResultSteps2);
  END;

  IF (intResultSteps1 <> 0) AND (intResultSteps2 <> 0) THEN BEGIN
    IF recLO."Document No." > recLO2."Document No." THEN BEGIN
      lRec := recLO2;
      EXIT(intResultSteps2);
    END ELSE BEGIN
      lRec := recLO;
      EXIT(intResultSteps1);
    END;
  END;
  
END;
  

Может быть, вам не нужно именно это решение в чистом виде, но из него виден принцип. А принцип - это пять!

На сегодня все. В конце добавлю – основным проектом была и остается рассылка, и все новые статьи попадают сначала сюда, а уж потом на сайт :-)


P.S. Хотите поделиться своими знаниями? Всегда Welcome! Любые статьи, Q & A, FAQ, советы - все опубликуем, обязательно укажем автора и дадим линк на сайт :-)

С наилучшими пожеланиями,
Андрей Стрельников.

Группа «Технологии как Искусство».
Разработки в сфере Navision. Скоростные и суперскоростные оптимизации, системная интеграция.
www: http://naviart.ru
e-mail: mailbox@naviart.ru.

-------
Что такое главное?


В избранное