|
13.06.2006, 11:16 | #1 |
Участник
|
Люди! Подскажите пожалуйста, есть решение применения в Navision так называемых "исключающих фильтров"? То есть, используя FILTERGROUP, я хочу ограничить видимость для пользователей плана счетов. Есть диапазоны, которые пользователь не должен видеть при определенном мной условии.
типа: Пользователь1 видит план счетов (<>счет100..счет105) Пользователь2 видит план счетов (<>счет101..счет106) |
|
13.06.2006, 12:12 | #2 |
Участник
|
а в чем проблема?
записываете фильтры в таблицу, например, User Setup, а потом в коде ставите ваш FILTERGROUP и SETFILTER на G/L Account со значением из User Setup для данного пользователя. |
|
13.06.2006, 12:45 | #3 |
Участник
|
Цитата:
Мне надо, чтобы польз. видел все, кроме указанного фильтра (в этом "исключение"). |
|
13.06.2006, 12:59 | #4 |
Участник
|
Ну дык, SETFILTER понимает сложный фильтр, в том числе и исключение
|
|
13.06.2006, 22:51 | #5 |
Administrator
|
имхо фильтр
<>счет1..счет10 действительно не покатит я пользуюсь: <>счет1&<>счет2&<>счет3&<>счет4&<>счет5 |
|
13.06.2006, 23:49 | #6 |
Участник
|
Или проще поменять фильтр - на (..99|106..) - получаем исключение для <>100..105
(..100|107..) - исключение для <>101..106. |
|
14.06.2006, 13:53 | #7 |
Administrator
|
Галина!
точно! умница! а я тупой хехе но это только для ОДНОГО закрываемого диапазона а если надо закрыть 100..106 и 120..124? |
|
14.06.2006, 14:18 | #8 |
Участник
|
Попробую угадать
..99|106..119|125.. |
|
14.06.2006, 19:38 | #9 |
Administrator
|
уговорили.
я тупой |
|
15.06.2006, 11:29 | #10 |
Участник
|
Задача сложнее, чем кажется. Нужно исключить фильтр типа 01020100|01020300..01050000|02010300|02020100..02020300
|
|
15.06.2006, 12:15 | #11 |
Участник
|
|
|
15.06.2006, 14:42 | #12 |
Участник
|
Интересный перебор. Правильно ли я понял, что надо создать функцию преобразующую исходный фильтр в противоположный?
Если да, то можно сваять что-то вроде: Код: //функция OppositeFilter(PFilter : Text[100]) : Text[100] CompleteFilter:=''; PFilter:=CONVERTSTR(PFilter,',','|'); WHILE STRPOS(PFilter,'|')<>0 DO BEGIN ORBlock:=COPYSTR(PFilter,1,STRPOS(PFilter,'|')-1); PFilter:=DELSTR(PFilter,1,STRPOS(PFilter,'|')); IF STRPOS(ORBlock,'..')<>0 THEN BEGIN BRange:=COPYSTR(ORBlock,1,STRPOS(ORBlock,'..')-1); ERange:=COPYSTR(ORBlock,STRPOS(ORBlock,'..')+2,STRLEN(ORBlock)); IF CompleteFilter<>'' THEN CompleteFilter+='&'; CompleteFilter+='('+'<'+BRange+'|'+'>'+ERange+')' END ELSE BEGIN IF CompleteFilter<>'' THEN CompleteFilter+='&'; CompleteFilter+='('+'<>'+ORBlock+')'; END; END; IF PFilter<>'' THEN BEGIN IF STRPOS(PFilter,'..')<>0 THEN BEGIN BRange:=COPYSTR(PFilter,1,STRPOS(PFilter,'..')-1); ERange:=COPYSTR(PFilter,STRPOS(PFilter,'..')+2,STRLEN(PFilter)); IF CompleteFilter<>'' THEN CompleteFilter+='&'; CompleteFilter+='('+'<'+BRange+'|'+'>'+ERange+')' END ELSE BEGIN IF CompleteFilter<>'' THEN CompleteFilter+='&'; CompleteFilter+='('+'<>'+PFilter+')'; END; END; EXIT(CompleteFilter); |
|
16.06.2006, 09:37 | #13 |
Участник
|
Advisor ты супер !!!!
даже в коде много менять не пришлось! спасибо всем, кто принял участие в решение проблемы. на самом деле. в нвжн мало вшитых функций. и все приходится дописывать самому. "придумывать велосипед". Может кто знает ссылочки на пользовательские функции. инфо, я думаю, будет интересна всем. КОЛИТЕСЬ, не жадничайте. |
|
19.06.2006, 16:28 | #14 |
Участник
|
unalexia-а этот код работает для фильтра на буквенные значения? Или только на числовые значения?
Ну а по поводу встроенных функций-не соглашусь. Хватает и вполне. Если не идти на поводу у пользователя сильно. Ну а если идти то тогда функций нигде не хватает. |
|
19.06.2006, 17:31 | #15 |
Участник
|
Мне нужен был Code. Я код немного переделал. Ничего сложного. Думаю для чисел тоже подойдет. Число можно перевести в Code.
|
|
19.06.2006, 23:05 | #16 |
Участник
|
Цитата:
По коду-я так поняла, что для числовых значений и так работает. Правда код смотрела бегло. |
|
20.06.2006, 11:27 | #17 |
Заноза в заднице
|
Алгоритм неплохой, в принципе, но есть ограничения по длине строки фильтра в 250 символов (да и поле, в котором будет храниться значение). Ведь если к примеру, в плане счетов (что вполне вероятно) детализация будет достаточно глубокой, номер счета может выглядеть таким образом: '2006.0010.0800.0001', а может и ещё длиннее, то во-первых: ограничения на количество фильров будут иметь значение, а во-вторых: длина результирующего исключающего фильтра всегда будет больше длины исходного фильтра и это тоже необходимо учитывать. Ну и потом: количество ограничений, накладываемых на одного пользователя может, даже при обычных размерах длины строки номера счета, быть достаточно обширными (всегда могут попросить дать сильно ограниченный доступ какому-нибудь небольшому сотруднику, чтобы этот сотрудник мог видеть какие-то выборочные счета там-сям). Так что если глубоко поразмыслить - персонифицировать отбор к примеру счетов надо бы каким-нибудь другим способом, не так прямолинейно.
__________________
Лень мудрого человека - это необходимое средство нейтрализации кипучей активности руководящих им дураков! |
|