Страница 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.. и привинтить к ней стандартные обработки ?