Страница 1 из 1

Доступ к договорам по ответственному лицу

Добавлено: 11 янв 2013, 11:26
solkalin
Нужно настроить доступ к договорам так, чтобы в списке каждый видел только те, за которые он ответственен.
Через alter interface сделала:

Код: Выделить всё

#component 'L_Dogovor'
alter interface Dogovor;
overload
end;
create view as
select * from dogovor1,attrdog
where dogovor1.nrec=attrdog.cdogovor
and attrdog.otv_my_fio='Кулакова Оксана Николаевна' ;
end.
пока так, для отработки и тестирования, потом докручу X$USERS

Список договоров формируется при открытии очень долго.

Можно как-то оптимизировать код? Или подкиньте пожалуйста идеи, как еще можно реализовать такой доступ?

Re: Доступ к договорам по ответственному лицу

Добавлено: 11 янв 2013, 12:48
Dmitry_Sol
Очень медленно, потому что вы почему то стандартную подцепку attrdog, заменили на условие без индекса.
Я бы на вашем месте использовал не where а condition

Код: Выделить всё

Alter Interface Dogovor;
create view
 condition cond = AttrDog.Otv_My_Fio=sGetTune('USER.FIO')
;
HandleEvent
    cmInit:
                 {
   	                 if(Inherited::HandleEvent(cmInit) = heOk)
 			        {
				   PushCondition(tcCond);
				}

		   }
 end;
end.
этот код должен работать гораздо быстрее.
К тому же вы можете создать настройку "Фильтровать договора при входе" и включать ее для тех сотрудников, кому нужна фильтрация

Re: Доступ к договорам по ответственному лицу

Добавлено: 11 янв 2013, 13:19
solkalin
Такой код тоже работает не намного быстрее.
А что за создание настройки "Фильтровать договора при входе"?

Re: Доступ к договорам по ответственному лицу

Добавлено: 11 янв 2013, 13:52
Dmitry_Sol
Поскольку condition работает не по индексам, скорость не может быть большой.
Здесь еще плохо, что нам надо цепляться не к основной таблице - dogovor, а к attrdog.
А в attrdog нет индекса по фамилиям.
По поводу новой настройки -
В поставке системы есть такой файлик TuneApi.rar
Там описан механизм создания своих - пользовательских настроек.
Я на вашем месте фильтровал бы договора не всем, а только особо ограниченным :-)
и для этого я бы создал настройку : "Фильтровать договора по ответственному лицу" да/нет назвал бы ее например "PARTNER.DOGVISIBLE"

Если не разберетесь - пишите в личку - найду вам примерчик.

а в альтере в cmInit писал бы следущее

Код: Выделить всё

cmInit: {
                cmInit:
                 {
                       if(Inherited::HandleEvent(cmInit) = heOk)
                 {
                  if(boGetTune('PARTNER.DOGVISIBLE')) 
                      PushCondition(tcCond);
            }

Re: Доступ к договорам по ответственному лицу

Добавлено: 11 янв 2013, 17:09
solkalin
Спасибо за доп.информацию! Поразбираюсь.

Re: Доступ к договорам по ответственному лицу

Добавлено: 13 янв 2013, 21:25
mwoland
Вот так попробуйте, должно быть побыстрее

Код: Выделить всё

#component 'L_Dogovor'
alter interface Dogovor;
overload
end;
create view as
select * from dogovor1,attrdog myattrdog
where ((
dogovor1.nrec /== myattrdog.cdogovor and 
(myattrdog.otv_my_fio = 'Кулакова Оксана Николаевна' )
));
end.

Re: Доступ к договорам по ответственному лицу

Добавлено: 17 янв 2013, 16:01
solkalin
mwoland, неа, так тоже не быстрее : (

Re: Доступ к договорам по ответственному лицу

Добавлено: 17 янв 2013, 16:22
LaaLaa
solkalin писал(а): Можно как-то оптимизировать код?
Прежде чем это оптимизировать, нужно понять на что именно (на какие операции) там расходуется время.
Попробуйте получить SIL-протоколы и проанализировать их с помощью программ SmartTime и SmartInspect.

Инструкции и протокольные модули можно взять здесь ftp://ftp.galaktika.ru/pub/support/temp ... Protocols/

Re: Доступ к договорам по ответственному лицу

Добавлено: 18 янв 2013, 10:42
Masygreen
ээ.. как вариант написать своею обертку на прямом sql.. и привинтить к ней стандартные обработки ?