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

Рекурсия по складским ордерам

Добавлено: 28 дек 2012, 16:49
Den_Is
Ломаю голову. Может быть что посоветуете, может быть у кого был опыт написания.
Задача такая.
Есть остаток на складе, смотрим последний приход на склад, переваливаемся в накладную и смотрим с какого склада был расход (т.е. с какого склада пришел материал). Теперь по складу с которого был расход смотрим когда на него был последний приход. И так далее пока не найдем тот склад на который данный материал оприходовали после закупки.
Т.е. материал купили, оприходовали на склад, потом перевели на другой склад ,с этого другого перевили на третий и так далее.Нужно поймать дату, когда же материал всетаки был куплен.
Не пойму как сделать рекурсию (опыта работы с рекурсией нет).
Делаю так но это только до первого приходного ордера

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

       If getLast SpOrder where (( 
                                                     0==SpOrder.sp and 
                                                     Katmc.nrec==SpOrder.cmc and 
                                                     KatPodr.nrec==SpOrder.ccpodr and 
                                                     date(01,01,2005)<<SpOrder.dord and 
                                                     0 == SpOrder.VIDORDER (noindex) 
                                                  ))=TsOk  
                Then {
                           setorder(tipo_dat_ord);
                          do
                          Begin
                           If Getfirst Katsopt = tsok then
                              Begin
                                 If KatSopr.Vidsopr = 101     Then // закупка
                                    Begin
                                      d_pr_kl:=Sporder.Dord; 
                                      break;
                                    End;
                              End;
                         End;
                       While GetPrev SpOrder where (( 
                                                                           0==SpOrder.sp and 
                                                                          Katmc.nrec==SpOrder.cmc and 
                                                                          Katpodr.nrec==SpOrder.ccpodr and 
                                                                         date(01,01,2005)<<SpOrder.dord and 
                                                                         0 == SpOrder.VIDORDER (noindex)  
                                                                      ))=TsOk  
                     } 



Re: Рекурсия по складским ордерам

Добавлено: 28 дек 2012, 17:20
RAJAH
Den_Is писал(а):когда же материал всетаки был куплен
А если зайти с другой стороны: "куплен" - значит, накладная с vidsopr = 101, и задача сводится к поиску самой ранней накладной. 8)

Re: Рекурсия по складским ордерам

Добавлено: 28 дек 2012, 17:35
Den_Is
Да так то оно так, но материал может не только закупаться а еще приходить из производства. И я точно не знаю материал лежащий на складе лежит от закупки или он когдато на какую то кладовую пришел из производства а потом внутренними перемещениями попал на искомый склад.

Re: Рекурсия по складским ордерам

Добавлено: 28 дек 2012, 17:41
RAJAH
Den_Is писал(а):когдато на какую то кладовую пришел из производства а потом внутренними перемещениями попал на искомый склад.
А в производство он разве попал не будучи купленным? :grin:

Re: Рекурсия по складским ордерам

Добавлено: 28 дек 2012, 17:45
Den_Is
RAJAH писал(а):
Den_Is писал(а):когдато на какую то кладовую пришел из производства а потом внутренними перемещениями попал на искомый склад.
А в производство он разве попал не будучи купленным? :grin:
Приход из производства подразумевает, что его произвели собственными силами а не купили.

Re: Рекурсия по складским ордерам

Добавлено: 28 дек 2012, 17:54
RAJAH
Из ТП передали алгоритм формирования отчёта "Возраст складских запасов":
Возраст запасов рассчитывается по следующему алгоритму:
- определяется количество МЦ на складах на дату формирования отчета;
- просматриваются приходные складские ордера в обратном хронологическом порядке, начиная от даты формирования отчета и до тех пор, пока не наберется количество на эту дату;
- просматриваются расходные складские ордера и сумма и количество корректируется в соответствии с этими ордерами;
- каждый интервал сетки контрольных сроков заносится количество по ордерам, попадающим в период: начало интервала <= дата ордера < конец интервала.
В отчет по периодам выводятся только приходы, если они превышают расходы в интервале.
Таким образом, в отчете выводится только превышение прихода над расходом, складывать суммы по интервалам нельзя.
Отчет служит для просмотра скопившихся на складе остатков, чтобы определить в какой интервал они скопились, т.е. приход превысил расход. Если необходимо увидеть остаток на начало, приход, расход, остаток на конец, как вы попытались сложить суммы, то смотрите оборотку. Колонка "Всего" отражает количество и сумму на конкретное число (Конечную дату интервала).

