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

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

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

Ответить
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

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

Сообщение 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), то всё нормально - в отчёт выходит только то, что нужно.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

orgnrec то разный?
сделайте вместо месседж logstrtofile, найдите orgnrec
Вообще проще надо быть :).
1. не хорошо когда order не совпадает с индексом по ограничениям
2. в (( )) не хорошо использовать (plpor.direct = 1) - лучше уж noindex или за ))
3.при выборке платёжных документов лучше использовать basefin.
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

И опасайтесь фильтров на логическую таблицу - их поведение в общем случае крайне сложно прогнозировать. Постарайтесь заменить их узловыми фильтрами, а где возможно - ограничениями, пусть даже и с noindex.
Виталий
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Сообщение RAJAH »

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