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

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

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

Ответить
Den_Is
Постоянный обитатель
Сообщения: 169
Зарегистрирован: 08 авг 2005, 20:11
Откуда: Омск

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

Сообщение 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  
                     } 


RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

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

Сообщение RAJAH »

Den_Is писал(а):когда же материал всетаки был куплен
А если зайти с другой стороны: "куплен" - значит, накладная с vidsopr = 101, и задача сводится к поиску самой ранней накладной. 8)
Den_Is
Постоянный обитатель
Сообщения: 169
Зарегистрирован: 08 авг 2005, 20:11
Откуда: Омск

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

Сообщение Den_Is »

Да так то оно так, но материал может не только закупаться а еще приходить из производства. И я точно не знаю материал лежащий на складе лежит от закупки или он когдато на какую то кладовую пришел из производства а потом внутренними перемещениями попал на искомый склад.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

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

Сообщение RAJAH »

Den_Is писал(а):когдато на какую то кладовую пришел из производства а потом внутренними перемещениями попал на искомый склад.
А в производство он разве попал не будучи купленным? :grin:
Den_Is
Постоянный обитатель
Сообщения: 169
Зарегистрирован: 08 авг 2005, 20:11
Откуда: Омск

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

Сообщение Den_Is »

RAJAH писал(а):
Den_Is писал(а):когдато на какую то кладовую пришел из производства а потом внутренними перемещениями попал на искомый склад.
А в производство он разве попал не будучи купленным? :grin:
Приход из производства подразумевает, что его произвели собственными силами а не купили.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

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

Сообщение RAJAH »

Из ТП передали алгоритм формирования отчёта "Возраст складских запасов":
Возраст запасов рассчитывается по следующему алгоритму:
- определяется количество МЦ на складах на дату формирования отчета;
- просматриваются приходные складские ордера в обратном хронологическом порядке, начиная от даты формирования отчета и до тех пор, пока не наберется количество на эту дату;
- просматриваются расходные складские ордера и сумма и количество корректируется в соответствии с этими ордерами;
- каждый интервал сетки контрольных сроков заносится количество по ордерам, попадающим в период: начало интервала <= дата ордера < конец интервала.
В отчет по периодам выводятся только приходы, если они превышают расходы в интервале.
Таким образом, в отчете выводится только превышение прихода над расходом, складывать суммы по интервалам нельзя.
Отчет служит для просмотра скопившихся на складе остатков, чтобы определить в какой интервал они скопились, т.е. приход превысил расход. Если необходимо увидеть остаток на начало, приход, расход, остаток на конец, как вы попытались сложить суммы, то смотрите оборотку. Колонка "Всего" отражает количество и сумму на конкретное число (Конечную дату интервала).
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

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

Сообщение Алексей »

партионный учет задействован? Если да, может просто искать самый первый приходный ордер складской по разрезу партии?
Den_Is
Постоянный обитатель
Сообщения: 169
Зарегистрирован: 08 авг 2005, 20:11
Откуда: Омск

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

Сообщение Den_Is »

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

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

Сообщение RAJAH »

Алексей писал(а):может просто искать самый первый приходный ордер складской по разрезу партии?
Да, такой вариант тоже приходил в голову: искать минимальную SALDOMC.DSALDO в нужном разрезе.
Den_Is
Постоянный обитатель
Сообщения: 169
Зарегистрирован: 08 авг 2005, 20:11
Откуда: Омск

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

Сообщение Den_Is »

Всех с наступающим!!!
Я от dsaldo и иду по ордерам до первого приходного, смотрю в накладную перехожу на склад cpodrfrom и вот тут то и нужно продолжать поиск от даты расходного ордера и по складу который определился в cpodrfrom и так далее пока не выйдем на приход по накладной vidsopr = 101. Хотя конечно по большей части материалов цикл закончиться уже на втором складе. Ну то есть
на кладовку 3 был приход с кладовки 2 а на кладовку 2 был приход по накладной на закупку.
А вот другой вариант
кладовка 3 приход с кладовки 2, кладовка 2 приход с кладовки 1, кладовка 1 приход с кладовки 3 (да да и такое может быть :) ), кладовка 3 приход с кладовки 0, а вот на кладовку 0 приход по накладной на закупку.
Вот мне и нужно пройти по всему этому пути.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

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

Сообщение RAJAH »

Den_Is писал(а):нужно пройти по всему этому пути.
Зачем? Алексей же про партии говорил - выбрать минимальную дату для пары МЦ+партия.
Den_Is
Постоянный обитатель
Сообщения: 169
Зарегистрирован: 08 авг 2005, 20:11
Откуда: Омск

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

Сообщение Den_Is »

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

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

Сообщение n0where »

А зачем делать рекурсию???

Нельзя посмотреть первый ордер добавленный по этой МЦ с определённого типа VISDOPR???
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

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