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 ведёт уже тратий раз за день отправляю ...
С уважением,
Константин Григорьевич.
===============