Олимпиадная задачка – пересечение в NAV
«Мне нужно вывести на экран не все записи. Причем просто фильтрами не обойдешься. Менеджер видит свои сделки + все сделки, подчиненных где он босс.
Грубо говоря, юзер должен видеть все сделки, в которых он фигурирует как менеджер + если ты начальник, то должен видеть все сделки подчиненных менеджеров и менеджеров нижестоящих депратаментов.
Департаменты могут быть разные.
Я Вася Пупкин, должен видеть все свои сделки + сделки Иванова и Петрова, которые работают в соседнем департаменте, который мне подчиняется».
Действительно, как сделать пересечение в NAV (а речь идет именно об этом)? Андрей Мордвяник предлагает следующий вариант решения:
Надо обмануть OnFindRecord и OnNextRecord (см. «Как обмануть NAV»).
1. Получаем два набора (свои и подчиненных).
2. На OnFindRecord и OnNextRecord устанавливаем ключевое поле на первый и второй наборы.
3. Делаем им Next или Find соответственно… обоим!
4. Смотрим, что меньше (чтобы записи шли подряд), и присваиваем текущую запись 1 или 2.
Ограничение – будет работать только с сортировкой по первичному ключу.
OnFindRecord=
///////////////////////////////////////////////////////////////////////
IF IsAdmin() THEN BEGIN
blnFound1 := lRec.FIND(Which);
EXIT(blnFound1);
END;
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) AND (NOT blnFound2) THEN BEGIN
lRec := recLO;
EXIT(TRUE);
END;
IF (NOT blnFound1) AND (blnFound2) THEN BEGIN
lRec := recLO2;
EXIT(TRUE);
END;
IF (NOT blnFound1) AND (NOT blnFound2) THEN
EXIT(FALSE);
IF (blnFound1) AND (blnFound2) THEN BEGIN
IF Which <> '+' THEN BEGIN
IF recLO."Document No." > recLO2."Document No." THEN
lRec := recLO2
ELSE
lRec := recLO;
END ELSE BEGIN
IF recLO."Document No." < recLO2."Document No." THEN
lRec := recLO2
ELSE
lRec := recLO;
END;
EXIT(TRUE);
END;
EXIT(FALSE);
NextRec(VAR lRec : Record "Leasing Order"; Steps : Integer) : Integer
///////////////////////////////////////////////////////////////////////
IF IsAdmin() THEN
EXIT(lRec.NEXT(Steps));
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 intResultSteps1 > 0 THEN BEGIN
IF recLO."Document No." > recLO2."Document No." THEN BEGIN
lRec := recLO2;
EXIT(intResultSteps2);
END ELSE BEGIN
lRec := recLO;
EXIT(ResultSteps1);
END;
END ELSE BEGIN
IF recLO."Document No." < recLO2."Document No." THEN BEGIN
lRec := recLO2;
EXIT(intResultSteps2);
END ELSE BEGIN
lRec := recLO;
EXIT(intResultSteps1);
END;
END;
END;
Может быть, вам не нужно именно такое решение задач в чистом виде, но из него виден принцип. А принцип – это пять!
Код оформлен по правилам венгерской нотации для Navision :)
Заметили ошибку? Можете предложить новый вариант? ЗНАЕТЕ КАК ЛУЧШЕ? Срочно сюда – mailbox@naviart.ru
:-)

Автор: Максим Репин
Количество статей, опубликованных автором: 4. Дополнительная информация об авторе появится вскоре.