AddBounds ==> Runtime
Модераторы: m0p3e, edward_K, Модераторы
Вот в этом и вопрос - как не применять ограничение, если пользователь не выбрал фильтр. Если ничего не писать, писать PopBounds, в bounds указать fpstbud.nrec /== mrk.fnr, указать mrk.fnr /== fpstbud.nrec - пустой отчёт выходит.
По ограничениям - вроде, нормальная скорость с таким запросом, если из bounds условие в where засунуть. Я по-другому индексов не нашёл.
По ограничениям - вроде, нормальная скорость с таким запросом, если из bounds условие в where засунуть. Я по-другому индексов не нашёл.
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
ну для начала добейтесь, чтобы отчет без фильтра работал. bounds тут не причем - закоментарте все его использование ( #IFDEF .. #ENDIF). А вот то, что на fpco.nrec дважды условие наложено, это уже критично. Правило то простое - слева родитель, справа дочка. страно что после применения фильтра он вам что-то выдал.
Один в один не получится... Нет таких таблиц met и mrk. Но я же говорю - работает, записи выдаёт. Я начал с него, потом эту связь перевёл в bounds, написал код с фрагментом if...then..., применил AddBounds, на этом вылетел и зашёл на форум поспрашивать, что такое bounds и с чем его едят. Чёрт с ним с запросом! Допустим, я его не писал
Как заставить ограничение bounds отработать если условие верно (хотя это, вроде, получилось), и не включаться, если не верно?

Как заставить ограничение bounds отработать если условие верно (хотя это, вроде, получилось), и не включаться, если не верно?
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
жесткие подцепки так и не пробовали убрать
. и bounds тоже не убирали
. По УмолчаниЮ он не поднят !!!!
Судя по запросу тробла с условиями на fpco и fpstbud
Уберите и вставте кусок типа этого
.begin
ob._loop table1
{ logstrtofile('C:\1.txt','table1 '+?????????)
ob._loop table2
{ logstrtofile('C:\1.txt',' table2 '+?????????)
....
}
}
end.
потом лог смотрите.


Судя по запросу тробла с условиями на fpco и fpstbud
Уберите и вставте кусок типа этого
.begin
ob._loop table1
{ logstrtofile('C:\1.txt','table1 '+?????????)
ob._loop table2
{ logstrtofile('C:\1.txt',' table2 '+?????????)
....
}
}
end.
потом лог смотрите.
Я начинал с запроса, в котором bounds вообще не было, и он отрабатывал. Я, правда, не понял, что есть table1 и table2, сделал только 1 цикл. Ну и что? Есть строки в логе, столько же, сколько в отчёт выдаётся записей, я и так знаю, что записи есть - отчёт-то без bounds делается! Ну работает запрос без bounds!!! Как сделать, чтобы и с bounds нормально было?
-
- Местный житель
- Сообщения: 2898
- Зарегистрирован: 24 июн 2005, 12:12
- Откуда: Иркутская область
RAJAH вам Эдвард уже многое рассказал про баундсы. Читайте внимательно, начните с простого, чтобы понять как работает.
AddBounds - накладывает баундс по имени баундса
SubBounds - снимает баундс по имени баундса
ResetBounds - вродебы обнуляет все баундсы по таблице, но точно не помню, обычно не пользуюсь, хватает первых двух.
AddBounds - накладывает баундс по имени баундса
SubBounds - снимает баундс по имени баундса
ResetBounds - вродебы обнуляет все баундсы по таблице, но точно не помню, обычно не пользуюсь, хватает первых двух.
Да не лень мне - не хочется сильно напрягать товарищей-помощников. Но если хотите - пожалуйста (заранее извините за сдвиги - из Excel вставил...
)
Про эти операторы я тоже в VIPPROGR.chm прочитал, но когда начинаешь применять на практике - хочется автора этого документа расстрелять...

Код: Выделить всё
.Form 'Oplat'
.Group 'Отчёты ФРО'
.NameInList 'Регистрация оплат'
.ard
.F 'РегОплат'
.var
statb, rassch, org, numer, nazn, cenotv: string;
sumop, itsum: double;
MarkIn, MarkSt: longint;
nr: comp;
begper, endper, dopl: date;
prizn: byte;
.endvar
.create view opl as
select cashbank.name, plpor.*, fpstbud.name, soprhoz.*, katorg.name, fpco.name
from plpor, fpstbud, aktofp, aktperf, cashbank, katorg, fpco, soprhoz, clearing, fpoborot, mrk, met
where
((
begper <<= soprhoz.datob and
endper >>= soprhoz.datob and
soprhoz.csoprdoc /== plpor.nrec and
soprhoz.nrec /== aktperf.csoprhoz and
aktperf.caktofp /== aktofp.nrec and
aktofp.cpodr /== fpco.nrec and
aktofp.nrec /== clearing.caktofp and
823 == fpoborot.tidk and
clearing.nrec /== fpoborot.csoprdoc and
150 == fpoborot.kodreg (noindex) and
fpoborot.cstbud /== fpstbud.nrec and
!mrk.fnr /== fpstbud.nrec and
met.fnr /== fpco.nrec and
plpor.cpol /== katorg.nrec and
2 == cashbank.razdel and
plpor.cbankplat == cashbank.cpodr
))
bounds postat = fpstbud.nrec /== mrk.fnr
order by soprhoz.datob, plpor.nrec;
.create view stb as
select *
from mrk;
.create view centr as
select *
from met;
.fields
begper
endper
rassch
numer
if(dopl<>date(0,0,0), dopl, '')
DoubleToStr(sumop, '\2p666666666666.88')
statb
org
cenotv
nazn
DoubleToStr(itsum, '\2p666666666666.88')
.endfields
.begin
begper:=date(1, month(sub_months(cur_date, 1)), if(month(cur_date)=1, year(cur_date)-1, year(cur_date)));
endper:=date(last_day(begper), month(begper), year(begper));
RunDialog('C_COMMON::GetIntervalDates', begper, endper);
RunDialog('InpVar', prizn);
RunInterface('F_FPCATALOG::GETCO', 3);
MarkSt:=InitMarker('GetSomeFPCO', 8, 1, 1);
for(MarkIn:=0; MarkIn<=GetMarkerCount(MarkSt)-1; MarkIn:=MarkIn+1)
begin
if GetMarker(MarkSt, MarkIn, nr) then
centr.insert met set
met.fnr:=nr;
end;
DoneMarker(MarkSt, 'GetSomeFPCO');
if prizn=0 then
begin
RunInterface('F_FPCATALOG::GETSTBUD', 3);
MarkSt:=InitMarker('GetSomeFPStBud', 8, 1, 1);
for(MarkIn:=0; MarkIn<=GetMarkerCount(MarkSt)-1; MarkIn:=MarkIn+1)
begin
if GetMarker(MarkSt, MarkIn, nr) then
stb.insert mrk set
mrk.fnr:=nr;
end;
DoneMarker(MarkSt, 'GetSomeFPStBud');
opl.PushBounds(opl.tbpostat);
end
else
opl.PopBounds(opl.tbpostat);
end.
Регистрация оплат с ^ по ^
р/с Номер Дата Сумма Статья Наименование Центр Назначение
док-та док-та платежа бюджета организации ответственности платежа
.{table 'opl'
.begin
rassch:=substr(opl.cashbank.name, pos(' ', opl.cashbank.name)-3, 3);
numer:=opl.plpor.nodok;
dopl:=opl.plpor.datob;
sumop:=opl.soprhoz.summa;
itsum:=itsum+sumop;
statb:=opl.fpstbud.name;
org:=opl.katorg.name;
nazn:=if(opl.soprhoz.namesho<>'', opl.soprhoz.namesho, opl.plpor.namepl1);
cenotv:=opl.fpco.name;
end.
^ ^ ^ ^ ^ ^ ^ ^
.}
Итого по отчёту ^ руб.
.endform
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
1. видимо строку
met.fnr /== fpco.nrec
надо писать все таки как
fpco.nrec /== met.fnr
хотя и медленно сие будет.
либо вообще для начала ее закоментарте - я вам уже об этом писал!.
плохо смотрите.
2. в запрос добавте
fpstbud.nrec == mrk.fnr
иначе при снятом боундсе и наличии записей в mrk усе будет умножаться ( поскольку вы цикл делаете по всей вьюхе, а не по конкретной табле - надо очень аккуратно следить за построением запроса и следить, чтобы дочки были подвязаны 1->1 и во from не было отвязанных табл ! По табле надежней ).
3. строку
opl.PopBounds(opl.tbpostat);
либо уберите, либо напишите
opl.PushBounds(opl.tnmrk);
лучше первое.
met.fnr /== fpco.nrec
надо писать все таки как
fpco.nrec /== met.fnr
хотя и медленно сие будет.
либо вообще для начала ее закоментарте - я вам уже об этом писал!.
плохо смотрите.
2. в запрос добавте
fpstbud.nrec == mrk.fnr
иначе при снятом боундсе и наличии записей в mrk усе будет умножаться ( поскольку вы цикл делаете по всей вьюхе, а не по конкретной табле - надо очень аккуратно следить за построением запроса и следить, чтобы дочки были подвязаны 1->1 и во from не было отвязанных табл ! По табле надежней ).
3. строку
opl.PopBounds(opl.tbpostat);
либо уберите, либо напишите
opl.PushBounds(opl.tnmrk);
лучше первое.