Странное поведение выборки в форме

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

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

Ответить
Sheinina
Местный житель
Сообщения: 366
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Странное поведение выборки в форме

Сообщение Sheinina »

Имеется отчет, в который в потоке приходит баркод матценности, мне небходимо распечатать операции с контрагентами по этой МЦ. При этом на момент формирования отчета накладные могут быть не проведены. Потому цепляемся за баркод и пишем следующую выборку:

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

.create view l_spnakl as select * from  katmc, spsopr, katsopr//, katorg 
where ((
    mcbark /== katmc.barkod 
and 1 == spsopr.prmc 
and katmc.nrec /== spsopr.cmcusl 
and spsopr.csopr == katsopr.nrec
and katsopr.corg == katorg.nrec
))
and katsopr.desgr='3' 
and instr(string(spsopr.vidsopr),'101,106,201')<>0 
;
в mcbark вытянут полученный из потока баркод МЦ. В этом случае в цикле по нескольким МЦ все отрабатывает. Стоит добавить в выборку строчку

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

order by spsopr.dsopr
выборка сбивается - работает только по ОДНОй, первой, МЦ, но столько раз, сколько МЦ приходит в потоке.

Вот полный код заготовки формы:

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

.linkform 'EngSklad_test' prototype is 'EngSklad'
.group 'AUN'
.nameinlist '(с) test'
.var
   cena_nakl: double
   summ_nakl: double
   otgr_kol : double
   otgr_sum : double
   vozv_kol : double
   vozv_sum : double
   rekl_kol : double
   rekl_sum : double
   in_nds   : word
   dfirst   : date
   dlast    : date
   in_ost   : double
   mcbark   : string
   prihod : double
   ostatok: double
.endvar
.create view l_spnakl as select * from katsopr, spsopr, katorg where ((
    mcbark == katmc.barkod
and 1 == spsopr.prmc
and katmc.nrec == spsopr.cmcusl
and spsopr.csopr == katsopr.nrec
and katsopr.corg == katorg.nrec
))
and katsopr.desgr='3'
and instr(string(spsopr.vidsopr),'101,106,201')<>0
order by katmc.nrec, spsopr.dsopr
;
.fields
 begper endper
barcode
l_spnakl.katmc.barkod l_spnakl.katsopr.vidsopr l_spnakl.katsopr.dsopr l_spnakl.katsopr.nsopr l_spnakl.spsopr.kolfact
.endfields
^ ^
.begin
   dfirst:=strtodate(substr(begper,1,10),'DD/MM/YYYY');
   dlast:=strtodate(substr(endper,1,10),'DD/MM/YYYY');
end.
.{
.{// цикл по МЦ
barcode = ^
.begin
   otgr_kol :=0;
   otgr_sum :=0;
   vozv_kol :=0;
   vozv_sum :=0;
   rekl_kol :=0;
   rekl_sum :=0;
   in_ost   :=0;  prihod:=0; ostatok:=0;
   mcbark:=trim(barcode);
end.
.{// цикл по операциям
.}
!моя  обработка накладных
.{table 'l_spnakl'
@@@@@@@@@@@@  @@@ @@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ &&&&&&&&&&
.} // по l_spnakl
.begin ostatok:=in_ost - otgr_kol + vozv_kol; end.
.}
.if DetSkl
.{ DetSklC CheckEnter
.}
.end
.}
.if engsklad01
.if DetOrg
.{ DetOrgC CheckEnter
.}
.end
.end

.endform
А вот результат выполнения:

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

01/07/2008 г. 31/08/2008 г.
barcode = 000300000129
000300000129  101 11/06/2008 d00026                     34945
000300000129  201 16/06/2008 L01924                        30
000300000129  201 16/06/2008 L01918                      3760
000300000129  201 16/06/2008 L01922                        80
000300000129  201 16/06/2008 L01920                       400
barcode = 000300000130
000300000129  101 11/06/2008 d00026                     34945
000300000129  201 16/06/2008 L01924                        30
000300000129  201 16/06/2008 L01918                      3760
000300000129  201 16/06/2008 L01922                        80
000300000129  201 16/06/2008 L01920                       400
Где я ошибаюсь? Ломаю голову второй день :cry:
PViP
Местный житель
Сообщения: 254
Зарегистрирован: 08 июн 2007, 08:26
Откуда: Красноярск
Контактная информация:

Сообщение PViP »

можете попробовать переписать цикл

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

!моя  обработка накладных 
.{table 'l_spnakl' 
@@@@@@@@@@@@  @@@ @@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ &&&&&&&&&& 
.} // по l_spnakl 
вот так

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

.fields 
 begper endper 
barcode 
l_spnakl.katmc.barkod l_spnakl.katsopr.vidsopr l_spnakl.katsopr.dsopr l_spnakl.katsopr.nsopr l_spnakl.spsopr.kolfact 
l_spnakl.katmc.barkod l_spnakl.katsopr.vidsopr l_spnakl.katsopr.dsopr l_spnakl.katsopr.nsopr l_spnakl.spsopr.kolfact 
.endfields 
.{?internal; l_spnakl.getfirst = tsoK
@@@@@@@@@@@@  @@@ @@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ &&&&&&&&&& 
.{while l_spnakl.getnext = tsok
@@@@@@@@@@@@  @@@ @@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ &&&&&&&&&& 
.} // по l_spnakl 
.}
Sheinina
Местный житель
Сообщения: 366
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Сообщение Sheinina »

Спасибо. Интересное решение, только я сильно спешила (у нас всегда все надо вчера) и запихала все, что нужно, во временную таблу с нужным индексом, после чего вся проблема разрешилась. После этого даже не заглядывала на форум :oops: Сейчас даже исходного текста нет, чтобы попробовать. На будущее буду иметь в виду. Спасибо еще раз.
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Сообщение Masygreen »

А вот абсолютно правильное решение засунуть во времянку и по своему индексу отсортировать - так сработает ан 98 %
Время ведет!
Sheinina
Местный житель
Сообщения: 366
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Сообщение Sheinina »

Masygreen писал(а):А вот абсолютно правильное решение засунуть во времянку и по своему индексу отсортировать - так сработает ан 98 %
не на 98, а на все 100 :grin: Главное, правильно времянку организовать - проверено на опыте :)
Ответить