Проблема с циклами

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

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

Ответить
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

Проблема с циклами

Сообщение Marisha_P »

Помогите, пожалуйста...
Есть временная таблица

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

table struct stzat   //Временная таблица по статьям затрат
(
cstzat     : comp,
namestzat  : string,
kodstzat   : string,
kolstzat   : double,
sumstzat   : double
)
with index ( ID00 = cstzat (unique));   
и две вьюхи

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

Create View ViewVed
 var
  dfrom,dto:date;
  NameMVZ,NameMOL:string;
  Vyvod,Vyvod1 : word;
  NrecMVZ,NrecMOL,NrecStzat: comp;
  NameStzat,CodeStzat:string;
  KolStzat,SumStzat:double;
  bschet:string;
  count_1: integer;
  MarkPodr,MarkMol,indexno: longint;
 // MarkPodrS,MarkMolS,indexnoS: longint;
as
select katsopr.name, katnazna.name,katnazna.nazcode,sklorder.norder,katmc.name,katmc.barkod,kated.name,katparty.name,groupmc.name,
sporder.kol,sporder.rsrprice, sporder.kol*sporder.rsrprice
from sklorder,katsopr,stzat,Rorder,mvz,
Pick,
Pick PickPodr, // wList = 11
Pick PickMol,
KatPodr KatPodrP (ReadOnly),
KatMol KatMolP   (ReadOnly)
where
((  sklorder.cpodr== katpodr.nrec
and  word(1) ==sklorder.sp
and sklorder.cmol==katmol.nrec
and dfrom<<=sklorder.dord
and dto>>=sklorder.dord
and word(1) ==sklorder.vidorder (noindex)

and sklorder.nrec== sporder.csklorder
and sporder.cmc==katmc.nrec

and katmc.nrec==catalpsd.crec
and   'Номенклатурный номер КИС ММК (СНБ)'/==catalpsd.name
and 102/==catalpsd.vidcatal

 and katmc.nrec   == exclassval.crec
 and 1411          == exclassval.wtable
 and 221           == exclassval.classcode
 and exclassval.classcode     == exclassname.classcode
 and exclassval.cclassseg     == exclassseg.nrec

and katmc.ced==kated.nrec
and sporder.cparty==katparty.nrec
and katmc.cgroupmc==groupmc.nrec
and sklorder.csopr ==katsopr.nrec
and katsopr.cnazna==katnazna.nrec
and         word(11)           ==  PickPodr.wList
and         PickPodr.cRec      ==  KatPodrP.Nrec

and          word(8)           ==  PickMol.wList
and          PickMol.cRec       ==  KatMolP.Nrec
))
and groupmc.name<>'Полуфабрикаты собственного пр-ва'
and groupmc.name<>'Полуфабрикаты собственного пр-ва (комплект)'
and groupmc.name<>'ГП'
and groupmc.name<>'ГП (комплект)'
and katnazna.nazcode<>'08.02'
and substr(katnazna.nazcode,1,2)<>'05'
and if(isValidall(tnkatparty), if (substr(KatParty.kod,17,1)<>'h', true,false), true)
and ((0= katsopr.ckatsopr and 504=katsopr.vidsopr)
or substr(katsopr.name,1,47) =   'Акт на списание сырья по накладной на приход ГП'
or substr(katsopr.name,1,47) = 'Акт на списание сырья по акту на оказание услуг'
or substr(katsopr.name,1,45) =   'Акт на списание сырья по межцеховой накладной' )
Condition on_AnyPodr  as SearchMarker(MarkPodr, KatSopr.cPodrFrom ,IndexNo )
Condition on_AnyMol   as SearchMarker(MarkMol, KatSopr.cMolFrom ,  IndexNo )
;

create view Vvod
var
  MarkPodrS,MarkMolS,indexnoS: longint;
as select mbpmove.nom from mbpmove, stzat,mvz,Rorder,
Pick, exclassval exclassval1,exclassseg exclassseg1,exclassname exclassname1,
Pick PickPodrS, // wList = 11
Pick PickMolS,
KatPodr KatPodrPS (ReadOnly),
KatMol KatMolPS   (ReadOnly)
Where
((
 MbpMove.Nrec      == MbpIn.cSopr               and       //MbpIn - спецификация накладной MbpMove
 MbpMove.cPodrF    == KatPodr.Nrec              and
 MbpMove.cMolF     == KatMol.Nrec               and
 MbpIn.cMbp        == KatMbp.Nrec               and       //подцепка к МЦ
 KatMbp.cEd        == KatEd.Nrec                and       //единицы измерения
 KatMbp.cMc        == KatMc.Nrec                and
 KatMbp.cGroupMc   == GroupMc.Nrec              and
 KatMc.Nrec        == KatParty.cMc              and
 //'SFO'             == KatMbp.DESgR (noindex)    and       //'' - спецоснастка, SFO - спецодежда
 word(4)           == MbpMove.Status            and       //тип перемещения - ввод в эксплуатацию
 ViewVed.dfrom     <<= MbpMove.DMove             and       //дата по месяцу
 ViewVed.dto        >>= MbpMove.DMove             and
 word(0)           << MbpIn.DateEksp (noindex)

  and katmc.nrec==catalpsd.crec
and   'Номенклатурный номер КИС ММК (СНБ)'/==catalpsd.name
and 102/==catalpsd.vidcatal

      and MbpIn.nrec                  == exclassval.crec
      and 2001                        == exclassval.wtable
      and 78                          == exclassval.classcode
      and exclassval.cclassseg        == exclassseg.nrec

      and EXCLASSSEG.value==katnazna.nazcode


 and katmc.nrec   == exclassval1.crec
 and 1411          == exclassval1.wtable
 and 221           == exclassval1.classcode
 and exclassval1.classcode     == exclassname1.classcode
 and exclassval1.cclassseg     == exclassseg1.nrec

and   word(11)           ==  PickPodrS.wList
and  PickPodrS.cRec      ==  KatPodrPS.Nrec

and          word( 8)           ==  PickMolS.wList
and          PickMolS.cRec       ==  KatMolPS.Nrec
 /*and          word( 6700)             == PickGr.wList
 and          PickGr.cRec             == GroupMcP.Nrec*/
))
Condition on_AnyPodrS  as SearchMarker(MarkPodrS, MbpMove.cPodrF ,IndexNoS )
Condition on_AnyMolS   as SearchMarker(MarkMolS, MbpMove.cMolF ,  IndexNoS )
;
           
