Форум OlegON > Программы и оборудование для автоматизации торговли > Системы автоматизации торговли > Супермаг Плюс (Супермаг 2000)

Функция для получения остатка на дату : Супермаг Плюс (Супермаг 2000)

23.04.2024 16:31


12.07.2013 16:23
Explosion
 
В общем натворил вот такую штуку, но она чет не работает
Код:
create or replace function get_goods_ondate(art in string,
                                            mh  in number,
                                            dat in date) return number is
  Res number(14,3);
   begin  
   Select ost_dat
    into Res
    from (Select prod.article,g.quantity - (prih.wiq-prod.prq) as ost_dat from (Select ssc.article, sum(ssc.quantity) as prq, dsc.locationfrom
          from smspec ssc, smdocuments dsc
         where dsc.id = ssc.docid
           and dsc.doctype = ssc.doctype
           and ssc.doctype in ('CS','WO')
           and dsc.createdat >=
               to_date(dat, 'dd.mm.yyyy')
           and dsc.createdat <=
               to_date(to_char(sysdate,'dd.mm.yyyy'), 'dd.mm.yyyy') 
         group by ssc.article,dsc.locationfrom) prod,
         (Select swi.article,sum(swi.quantity) as wiq,dwi.locationto
          from smspec swi, smdocuments dwi
         where dwi.id = swi.docid
           and dwi.doctype = swi.doctype
           and swi.doctype = 'WI'
           and dwi.docstate = 3
           and dwi.createdat >=
               to_date(dat, 'dd.mm.yyyy')
           and dwi.createdat <=
               to_date(to_char(sysdate,'dd.mm.yyyy'), 'dd.mm.yyyy')
         group by swi.article,dwi.locationto) prih,
         smgoods g
         where prih.locationto = prod.locationfrom
         and g.storeloc = prod.locationfrom
         and g.article = art
         and g.storeloc = mh
         and g.article = prod.article
         and prod.article = prih.article);
  return(Res);
end get_goods_ondate;
Есть мысли почему?
Давно просто функции не писал)
12.07.2013 16:35
Troll
 
А что говорит-то? Если разбирать, то ошибку...
12.07.2013 17:43
svtl
 
Дело не в функции. Условие запроса попробуйте переписать по-другому.
where g.article = art
and g.storeloc = mh
and g.storeloc = prod.locationfrom(+)
and g.storeloc = prih.locationto(+)
and g.article = prod.article(+)
and g.article = prih.article(+)
У Вас получается, что будет результат тогда и только тогда, когда есть и расходы и приходы по артикулу. а ведь их может не быть.
(и я у sysdate по-другому конвертацию написала: to_date(sysdate,'dd.mm.yyyy') . но это некритично, кмк)

вот такой вариант у меня работает:
create or replace function get_goods_ondate
(art in string,mh in number,dat in date) return number is
Res number(14,3);
begin
Select ost_dat
into Res
from (
Select prod.article,
g.quantity - (nvl(prih.wiq, 0)-nvl(prod.prq, 0)) as ost_dat
from (Select ssc.article, sum(ssc.quantity) as prq, dsc.locationfrom
from supermag.smspec ssc, supermag.smdocuments dsc
where dsc.id = ssc.docid
and dsc.doctype = ssc.doctype
and ssc.doctype in ('CS','WO')
and dsc.createdat >=
to_date(dat, 'dd.mm.yyyy')
and dsc.createdat <=
to_date(sysdate,'dd.mm.yyyy')
group by ssc.article,dsc.locationfrom) prod,
(Select swi.article,sum(swi.quantity) as wiq,dwi.locationto
from supermag.smspec swi, supermag.smdocuments dwi
where dwi.id = swi.docid
and dwi.doctype = swi.doctype
and swi.doctype = 'WI'
and dwi.docstate = 3
and dwi.createdat >=
to_date(dat, 'dd.mm.yyyy')
and dwi.createdat <=
to_date(sysdate,'dd.mm.yyyy')
group by swi.article,dwi.locationto) prih,
supermag.smgoods g
where
g.article = art
and g.storeloc = mh
and g.storeloc = prod.locationfrom(+)
and g.storeloc = prih.locationto(+)
and g.article = prod.article(+)
and g.article = prih.article(+)
)
;
return(Res);
end get_goods_ondate;
12.07.2013 19:10
Dim
 
а чем встроенная функция не устраивает?
13.07.2013 14:50
Explosion
 
Да черт его знает))
Я видел что она есть...просто этим придется пользоваться постоянно и потом остатки на дату встроенная считает на конец дня. Или я ошибаюсь?
14.07.2013 00:19
svtl
 
Функция топикстартера не учитывает возвраты от покупателя по кассе, всякие внутренние перемещения, расходы на производство т.п., если они есть.
(но может их просто нет и не планируется :))
Я пользуюсь штатной процедурой.
Есть только одно "но", кмк, которе иногда бывает неудобно. Штатная записывает информацию во временную таблицу. Потом надо вытаскивать данные из нее. Поэтому доп. функция вполне имеет право на жизнь, если идет работа с небольшим кол-вом артикулов.
Вот всем остальном - штатная процедура считает быстрее простой селективной выборки. Ну и учитывает все возможные варианты движения товара.
24.07.2013 12:19
Explosion
 
А встроенную процедурку как из функции вызвать, подскажите плиз?
То что сейчас есть работает медленновато. А это как бэ не есть гуд
24.07.2013 13:47
svtl
 
Оно быстро и не будет.
По-поводу расчета Remains.Calc - сколько я помню, эта процедура считает оптимальным образом, с учетом параметров расчета остатков (статистики)

Как вызвать -
просто внутри вашей функции пишете вызов процедуры с параметрами.
у меня кусок кода может выглядеть так, например:

supermag.SQL_Filter.Clear_AllFilters;
supermag.SQL_Filter.Set_ArticleFromSQL('select article from supermag.ttidgroup');
supermag.SQL_Filter.Set_LocFromSQL('select id from TTLocList');

supermag.Remains.Calc(to_date(P_DATE, 'dd.mm.yyyy')-1, FALSE, 23, 0, FALSE); -- расчет остатков, в том числе ненулевые

ну и далее по своему коду - выборка из ttremains
24.07.2013 13:57
Explosion
 
я так попробовал, но оно чего-то ругается что Calc должен быть объявлен
Часовой пояс GMT +3, время: 16:31.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.