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

Фильтр глючит? Или я? :-)

Добавлено: 25 дек 2008, 08:55
RAJAH
Здравствуйте! Ничего не понимаю. Есть вьюхи:

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

.create view sf as
select schfact.nrec, schfact.dfact, schfact.direct, schfact.dreg, schfact.num, schfact.nazn, katorg.nrec, katorg.cstate, katorg.unn, katorg.name,
katorg.indexk, katorg.addr, katorg.tel, katorg.okonh, katorg.okpo, region.name, otnosh.nrec, katstate.kod, katstate.nrec, katstate.name, katcity.name,
dogovor.nodoc, dogovor.ddoc, katsopr.nrec, katsopr.dopr, katpodr.kod
from schfact, katorg, katorgdescr, katorgdescr katorgdescr2, katorgdescr region, katorgdescr otnosh, katstate, katcity, katsopr, dogovor, katpodr
where
((
begper              <<= schfact.dfact and
endper              >>= schfact.dfact and
katorg.nrec         /== schfact.corg and
schfact.nrec        /== katsopr.cschfact and
katsopr.cdogovor     == dogovor.nrec and
katsopr.cpodrfrom    == katpodr.nrec and
katorg.nrec          == katorgdescr.crec and
katorgdescr.cgroup  /== region.nrec and (region.nrec<>1000000000BE8h and region.nrec<>1000000000BE9h and region.nrec<>1000000000BEAh) and
katorg.nrec          == katorgdescr2.crec and
katorgdescr2.cgroup /== otnosh.nrec and (otnosh.nrec=1000000000BE8h or otnosh.nrec=1000000000BE9h or otnosh.nrec=1000000000BEAh) and
katorg.cstate       /== katstate.nrec and
katorg.ccity        /== katcity.nrec
))
and schfact.direct>0
order by katorg.nrec, schfact.nrec;
.create view vydpl as
select plpor.nrec, plpor.datob, plpor.nodok, dogovor.nodoc, dogovor.ddoc, oborot.nrec, oborot.dbscheto, oborot.krschetk, oborot.sumob, oborot.datob,
basedoc.nodoc, basedoc.ddoc
from plpor, stepdoc, basedoc, dogovor, oborot
where
((
begper          <<= plpor.datob and
endper          >>= plpor.datob and
orgnrec          == plpor.cpol (noindex) and (plpor.direct = 0) and
plpor.cstepdoc   == stepdoc.nrec and
stepdoc.cbasedoc == basedoc.nrec and
basedoc.cdogovor == dogovor.nrec and
plpor.nrec       == oborot.csoprdoc and
plpor.tidk       == oborot.tidk
))
and isvalidall(tnplpor)
order by plpor.nrec, oborot.nrec;
.create view polpl as
select plpor.nrec, plpor.datob, plpor.nodok, plpor.sumplat, plpor.cplat, dogovor.nodoc, dogovor.ddoc, oborot.nrec, oborot.dbscheto, oborot.krschetk, oborot.sumob, oborot.datob,
basedoc.nodoc, basedoc.ddoc
from plpor, stepdoc, basedoc, dogovor, oborot
where
((
begper          <<= plpor.datob and
endper          >>= plpor.datob and
orgnrec          == plpor.cplat (noindex) and (plpor.direct = 1) and
plpor.cstepdoc   == stepdoc.nrec and
stepdoc.cbasedoc == basedoc.nrec and
basedoc.cdogovor == dogovor.nrec and
plpor.nrec       == oborot.csoprdoc and
plpor.tidk       == oborot.tidk
))
and isvalidall(tnplpor)
order by plpor.nrec, oborot.nrec;
В теле формы код:

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

.begin
   RunDialog('C_COMMON::GetIntervalDates', begper, endper);
end.
.{table 'sf' by sf.katorg.nrec
.begin
   orgnrec:=sf.katorg.nrec;
end.
.{table 'vydpl' by vydpl.plpor.nrec
.begin
   ...;
end.
.{by vydpl.oborot.nrec
.begin
   ...;
end.
.}
.}
.{table 'polpl' by polpl.plpor.nrec
.begin
   ...;
end.
.{by polpl.oborot.nrec
.begin
   ...;
   message(orgnrec+' '+polpl.plpor.cplat);
end.
.}
.}
.{by sf.schfact.nrec
.begin
   ...;
end.
.}
.}
Месседж выдаёт пару разных значений, соответственно, во вьюхи vydpl и polpl попадает много лишних записей. Почему? По условиям вьюхи в месседже должны быть равные значения!
А если во вьюху sf поставить фильтр по организации (например, katorg.nrec=1000000000047h), то всё нормально - в отчёт выходит только то, что нужно.

Добавлено: 27 дек 2008, 00:15
edward_K
orgnrec то разный?
сделайте вместо месседж logstrtofile, найдите orgnrec
Вообще проще надо быть :).
1. не хорошо когда order не совпадает с индексом по ограничениям
2. в (( )) не хорошо использовать (plpor.direct = 1) - лучше уж noindex или за ))
3.при выборке платёжных документов лучше использовать basefin.

Добавлено: 09 янв 2009, 14:01
Screw
И опасайтесь фильтров на логическую таблицу - их поведение в общем случае крайне сложно прогнозировать. Постарайтесь заменить их узловыми фильтрами, а где возможно - ограничениями, пусть даже и с noindex.

Добавлено: 15 янв 2009, 17:04
RAJAH
Да куда уж проще! Обыкновенные циклы по таблицам. Другие методы посложнее будут... :-)
Ведь по условиям вьюхи orgnrec должен быть равен polpl.plpor.cplat! Почему эти значения разные?!
А как без ORDER последовательно пройти по организациям и СФ? Кто его знает, как он сам отсортирует?
Перенёс plpor.direct из узлового фильтра в фильтр по вьюхе - то же самое.
Всё равно, чтобы проводки найти придётся из BASEFIN цеплять PLPOR.