Сейчас на нем выложен архив статей из прошлых выпусков. Статьи постоянно дополняются, добавляются примеры и ссылки.
+ еще кое-что, что не попало (и никогда не попадет!) в рассылку :-)
А в сегодняшнем выпуске – оригинальная и даже, не побоюсь этого слова – олимпиадная! – задачка по 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 BEGINIF 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 BEGINIF 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.