[ОТВЕТИТЬ]
25.12.2009 11:41
Starter
 
Есть несколько вопросов по бизнес-анализу.
Товароведы очень хотят видеть одновременно приход/продажу/оперативно доступно. Однако это разные модели. первые два пункта - движение артикула, третий - текущие остатки.

Однако почитав форум, обнаружил, что "Бизнес-анализ позволяет использовать в расчетах любые встроенные функции оракла, и любые функции схемы SUPERMAG" (с) Mtirt

Вопрос к знатокам - есть ли функция в супермаге по получению остатка "оперативно доступно" и на определенную дату (начало/конец периода отбора), которую можно было бы вставить в задачу по движению артикула ?

другой вопрос - собрали количество прихода, сумму прихода, пытаемся вычислить среднюю цену - и вполне логично получаем деление на ноль. как бы от этого избавиться. Не подскажете формулу с условием, чтобы проверять что количество=0 и в этом случае не делить ?
25.12.2009 12:00
Starter
 
И в дополнение:
существует цель - отобрать приходы по поставщику и продажи по этим товарам. так как привязки товара к поставщику не существует (точнее этим заведует расчет товародвижения), то попытаемся сделать задачу по движению артикула. поле контрагент, поле приход товара - отбирает замечательно, а вот при добавлении поля продажа - там вполне ожидаемо ноль, ибо продажа идет в розницу, а не этому поставщику.

Соответственно вопрос - можно ли какой нибудь формулой из супермага отобрать продажи по артикулу и добавить в задачу ?
обходное решение - использование ассортимента поставщика и приходы/продажи по этим карточкам, но к сожалению за ассортиментом следить нужно, хотелось бы отбор вести все же путем выбора контрагента...
25.12.2009 12:01
Mtirt
 
С датами там будет проблема...
Даты в формулы не передаются.
Только sysdate или sysdate-N дней, ну и прочие её производные...

Насчет условий
nvl()
case when количество=0 then 0 else сумма прихода/количество end
25.12.2009 12:03
Mtirt
 
Цитата:
Starter И в дополнение:
существует цель - отобрать приходы по поставщику и продажи по этим товарам. так как привязки товара к поставщику не существует (точнее этим заведует расчет товародвижения), то попытаемся сделать задачу по движению артикула. поле контрагент, поле приход товара - отбирает замечательно, а вот при добавлении поля продажа - там вполне ожидаемо ноль, ибо продажа идет в розницу, а не этому поставщику.

Соответственно вопрос - можно ли какой нибудь формулой из супермага отобрать продажи по артикулу и добавить в задачу ?
обходное решение - использование ассортимента поставщика и приходы/продажи по этим карточкам, но к сожалению за ассортиментом следить нужно, хотелось бы отбор вести все же путем выбора контрагента...

А почему тогда результатами расчета товародвижения нельзя воспользоваться? В том же самом бизнес-анализе?
25.12.2009 12:17
Starter
 
остатки - вполне достаточно будет хотя бы текущих, оперативно доступно которые. для них и sysdate пойдет.

Результаты расчета товародвижения - воспользоваться то можно, только вот корректны эти результаты будут только если нету НП. а он есть. и существенно влияет на результаты...

по nlv и case - можно попросить формулу написать ? {приход}/{количество} только с учетом того чтобы не валилось если {количество}=0 ?
25.12.2009 12:31
Starter
 
Неопределенный, он же неустановленный приход, пересортица, отрицательные остатки...
и все же возвращаясь к функциям - функция вычисления оперативных остатков есть в см ? и функция вычисления продажи/расхода за период (или там как раз проблема с датами) ?
29.12.2009 12:10
Starter
 
Задал этот же вопрос СП - про функцию, которая возвращала бы оперативные остатки - получил ответ:
"Нет, такой функции нет. Но, конечно, если смотреть более корректно, то такая функция, конечно, присутствует в коде, но не открыта для личного пользования".

и еще:
"Бизнес анализ, разработан как инструмент для стороннего разработчика. Хорошо знающего sql и plsql .... Пишите запросы, изучайте БД. Если не получится, можем рассмотреть реализацию такой задачи в виде ТЗ на разработку этого отчета силами отдела разработки".