А дальше, я пытаюсь заполнить эту временную табличку данными из вьюх, если в отчет попадают данные из ViewVed, то заполняется времянка корректно с помощью такого кода для ViewVed

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

  if (getfirst stzat where ((NrecStzat==stzat.cstzat))<>tsOk)
               {insert into stzat set
                                      stzat.cstzat:=NrecStzat,
                                      stzat.namestzat:=NameStzat,
                                      stzat.kodstzat:=CodeStzat,
                                      stzat.kolstzat:= round(ViewVed.sporder.kol,3),
                                      stzat.sumstzat:= round(ViewVed.sporder.kol*ViewVed.sporder.rsrprice,2);
                     }

              else { update current stzat set
                                       stzat.kolstzat:= stzat.kolstzat+round(ViewVed.sporder.kol,3),
                                       stzat.sumstzat:= stzat.sumstzat+round(ViewVed.sporder.kol*ViewVed.sporder.rsrprice,2);
                        }     
а такого кода для Vvod:

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

   if (viewved.getfirst stzat where (( nazn1==stzat.cstzat))<>tsOk)

               { if (nazn1<>0) then
                      {viewved.insert into stzat set
                                      stzat.cstzat:=nazn1,
                                      stzat.namestzat:=nazn2,
                                      stzat.kodstzat:=nazn3,
                                      stzat.kolstzat:= kolst,
                                      stzat.sumstzat:= sumst;
                      }
                 else
                  {   viewved.insert into stzat set
                    stzat.cstzat:=0,
                    stzat.namestzat:='Без статьи расхода',
                    stzat.kodstzat:='',
                    stzat.kolstzat:= kolst,
                    stzat.sumstzat:= sumst;
                   }
                }

           else { viewved.update current stzat set
                                 stzat.kolstzat:= stzat.kolstzat+kolst,
                                 stzat.sumstzat:= stzat.sumstzat+sumst;
                  }
                               
Если же получается, что ViewVed не возвращает никаких данных, то постоянно идет дублирование в таблице stzat. Вместо апдейт пытается инсертить, хотя по данным из мессаджей должно идти в апдейт.. В чем причина?:(
Irina_
Местный житель
Сообщения: 554
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Проблема с циклами

Сообщение Irina_ »

Здравствуйте. А почему Вы добавили stzat в обе view? Попробуйте оставить только в одной.
В строке if (getfirst stzat where ((NrecStzat==stzat.cstzat))<>tsOk) Вы не указали имя view, по которой делаете движение.
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

Re: Проблема с циклами

Сообщение Marisha_P »

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

Re: Проблема с циклами

Сообщение edward_K »

в формах всегда ко всем операторам и обращениям добавляйте слева имя вьюхи - и тогда не будет неопределенности. Вообще без имени обращение идет по первой объявленной что в фейсе, что в форме.
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

Re: Проблема с циклами

Сообщение Marisha_P »

Добавила, но проблема осталась. Если первая вью ничего не возвращает,то не идет корректное обновление временной таблицы.. Почему так может быть? Из-за condition в ней?
Irina_
Местный житель
Сообщения: 554
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Проблема с циклами

Сообщение Irina_ »

Попробуйте все-таки следующее.
Таблицу stzat оставьте во view viewved, из view vvod уберите.
При необходимости делать Insert или Update таблицы stzat проверяйте условие
If ( viewved.GetFirst stzat where (( NrecZat == cstzat)) <> tsOk )
и
If ( viewved.GetFirst stzat where (( naznl == cstzat)) <> tsOk )
Проверьте также правильно ли у Вас формируются NrecZat и naznl. И попробуйте перенести Var NrecZat из view в интерфейс.
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

Re: Проблема с циклами

Сообщение Marisha_P »

Спасибо большое всем за помощь.. Проблема обнаружилась там, где я и подумать не могла:( Condition первой вьюхи надо было закрывать не в конце процедуры, а перед началом цикла по второй.И тогда всё хорошо:)
Ответить