25.09.2019 16:32
OlegON
 
Пользуйся нормальными редакторами с подсветкой синтаксиса... Не вникал, но ...

25.09.2019 17:33
Starter
 
скопируйте в блокнот, или в Notepad++ или ещё куда, упростите выражение, получите:
decode(продажа кол/(число дней) ,0,0,ост кол/(продажа кол/(число дней))
действительно, скобки не хватает. И потом - а если пользователь выберет один день в фильтре ? тогда тоже упадёт с делением на ноль.
Ну и, вспомнив математику, z/(x/y) = z*y/x
т.е. проверять на ноль нужно только количество продаж.
Затем - число дней = дата конца - дата начала +1. так как иначе если выбран один день (дата начала = дата конца), тогда у вас число дней продаж будет равно 0.

т.е. нужно писать
decode({Реализация. Общая, кол-во},0,0,{Остатки на конец периода. Остаток, кол-во}*({Фильтр. Параметр модели. Отчетный период. FDateLast}-{Фильтр. Параметр модели. Отчетный период. FDateFirst}+1)/{Реализация. Общая, кол-во})
18.10.2019 06:25
Tiger
 
Не могу сообразить как на основе выбранной модель "Реализация в закупочных ценах за период" добавить еще столбец "Число дней реализации" в созданную задачу.
18.10.2019 08:48
Starter
 
Стандартными методами - никак. В этой задаче нет поля Дата, поэтому добавить функцию подсчета уникальных дат продаж не получится. Вот если бы задача была на основе модели "Реализация в закупочных ценах по датам", то было бы просто.
Но, как всегда, есть выход, нужно только прочитать инструкцию к бизнес анализу, а именно, ту её часть, которая называется "для продвинутых пользователей". Найти несложно в хранилище, https://storage.olegon.ru/supermag/С...вателей.doc.7z

Для облегчения функцию, которая подсчитывает число дней продажи в выбранном периоде я написал:
SQL код:
create or replace function RAD_Get_Card_Sale_Count_Dates(ADateFrom in dateADateTo in dateALocID in supermag.smstorelocations.id%type,
  
AArticle in supermag.smcard.article%type) return integer 
 is
  res integer
;
  
error_param_value exception
  
begin
  SELECT round
((COUNT(DISTINCT D.SaleDate)), 0into res
    FROM SMStoreLocations LOC
        
,SVARealCostPriceOpenedPeriod D
        
,SVCardName CRD
    WHERE D
.Article CRD.Article
        
AND D.StoreLoc LOC.ID
        
AND CRD.article =  AArticle
        
AND D.SaleDate BETWEEN ADateFrom AND ADateTo
        
AND (nvl(D.SaleQty0) != 0)
        AND 
LOC.ID ALocID;
    return(
res);
exception 
  when no_data_found then
    
return(null);
  
when others then
    raise
;
end RAD_Get_Card_Sale_Count_Dates;
/  
commit
Всё остальное довольно подробно разжевано в документации.
18.10.2019 10:35
Tiger
 
Цитата:
Starter Для облегчения функцию, которая подсчитывает число дней продажи в выбранном периоде я написал
Всё остальное довольно подробно разжевано в документации.
Starter, спасибо за функцию. Но можно поподробнее как ее добавить? Под каким пользователем? Нужно ли будет выдавать гранты пользователям супермага, которые будут пользоваться этой задачей?
18.10.2019 11:11
Starter
 
1. sqlplus
2. supermag
3. Если сильно хочется, то можно выполнить ещё код ниже, но будет работать и без этого:
SQL код:
grant execute on supermag.RAD_Get_Card_Sale_Count_Dates to supermag_user;
commit
Как добавить вызов функции в бизнес-анализе довольно подробно в документации описано. Параметры функции вроде тоже интуитивно понятно названы.
Часовой пояс GMT +3, время: 01:57.

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