Запрос с ограничениями

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

Запрос с ограничениями

Сообщение Marisha_P »

Здравствуйте! Помогите, пожалуйста, грамотно наложить ограничения на результат запроса.
Он у меня имеет вот такой вид

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

create view vKatsoprNakl
  var
    NameMVZ : string;
    MarkPodr,indexno  : longint;
    dfrom,dto:date;
    Vyvod: word;

select katsopr.nsopr,katsopr.dsopr,katpodrfrom.name,katpodrto.name,katsopr.descr,katsopr504.nsopr,katmc504.name,katmc504.barkod,
       kated504.name,spsopr504.kol,katparty504.name,spsopr504.price,spsopr504.kol*spsopr504.price
from   katsopr,katsopr katsopr504,katpodr,katpodr katpodr1,spsopr spsopr504,katmc katmc504,kated kated504,
       katparty katparty504,pick PickPodr,katpodr katpodrfrom, katpodr katpodrto
where ((
     dfrom <<=katsopr.dsopr (noindex)
and  dto >>=katsopr.dsopr (noindex)
and 281474977139762 ==katsopr.cpodrfrom (noindex)
and katsopr.nrec /==katsopr504.ckatsopr
and katsopr.cpodrto==katpodrfrom.nrec
and katsopr.cpodrfrom==katpodrto.nrec
and katsopr504.nrec==spsopr504.csopr (noindex)
and SPSOPR504.CMCUSL==KATmc504.NREC
and katmc504.ced==kated504.nrec
and spsopr504.cparty==katparty504.nrec
 ));     
Мне нужно, чтоб можно было в зависимости от выбранных документы - НГП или акты - осуществлять корректно выборку.
Если ставлю условие

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

 Condition NGP      502=katsopr.vidsopr
  Condition Aktuslugi       508=katsopr.vidsopr
  
то интерфейс прогружается очень очень долго..
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Запрос с ограничениями

Сообщение edward_K »

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

create view
var 
  wVidSopr :word;
....
where ((
      wVidSopr==katsopr.vidsopr
and  dfrom <<=katsopr.dsopr 
and  dto >>=katsopr.dsopr 
...
))
В Зависимости от того что нужно задавайте wVidSopr
Если нужно оба типа. все равно дешевле сначала собрать по одному, потом по второму.
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

Re: Запрос с ограничениями

Сообщение Marisha_P »

Спасибо! так собралось.. вопрос вдогонку. а как ограничить по подразделениям? множественный выбор из маркера.. дописала

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

select katsopr.nsopr,katsopr.dsopr,katpodrfrom.name,katpodrto.name,katsopr.descr,katsopr504.nsopr,katmc504.name,katmc504.barkod,
       kated504.name,spsopr504.kol,katparty504.name,spsopr504.price,spsopr504.kol*spsopr504.price
from   katsopr,katsopr katsopr504,katpodr,katpodr katpodr1,spsopr spsopr504,katmc katmc504,kated kated504,
       katparty katparty504,pick PickPodr,katpodr katpodrfrom, katpodr katpodrto,specifMC
where ((
     vSopr == KatSopr.VidSopr
and  dfrom <<=katsopr.dsopr
and  dto >>=katsopr.dsopr
and katsopr.nrec /==katsopr504.ckatsopr
and katsopr.cpodrto==katpodrfrom.nrec
and katsopr.cpodrfrom==katpodrto.nrec
and katsopr504.nrec==spsopr504.csopr (noindex)
and SPSOPR504.CMCUSL==KATmc504.NREC
and katmc504.ced==kated504.nrec
and spsopr504.cparty==katparty504.nrec

 and word(11)          ==  PickPodr.wlist
 and PickPodr.crec     ==  katpodr.nrec

 ))
Condition on_AnyPodr  as SearchMarker(MarkPodr, katsopr.CPODRFROM, IndexNo);     
но что-то снова видимо не так:(
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Запрос с ограничениями

Сообщение Den »

Атлантис не умеет эффективно накладывать множественный фильтр . Уж обсуждалось это не раз. Будут тормоза. В отчетах принципиально нужно
обрабатывать сначала по одному, потом по другому..вам уже написали об этом, впрочем.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Запрос с ограничениями

Сообщение edward_K »

кондишен зло. Надо избегать его.
с множественным фильтром хорошо на DSQL , но ищем DUAL - обещали добавить. Я обычно создаю времянку, набиваю ее с маркера(ов), а потом уже ее юзаю в запросе. Вот этот кусок по набивке может быть долгим.
На атлантисе обычно так

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

var Filter_Podr_Count :longint
...
create view
...
where ((
 and ..  == katsopr. ....
and (Filter_Podr_Count=0 or FoundMarker(Marker_Podr,katsopr.cPodrFrom) // обязательно сразу за последним индексным фильтром по KatSopr
));
...
Filter_Podr_Count:=GetMarkerCount(Marker_Podr);
Ну еще можно бегать по маркеру если фильтр установлен(перед эти наложить PushBounds(tbByPodr) c условием фильтрации), или по всей таблице ( PushBounds(tnKatSopr) ). Ну еше можно добавить анализ - если помечено скажем 30% подразделений - то по маркеру, иначе все, но фильтр проверяем в цикле. Вариантов оптимизации очень много 8) . Что то есть в Viprogr.chm - даже с временными замерами. Ну и профайлер SQL или Галактики(на форуме LaaLaa писал где то как пользоваться последним) не забываем что есть.
Ответить