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

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

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

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

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

Сообщение 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);
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

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

Сообщение Den »

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

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

Сообщение edward_K »

1. _loop наглядней и с fullcache шустрее.
2. Вообще такие многоэтажные суммирования нужно решать одной выборкой и лучше на DSQL, хотя и на vip есть агрегирование во вложенных запросах.
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

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

Сообщение 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 проверила - запрос выдает нужные данные
Irina_
Местный житель
Сообщения: 554
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

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

Сообщение Irina_ »

Здравствуйте. Попробуйте так:
Lim._loop katsopr2
{
Message(katsopr2.nsopr);
Lim._loop attrnam
{
Message(attrnam.nrec);
......
} // loop для attrnam

} // loop для katsopr2

P.S. Если для цикла/ условия должно выполняться более 1 оператора, то эти операторы заключаются в скобки.
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

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

Сообщение Marisha_P »

пробовала и скобками:( всё равно katsopr2 заходит в таблицу, а дальше стоп(
Irina_
Местный житель
Сообщения: 554
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

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

Сообщение Irina_ »

У Вас в запросе есть условие НрекДокумента ==katsopr2.nrec. А НрекДокумента где-то меняется?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

Да. И банальное - а кодировка то в файле та? нужна 866. Ваше файло в сапорте или в галке читается? С виду то все правильно.
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

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

Сообщение Marisha_P »

да. нрекдокента берется из прототипа выбранной накладной
документ, откуда вызываю - печатная форма требования-накладной в формате rtf
Последний раз редактировалось Marisha_P 20 фев 2015, 12:19, всего редактировалось 1 раз.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

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

Сообщение RAJAH »

edward_K писал(а):_loop наглядней
Когда такие сложные вложенные циклы, удобнее и понятнее всего, по-моему, .{table ... - .{by. Тем более, что
Marisha_P писал(а):в печатной форме
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

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

Сообщение Marisha_P »

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

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

Сообщение edward_K »

Попробуйте всю программную часть перенести в frn, особливо view.
Все что внутри тела формы сделайте функциями или Declare.
Сдается мне что где то спецсимвол застрял в вашем запросе - должны в attrnam попасть всяко - даже без цикла по katsopr
Вообще правильно 1 раз встать на нужный Attrnam и больше его не трогать - он же по сути одна из главных табл.
Semi-bit
Постоянный обитатель
Сообщения: 123
Зарегистрирован: 01 фев 2007, 12:45
Откуда: Магнитогорск
Контактная информация:

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

Сообщение Semi-bit »

Можно ещё убрать все подцепки, которые идут после аттрвала, отладить прохождение по нему, потом отдельно подключать их по одной. Меня смущает строчка

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

and katsopr.nrec/==spsopr.csopr
Возможно, что-то подобной подцепкой отсекается.
И похожий запрос, который отрабатывается — в студию.
Испытываю траблы с даблами
ВИП — Велосипедо-Изобретательская Парадигма
САППОРТ — Сборище Абсолютно Пустых Посредственно Образованных Ржущих Троллей
Ответить