Неужели никто никогда не озадачивался созданием подобной функции (получение оперативного остатка) ?
29.12.2009 12:25
Mtirt
 
Ты уточни, откуда тебе остаток надо?
Из smgoods или с учетом оперативных продаж?
29.12.2009 12:35
Starter
 
с учетом оперативных продаж. то, что называется "оперативно доступно"
29.12.2009 15:06
kadr
 
Цитата:
Starter по nlv и case - можно попросить формулу написать ? {приход}/{количество} только с учетом того чтобы не валилось если {количество}=0 ?
таки 0 или null?
null
Код:
select {приход}/nvl({количество},1)  from dual;
0
Код:
select decode({количество},0,{приход},{приход}/{количество}) from dual;
Цитата:
Starter с учетом оперативных продаж. то, что называется "оперативно доступно"
что-то вроде такого
Код:
select A.*,
decode(A.PackSize,-1,nvl(G.SaleQ,0),null)
,decode(A.PackSize,-1,A.Quantity-nvl(G.SaleQ,0),null) OperQuantity
,decode(A.PackSize,-1,A.FreeQuantity-nvl(G.SaleQ,0),null) OperFree
from (select
L.ID StoreLoc,L.Name StoreLocTitle,'00435' Article,-1 PackSize
,nvl(G.Quantity,0) Quantity
,nvl(G.ReservedQuantity,0) ReservedQuantity
,nvl(G.IncomingQuantity,0) IncomingQuantity
,nvl(G.AwaitedQuantity,0) AwaitedQuantity
,nvl(G.FoundQuantity,0) FoundQuantity
,nvl(G.Quantity+G.FoundQuantity-(G.ReservedQuantity+G.IncomingQuantity),0) FreeQuantity
from Supermag.SMGoods G, Supermag.SMStoreLocations L
where L.ID=G.StoreLoc(+)
and G.Article(+)='00435'
union
select
L.ID StoreLoc,L.Name StoreLocTitle,G.Article,G.PackSize,G.Quantity
,G.ReservedQuantity,G.IncomingQuantity,G.AwaitedQuantity,G.FoundQuantity
,G.Quantity+G.FoundQuantity-(G.ReservedQuantity+G.IncomingQuantity) FreeQuantity
from Supermag.SMGoodsPacks G, Supermag.SMStoreLocations L
where L.ID=G.StoreLoc
and G.Article='00435') A, (select G.LocID,sum(G.SaleQuantity-G.ReturnQuantity) SaleQ
from Supermag.SMOperGoods G
where G.Article='00435'
group by G.LocID) G
where A.StoreLoc=G.LocID(+)
order by A.StoreLocTitle,A.PackSize
29.12.2009 16:48
Mtirt
 
На основе этого запроса создать функцию:
Цитата:
create or replace function article_ost(Mystoreloc in integer, Myarticle in Varchar2) return varchar2 is
Result number;
begin
select decode(A.PackSize,-1,A.FreeQuantity-nvl(G.SaleQ,0),null) OperFree into result
from (select
L.ID StoreLoc, Article,-1 PackSize
,nvl(G.Quantity,0) Quantity
,nvl(G.ReservedQuantity,0) ReservedQuantity
,nvl(G.IncomingQuantity,0) IncomingQuantity
,nvl(G.AwaitedQuantity,0) AwaitedQuantity
,nvl(G.FoundQuantity,0) FoundQuantity
,nvl(G.Quantity+G.FoundQuantity-(G.ReservedQuantity+G.IncomingQuantity),0) FreeQuantity
from Supermag.SMGoods G, Supermag.SMStoreLocations L
where L.ID=G.StoreLoc(+)
and G.Article(+)=&Myarticle
and l.id(+)=&Mystoreloc
union
select
L.ID StoreLoc,G.Article,G.PackSize,G.Quantity
,G.ReservedQuantity,G.IncomingQuantity,G.AwaitedQuantity,G.FoundQuantity
,G.Quantity+G.FoundQuantity-(G.ReservedQuantity+G.IncomingQuantity) FreeQuantity
from Supermag.SMGoodsPacks G, Supermag.SMStoreLocations L
where L.ID=G.StoreLoc
and G.Article=&Myarticle and l.ID=&Mystoreloc) A, (select G.LocID,sum(G.SaleQuantity-G.ReturnQuantity) SaleQ
from Supermag.SMOperGoods G
where G.Article=&Myarticle and g.locid=&Mystoreloc
group by G.LocID) G
where A.StoreLoc=G.LocID(+)
order by A.PackSize
return Result;
end
И в бизнес-анализе использовать как
Цитата:
supermag.article_ost({Место хранения. Код места хранения},{Карточка товара. Артикул})
Честно говорю, на запрос надо смотреть, возможно он избыточен, просто я быстро изменила то, что предложил kadr.
29.12.2009 17:52
Starter
 
