Олимпиадная задачка – пересечение в 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. Дополнительная информация об авторе появится вскоре.

Добавить комментарий