Hi, многоуважаемый All!

    Оносительно недавно с удовольствием для себя открыл прелесть
    конструкции WITH RECURSIVE. Что сказать - КЛАС !!!

    Но ещё не до конца вьезжаю как её на полную катушку использовать ;)
    Подскажите плиз ...

    Есть документооборот основанный на снятиях каточек, необходимо
    построить отчёт о не выполненных заказах. Т.е. о к-ве карточек
    не не снятых расходом клиента, но с выводом всех промежуточных
    статусов ... Делаю это примерно так:

        for select ti, sum(q) from (
            WITH RECURSIVE Recursion as (
              select m0.type_id ti, d0.id ci, d0.quantity q from vw_det0 d0
               join vw_DOC0 m0 on m0.id = d0.doc_id and d0.card_id = -1 and
d0.tovar_id = :tov_id
              UNION ALL
              select m1.type_id ti, d1.id ci, d1.quantity q from vw_det0 d1
               join vw_DOC0 m1 on m1.id = d1.doc_id
                join Recursion r on r.ci = d1.card_id
            ) select * from Recursion
         ) group by ti into :ti, :tmp do
        begin
--
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
Заказанно
          if (ti = 211) then zinzak = Replace(cast(:tmp as varchar(64)), '.000',
''); else
          if (ti = 212) then zinwork = Replace(cast(:tmp as varchar(64)), 
'.000',
''); else
          /* SKIP */
--
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
выполненно
          if (ti = 214) then zincomplete = Replace(cast(:tmp as varchar(64)),
'.000', ''); else
          if (ti = 215) then vincomplete = Replace(cast(:tmp as varchar(64)),
'.000', '');
        end

     всё работает на ура и ОЧЕНЬ шустро (в отличии от предыдущего
     варианта когда я делал рекурсию через SP) !!!

     НО есть одно НО в переменные zinzak, vinzak, ..., vincomplete
     попадает онформация о всех карточках для товара :tov_id в том
     числе и закрытых - прошедших через "Расход клиента" (ti = 214)

     а надо что-бы группа веток для заказа (ti = 211) у которой
     (колличество sum(q) расходованных (ti = 214) за исключением
      колличество sum(q) для возвращённых (ti = 214)) если равное
     начальному заказу (ti = 211) не учитывалась и соответственно
     не бралась в расчёт - как это сделать, хоть убейте не могу понять

     HELP ME !!!

PS: для примера

               DOC_TYPE  ID    Card_ID      Quantity
Группа док №1
    Заказ:     211       1     -1           10
    Счёт:      212       2     1            10
    Расход:    214       3     2            10

Группа док №2
    Заказ:     211       4     -1           5
    Счёт:      212       5     4            2
    Счёт:      212       6     4            3
    Расход:    214       7     5            2


Так вот в текущем варианте экого куска процедуры

    zinzak        = 15
    zinwork       = 15
    zincomplete   = 12
    vincomplete   = 0

что в приципе тоже правильно, но выглядит напряжно, а надо:
    
    zinzak        = 5
    zinwork       = 5
    zincomplete   = 2
    vincomplete   = 0

причём тупое отнимание zincomplete от всех переменных не имеет смысла
т.к. получим билиберду ...

    zinzak        = 3
    zinwork       = 3
    zincomplete   = 0
    vincomplete   = 0

В общем чуствую что всё предельно просто но как сделать - не пойму


PPS: Что-то странно себя NTTP ведёт уже тратий раз за день отправляю ...

С уважением,
Константин Григорьевич.
===============


Ответить