Выдает: Предупреждение: Функция создана с ошибками компиляции
30.12.2009 07:04
Mtirt
 
В заголовке ошибка, надо:
Цитата:
create or replace function article_ost(Mystoreloc in integer, Myarticle in Varchar2) return number is
30.12.2009 10:21
Starter
 
Без разницы. так же ошибки компиляции. Если один в один вставлять как написано, то он запрашивает:
Введите значение для myarticle:
Введите значение для mystoreloc:
Без разницы что вводишь (вводил &myarticle и &mystoreloc), выдает ошибки компиляции.
Если в тексте функции поменять &myarticle и &mystoreloc на просто myarticle и mystoreloc, то ничего не запрашивает, но ошибки компиляции все равно остаются.
После смены заголовка то же самое.
30.12.2009 10:38
Mtirt
 
Эту я скомпилила...
Цитата:
create or replace function article_ost(Mystoreloc in integer, Myarticle in Varchar2) return number is
Result number;
begin
select decode(A.PackSize,-1,A.FreeQuantity-nvl(G.SaleQ,0),null) OperFree into result
from (select
L.ID StoreLoc, Article,-1 PackSize
,nvl(G.Quantity,0) Quantity
,nvl(G.ReservedQuantity,0) ReservedQuantity
,nvl(G.IncomingQuantity,0) IncomingQuantity
,nvl(G.AwaitedQuantity,0) AwaitedQuantity
,nvl(G.FoundQuantity,0) FoundQuantity
,nvl(G.Quantity+G.FoundQuantity-(G.ReservedQuantity+G.IncomingQuantity),0) FreeQuantity
from Supermag.SMGoods G, Supermag.SMStoreLocations L
where L.ID=G.StoreLoc(+)
and G.Article(+)=Myarticle
and l.id(+)=Mystoreloc
union
select
L.ID StoreLoc,G.Article,G.PackSize,G.Quantity
,G.ReservedQuantity,G.IncomingQuantity,G.AwaitedQuantity,G.FoundQuantity
,G.Quantity+G.FoundQuantity-(G.ReservedQuantity+G.IncomingQuantity) FreeQuantity
from Supermag.SMGoodsPacks G, Supermag.SMStoreLocations L
where L.ID=G.StoreLoc
and G.Article=Myarticle and l.ID=Mystoreloc) A, (select G.LocID,sum(G.SaleQuantity-G.ReturnQuantity) SaleQ
from Supermag.SMOperGoods G
where G.Article=Myarticle and g.locid=Mystoreloc
group by G.LocID) G
where A.StoreLoc=G.LocID(+)
order by A.PackSize;
return Result;
end;
30.12.2009 10:48
Starter
 
Неа, не проходит. Предупреждение: Функция создана с ошибками компиляции.
может ее сперва удалить, а потом еще раз попробовать создать ? хотя вроде и так должно бы работать.
30.12.2009 14:05
kadr
 
А сообщи нам каким инструментом ты пользуешься
30.12.2009 14:08
kadr
 
строка
Код:
,G.ReservedQuantity,G.IncomingQuantity,G.AwaitedQu antity,G.FoundQuantity
содержит ошибку
парвильно
Код:
,G.ReservedQuantity,G.IncomingQuantity,G.AwaitedQuantity,G.FoundQuantity
30.12.2009 16:04
Starter
 