Re: Рекурсия по складским ордерам

Добавлено: 28 дек 2012, 17:59
Алексей
партионный учет задействован? Если да, может просто искать самый первый приходный ордер складской по разрезу партии?

Re: Рекурсия по складским ордерам

Добавлено: 28 дек 2012, 18:01
Den_Is
RAJAH писал(а):Из ТП передали алгоритм формирования отчёта "Возраст складских запасов":
Возраст запасов рассчитывается по следующему алгоритму:
- определяется количество МЦ на складах на дату формирования отчета;
- просматриваются приходные складские ордера в обратном хронологическом порядке, начиная от даты формирования отчета и до тех пор, пока не наберется количество на эту дату;
- просматриваются расходные складские ордера и сумма и количество корректируется в соответствии с этими ордерами;
- каждый интервал сетки контрольных сроков заносится количество по ордерам, попадающим в период: начало интервала <= дата ордера < конец интервала.
В отчет по периодам выводятся только приходы, если они превышают расходы в интервале.
Таким образом, в отчете выводится только превышение прихода над расходом, складывать суммы по интервалам нельзя.
Отчет служит для просмотра скопившихся на складе остатков, чтобы определить в какой интервал они скопились, т.е. приход превысил расход. Если необходимо увидеть остаток на начало, приход, расход, остаток на конец, как вы попытались сложить суммы, то смотрите оборотку. Колонка "Всего" отражает количество и сумму на конкретное число (Конечную дату интервала).
В точку задача по возрасту материалов. Вот только у нас уже давно нет ТП. Решаем сами как можем.

Re: Рекурсия по складским ордерам

Добавлено: 29 дек 2012, 08:59
RAJAH
Алексей писал(а):может просто искать самый первый приходный ордер складской по разрезу партии?
Да, такой вариант тоже приходил в голову: искать минимальную SALDOMC.DSALDO в нужном разрезе.

Re: Рекурсия по складским ордерам

Добавлено: 29 дек 2012, 09:16
Den_Is
Всех с наступающим!!!
Я от dsaldo и иду по ордерам до первого приходного, смотрю в накладную перехожу на склад cpodrfrom и вот тут то и нужно продолжать поиск от даты расходного ордера и по складу который определился в cpodrfrom и так далее пока не выйдем на приход по накладной vidsopr = 101. Хотя конечно по большей части материалов цикл закончиться уже на втором складе. Ну то есть
на кладовку 3 был приход с кладовки 2 а на кладовку 2 был приход по накладной на закупку.
А вот другой вариант
кладовка 3 приход с кладовки 2, кладовка 2 приход с кладовки 1, кладовка 1 приход с кладовки 3 (да да и такое может быть :) ), кладовка 3 приход с кладовки 0, а вот на кладовку 0 приход по накладной на закупку.
Вот мне и нужно пройти по всему этому пути.

Re: Рекурсия по складским ордерам

Добавлено: 29 дек 2012, 09:47
RAJAH
Den_Is писал(а):нужно пройти по всему этому пути.
Зачем? Алексей же про партии говорил - выбрать минимальную дату для пары МЦ+партия.

Re: Рекурсия по складским ордерам

Добавлено: 29 дек 2012, 10:08
Den_Is
RAJAH писал(а):
Den_Is писал(а):нужно пройти по всему этому пути.
Зачем? Алексей же про партии говорил - выбрать минимальную дату для пары МЦ+партия.
На счет партий, у нас они можно сказать не ведутся. На счет "зачем", ну задача так поставлена. Заказчик хочет видеть всю цепоцку данных и дату закупки. Сейчас делаю тупо, без рекурсий просто несколько раз вызываю процедуру с предопределенных количесвом циклов, надеюсь что авось данного количесва циклов хватит.

Re: Рекурсия по складским ордерам

Добавлено: 29 дек 2012, 16:51
n0where
А зачем делать рекурсию???

Нельзя посмотреть первый ордер добавленный по этой МЦ с определённого типа VISDOPR???

Re: Рекурсия по складским ордерам

Добавлено: 29 дек 2012, 21:15
edward_K
Партии бы вам решили задачу сразу.
По разрезу найти приходный ордер с типом операция с контрагентом и все.
Может лучше наладить партионный учет? Всего то пару настроек включить. А на текущие остатки сделать пересортицу - вот с партиями там придется повозится.