Страница 1 из 1

Запрос по лимиту

Добавлено: 19 фев 2015, 15:17
Marisha_P
Подскажите, в чем ошибка.
Задача следующая - к каждой накладной привязана ЛЗК, в которой прописан лимит по каждой МЦ на определенный период. Мы можем посмотреть какие накладные уже сформированы по данной ЛЗК и соответственно просуммировать кол-во, чтобы посмотреть есть еще матценности в наличии или уже все распределены по накладным.. Для накладной на отпуск в производстве есть вот такой запрос:

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

.create view Lim as
select * from stepdoc(readonly),spstep(readonly),spsopr(readonly),
synonym spsopr spsopr2(readonly), sporder(readonly), sklorder(readonly)
where ((comp(BaseDocNRec)==stepdoc.cbasedoc
and comp(SPSOPRNREC)==spsopr2.nrec
and stepdoc.nrec==katsopr.cstepdoc
and katsopr.nrec==spsopr.Csopr
and katsopr.nrec==sklorder.Csopr
and word(1)==sklorder.vidorder
and sklorder.nrec== sporder.csklorder
and spsopr2.cmcusl==sporder.cmc
and spsopr2.cmcusl==spsopr.cmcusl
));
и в печатной форме проверка организована след.образом:

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

if (lim.getfirst stepdoc=0) then
  Do {LZK:=true;
  if (lim.getfirst spsopr2=0) then
   do { if (lim.getfirst katsopr=0) then
      do { if (lim.getfirst spsopr=0) then
      do { lim_nakl:=lim_nakl+double(lim.spsopr.kolfact);
        if (Lim.getfirst sklorder=0) then
        do { if (Lim.getfirst sporder=0)
           do{ 
              lim_ost:=lim_ost+double(lim.sporder.KOL);
           } while (Lim.getnext sporder=0)
       }while (Lim.getnext sklorder)=0
     } while (Lim.getnext spsopr)=0
  } while (Lim.getnext katsopr)=0
} while (Lim.getnext spsopr2)=0
} while (Lim.getnext stepdoc)=0
lim:=double(SUMMA_LIM)-lim_nakl/koeff+double(KOL_F);
if ((lim+0.0000000000001)< kol_f and (LZK=true)) then 
{ message(’Вы превысили лимит!  Позиция: ’+ Name.katmc.name + ’ Остаток по лимиту:  ’ +lim,tsok);
А теперь мне нужно ту же самую проверку сделать для накладной склад-спецоснастка. Там явной связи с basedoc нет. Привязывается через внешний атрибут. Т.е. запрос становится вот таким:

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

.create view Lim as
select * from stepdoc(readonly),spstep(readonly),spsopr(readonly),
synonym spsopr spsopr2(readonly), sporder(readonly), sklorder(readonly),katsopr katsopr2,stepdoc stepdoc2
where ((НрекДокумента ==katsopr2.nrec
    and 1109==attrnam.wtable
    and ’1_ЛЗК для МЦ-МБП’==attrnam.name
    and 1109==attrval.wtable
    and katsopr2.nrec ==attrval.crec
    and attrnam.nrec==attrval.cattrnam
and attrval.vcomp==stepdoc2.nrec
and stepdoc2.cbasedoc==basedoc.nrec
and stepdoc2.nrec==spstep.cstepdoc
and НрекПозиции ==spsopr2.nrec
and katsopr.cstepdoc== stepdoc.nrec
and katsopr.nrec==spsopr.Csopr
and katsopr.nrec==sklorder.Csopr
and word(1)==sklorder.vidorder
and sklorder.nrec== sporder.csklorder
and spsopr2.cmcusl==sporder.cmc
and spsopr2.cmcusl==spsopr.cmcusl
));
И в данном случае у меня не получается проход по привязанным накладным, чтоб посмотреть в каких накладных уже есть матценности.. Виснет Галактика:(

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

if (lim.getfirst katsopr2= 0) then 
if (lim.getfirst attrnam= 0) then
 if (lim.getfirst attrval= 0) then
if (lim.getfirst stepdoc2= 0) then
if (lim.getfirst basedoc= 0) then
  Do {  LZK:=true;
  if (lim.getfirst spsopr2=0) then
   do {    if (lim.getfirst katsopr=0) then
      do {    if (lim.getfirst spsopr=0) then
         do { lim_nakl:=lim_nakl+double(lim.spsopr.kolfact);
          if (Lim.getfirst sklorder=0) then
            do {   if (Lim.getfirst sporder=0)
               do{ 
                    lim_ost:=lim_ost+double(lim.sporder.KOL);
                  } while (Lim.getnext sporder=0)
             }     while (Lim.getnext sklorder)=0
            } while (Lim.getnext spsopr)=0
       } while (Lim.getnext katsopr)=0
   } while (Lim.getnext spsopr2)=0
  } while (Lim.getnext stepdoc)=0;
lim:=double(SUMMA_LIM)-lim_nakl/koeff+double(KOL_F);
if ((lim+0.0000000000001)< kol_f and (LZK=true)) then 
{ message(’Вы превысили лимит!  Позиция: ’+ Namemc + ’ Остаток по лимиту:  ’ +lim,tsok);

Re: Запрос по лимиту

Добавлено: 19 фев 2015, 15:45
Den
Пытайтесь отладить проходы в циклах - увидите на какой Loop|While зацикливается.

Re: Запрос по лимиту

Добавлено: 19 фев 2015, 16:16
edward_K
1. _loop наглядней и с fullcache шустрее.
2. Вообще такие многоэтажные суммирования нужно решать одной выборкой и лучше на DSQL, хотя и на vip есть агрегирование во вложенных запросах.

Re: Запрос по лимиту

Добавлено: 20 фев 2015, 09:06
Marisha_P
хоть с loop хоть с getfirst когда пишу

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

Lim. _loop katsopr2
Message(katsopr2.nsopr);
Lim. _loop attrnam 
Message(attrnam.nrec);
......
Второе сообщение уже не выводится. Не понимаю почему. запрос следующий

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

.create view Lim as
select * from katsopr,spsopr spsopr2,katsopr katsopr2     
where ((НрекДокумента  ==katsopr2.nrec
    and 1109==attrnam.wtable
    and '1_ЛЗК для МЦ-МБП'==attrnam.name
    and 1109==attrval.wtable
    and katsopr2.nrec ==attrval.crec
    and attrnam.nrec==attrval.cattrnam
and attrval.vcomp==stepdoc.nrec
and stepdoc.nrec==katsopr.cstepdoc
and katsopr.nrec/==spsopr.csopr
and НрекПозиции ==spsopr2.nrec
and katsopr.nrec==sklorder.Csopr
and word(1)==sklorder.vidorder
and sklorder.nrec== sporder.csklorder
and spsopr2.cmcusl==sporder.cmc
and spsopr2.cmcusl==spsopr.cmcusl  )); 
В supporte проверила - запрос выдает нужные данные

Re: Запрос по лимиту

Добавлено: 20 фев 2015, 10:12
Irina_
Здравствуйте. Попробуйте так:
Lim._loop katsopr2
{
Message(katsopr2.nsopr);
Lim._loop attrnam
{
Message(attrnam.nrec);
......
} // loop для attrnam

} // loop для katsopr2

P.S. Если для цикла/ условия должно выполняться более 1 оператора, то эти операторы заключаются в скобки.

Re: Запрос по лимиту

Добавлено: 20 фев 2015, 10:17
Marisha_P
пробовала и скобками:( всё равно katsopr2 заходит в таблицу, а дальше стоп(

Re: Запрос по лимиту

Добавлено: 20 фев 2015, 10:22
Irina_
У Вас в запросе есть условие НрекДокумента ==katsopr2.nrec. А НрекДокумента где-то меняется?

Re: Запрос по лимиту

Добавлено: 20 фев 2015, 10:24
edward_K
Да. И банальное - а кодировка то в файле та? нужна 866. Ваше файло в сапорте или в галке читается? С виду то все правильно.

Re: Запрос по лимиту

Добавлено: 20 фев 2015, 12:02
Marisha_P
да. нрекдокента берется из прототипа выбранной накладной
документ, откуда вызываю - печатная форма требования-накладной в формате rtf

Re: Запрос по лимиту

Добавлено: 20 фев 2015, 12:15
RAJAH
edward_K писал(а):_loop наглядней
Когда такие сложные вложенные циклы, удобнее и понятнее всего, по-моему, .{table ... - .{by. Тем более, что
Marisha_P писал(а):в печатной форме

Re: Запрос по лимиту

Добавлено: 20 фев 2015, 12:37
Marisha_P
можно любым способом. проблема то у меня в том, что в цикл по view не идет дальше первой таблицы:( есть похожий запрос - и в нём всё нормально. а с этим не пойму что не так:(

Re: Запрос по лимиту

Добавлено: 20 фев 2015, 12:39
edward_K
Попробуйте всю программную часть перенести в frn, особливо view.
Все что внутри тела формы сделайте функциями или Declare.
Сдается мне что где то спецсимвол застрял в вашем запросе - должны в attrnam попасть всяко - даже без цикла по katsopr
Вообще правильно 1 раз встать на нужный Attrnam и больше его не трогать - он же по сути одна из главных табл.

Re: Запрос по лимиту

Добавлено: 26 фев 2015, 08:44
Semi-bit
Можно ещё убрать все подцепки, которые идут после аттрвала, отладить прохождение по нему, потом отдельно подключать их по одной. Меня смущает строчка

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

and katsopr.nrec/==spsopr.csopr
Возможно, что-то подобной подцепкой отсекается.
И похожий запрос, который отрабатывается — в студию.