|  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', а может и ещё длиннее, то во-первых: ограничения на количество фильров будут иметь значение, а во-вторых: длина результирующего исключающего фильтра всегда будет больше длины исходного фильтра и это тоже необходимо учитывать. Ну и потом: количество ограничений, накладываемых на одного пользователя может, даже при обычных размерах длины строки номера счета, быть достаточно обширными (всегда могут попросить дать сильно ограниченный  доступ какому-нибудь небольшому сотруднику, чтобы этот сотрудник мог видеть какие-то выборочные счета там-сям). Так что если глубоко поразмыслить - персонифицировать отбор к примеру счетов надо бы каким-нибудь другим способом, не так прямолинейно.
		 
				__________________ Лень мудрого человека - это необходимое средство нейтрализации кипучей активности руководящих им дураков! | 
|  |