AddBounds ==> Runtime

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

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

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

Сообщение RAJAH »

Вот в этом и вопрос - как не применять ограничение, если пользователь не выбрал фильтр. Если ничего не писать, писать PopBounds, в bounds указать fpstbud.nrec /== mrk.fnr, указать mrk.fnr /== fpstbud.nrec - пустой отчёт выходит.
По ограничениям - вроде, нормальная скорость с таким запросом, если из bounds условие в where засунуть. Я по-другому индексов не нашёл.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

ну для начала добейтесь, чтобы отчет без фильтра работал. bounds тут не причем - закоментарте все его использование ( #IFDEF .. #ENDIF). А вот то, что на fpco.nrec дважды условие наложено, это уже критично. Правило то простое - слева родитель, справа дочка. страно что после применения фильтра он вам что-то выдал.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Сообщение RAJAH »

Работает отчёт без bounds - когда условие mrk.fnr /== fpstbud.nrec указано в секции where. Я от этого варианта отталкивался, просто при этом нужно обязательно выбирать статьи, а иногда требуется выбрать только ЦО. Не хочется писать новый отчёт только из-за этого...
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

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

Сообщение RAJAH »

Всё работает. И в саппорте есть записи... Запрос отрабатывает правильно, не в нём дело. Проблема - как правильно установить bounds.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

без mrk.fnr /== fpstbud.nrec должно работать тем более.
вы запрос из сапорта вставте один в один в отчет . Чудес не бывает, запрос написан неправильно 100%. Не верите - комментируйте по строчке пока не заработает.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Сообщение RAJAH »

Один в один не получится... Нет таких таблиц met и mrk. Но я же говорю - работает, записи выдаёт. Я начал с него, потом эту связь перевёл в bounds, написал код с фрагментом if...then..., применил AddBounds, на этом вылетел и зашёл на форум поспрашивать, что такое bounds и с чем его едят. Чёрт с ним с запросом! Допустим, я его не писал :smile:
Как заставить ограничение bounds отработать если условие верно (хотя это, вроде, получилось), и не включаться, если не верно?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

жесткие подцепки так и не пробовали убрать :) . и bounds тоже не убирали :). По УмолчаниЮ он не поднят !!!!
Судя по запросу тробла с условиями на fpco и fpstbud
Уберите и вставте кусок типа этого
.begin
ob._loop table1
{ logstrtofile('C:\1.txt','table1 '+?????????)
ob._loop table2
{ logstrtofile('C:\1.txt',' table2 '+?????????)
....
}
}
end.
потом лог смотрите.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Сообщение RAJAH »

Я начинал с запроса, в котором bounds вообще не было, и он отрабатывал. Я, правда, не понял, что есть table1 и table2, сделал только 1 цикл. Ну и что? Есть строки в логе, столько же, сколько в отчёт выдаётся записей, я и так знаю, что записи есть - отчёт-то без bounds делается! Ну работает запрос без bounds!!! Как сделать, чтобы и с bounds нормально было?
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Сообщение RAJAH »

Подскажите кто-нибудь, как снять bounds, пожалуйста!..
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

RAJAH вам Эдвард уже многое рассказал про баундсы. Читайте внимательно, начните с простого, чтобы понять как работает.
AddBounds - накладывает баундс по имени баундса
SubBounds - снимает баундс по имени баундса
ResetBounds - вродебы обнуляет все баундсы по таблице, но точно не помню, обычно не пользуюсь, хватает первых двух.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

ob.PushBounds(ob.tnfpstbud) востановит первоначальные ограничения, но дело не в этом. А смотреть глубже на указанные таблы товарищу лень 8) . Всю форму (в тексте) ему тоже лень привести.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Сообщение RAJAH »

Да не лень мне - не хочется сильно напрягать товарищей-помощников. Но если хотите - пожалуйста (заранее извините за сдвиги - из Excel вставил... :) )

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

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

Сообщение edward_K »

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);
лучше первое.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Сообщение RAJAH »

Спасибо за пункты 2 и 3!!!!! По пункту 1 до сих пор не могу понять, что вы привязались, но всё равно спасибо! Заработало!
Ответить