инструмент - SQL+ под пользователем supermag. после исправления функция была добавлена, без ошибок. однако задача все равно не запускается. в логе ошибка:

========
***** Результирующий запрос *****

SELECT (CRD.Article),(CRD.ShortName),(LOC.Name),round((SUM(((nvl(REM.Quantity,0)+nvl(REM.FoundQuantity,0)-nvl(REM.ReservedQuantity,0)-nvl(REM.IncomingQuantity,0))-nvl(REMOP.Quantity,0)))),3),round((SUM(supermag.smgetsellingpricebi(CRD.Article,null,LOC.ID,supermag.getaccountpriceforloc(LOC.ID)))),4),round((SUM(supermag.article_ost(LOC.ID,CRD.Article))),4)
FROM SMGoods REM,SMStoreLocations LOC,SVAOperGoods REMOP,SVCardName CRD,SVLocCard LC
WHERE LC.StoreLoc=LOC.ID and LC.Article=REM.Article(+) and LC.StoreLoc=REM.StoreLoc(+) and LC.Article=REMOP.Article(+) and LC.StoreLoc=REMOP.StoreLoc(+) and LC.Article=CRD.Article and CRD.article in (select article from supermag.ttidgroup) and LOC.ID=2
GROUP BY (CRD.Article),(CRD.ShortName),(LOC.Name)
ORDER BY 1 ASC,2 ASC,3 ASC
ORA-06575: Пакет или функция ARTICLE_OST в неверном состоянии
19.01.2010 11:46
Starter
 
А функция так и не работает. может кто из знатоков все же попробует добить эту задачу ? добавить функцию, добавить ее к бизнес анализу, чтобы точно работала там.
см 1.27.2
20.01.2010 14:27
Mtirt
 
Попробуй. Немного упростила запрос.
Он не учитывает случая, когда по месту хранения "Остатки в упаковках".
Цитата:
create or replace function article_ost(Mystoreloc in integer, Myarticle in Varchar2) return number is
Result number;
begin
select A.FreeQuantity-nvl(G.SaleQ,0) into result
from (select
L.ID StoreLoc, Article,
nvl(G.Quantity+G.FoundQuantity-(G.ReservedQuantity+G.IncomingQuantity),0) FreeQuantity
from Supermag.SMGoods G, Supermag.SMStoreLocations L
where L.ID=G.StoreLoc(+)
and G.Article(+)=Myarticle
and l.id(+)=Mystoreloc)a,
(select G.LocID,sum(G.SaleQuantity-G.ReturnQuantity) SaleQ
from Supermag.SMOperGoods G
where G.Article=Myarticle and g.locid=Mystoreloc
group by G.LocID) G
where A.StoreLoc=G.LocID(+);

return Result;
end article_ost;
20.01.2010 15:50
Starter
 
Ураа! заработало!
остатки в упаковках и не нужны...
спасибо :)
20.01.2010 16:08
Mtirt
 
Но ты цифры проверь, на всякий случай...
Потому как у себя я проверяла ровно на 2-3 артикулах...
20.01.2010 16:18
Starter
 
Ссылка на бизнес-модель

Цифирки проверил. Это первым делом. показывает остаток именно оперативный, с учетом оперативных продаж. в принципе это то, чего наши товароведы добивались года четыре. Теперь будем ждать чего они еще захотят.
по ссылке - модель. вдруг кому еще пригодится. работать разумеется будет только после добавления в СМ функции.

Цена прихода - решить можно путем деления суммы прихода на количество прихода.
добавляем два поля в модель - сумма прихода и кол-во прихода. проблема с делением на 0 решается вышеописанным путем использования decode.
формула типа: decode({Поля задачи. 9. Сумма: Кол-во приход},0,0,{Поля задачи. 21. Сумма: Сумма приход}/{Поля задачи. 9. Сумма: Кол-во приход})

аналогично можно решить и задачу цены продажи.
Опции темы


Часовой пояс GMT +3, время: 18:42.

 

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