Есть необходимость получить фильтрацию в бизнес-анализе такого результата отчёта:
(Временной интервал и место хранение/места хранения задается пользователем)
Поля отчета. Артикул, Наименование товара, %наценки на товар или группу, доходность, разница наценки, место хранения название полное,цена прихода, цена реализации,количество продаж и сумма продаж.
- это всё сделано, но необходимо что бы в него не попадали позиции по которым действует маркетинговый контракт в Супермаге, и не учитывались позиции которые оплачиваются балами в УКМ - реализация загружается через XML конвертер, т.е. в чеках отображается какая скидка отработала на товар.
Просьба помочь в функции, которая сможет отфильтровать такое условие.
Aligator➤ не попадали позиции по которым действует маркетинговый контракт в Супермаге, и не учитывались позиции которые оплачиваются балами в УКМ - реализация загружается через XML конвертер, т.е. в чеках отображается какая скидка отработала на товар.
Т.е. имеется в виду те позиции, которые присутствуют в действующих на текущий момент документах маркетинговых акций ? Или карточка упоминается в документах МА, действующих в определенном периоде ?
И - по поводу чеков - не понятно. т.е. если в определенном выбранном периоде для этого товара была определённая скидка (пусть даже один раз), то такой товар не отображать ?
И - приложили бы задачу БА, понять, какая модель используется.
Starter➤ Т.е. имеется в виду те позиции, которые присутствуют в действующих на текущий момент документах маркетинговых акций ? Или карточка упоминается в документах МА, действующих в определенном периоде ?
И - по поводу чеков - не понятно. т.е. если в определенном выбранном периоде для этого товара была определённая скидка (пусть даже один раз), то такой товар не отображать ?
И - приложили бы задачу БА, понять, какая модель используется.
Да, для товаров в отчётный период при этом есть созданная МА в Супермаг+.
По чекам да, если в заданном периоде была продана позиция в чеке со скидкой - её исключить.
Отчёт во вложении
Aligator➤ Да, для товаров в отчётный период при этом есть созданная МА в Супермаг+.
У МА есть три даты - дата документа, дата начала, дата окончания. Ну и статус - завершена, исполняется, принята, черновик.
статус - без разницы ?
и "есть созданная МА в супермаг+" - имеется в виду пересечение двух временных диапазонов (отчета и акции (время начала - время конца)) ?
т.е. акция с 15 по 25 апреля, а диапазон отчета с 10 по 16 апреля - значит карточка фильтруется ?
Только необходимо функции добавить (ниже).
В функции для проверки чеков - входящий параметр - код скидки из укм4. это если в см+ смотреть скидки для конкретной позиции в чеке колонка "код скидки кассы".
В задаче во вложении прописан код скидки 16. Какой он будет у вас - неизвестно.
для маркетинговых акций - смотрится пересечение интервалов выбранных дат в задаче БА и дат действий маркетинговых акций. Статус акции не анализируется, т.е. акции в статусе черновик лучше не держать в базе, так как они тоже будут учитываться.
Ну и быстродействие, конечно, оставляет желать лучшего, поэтому лучше сперва потестить на нескольких карточках и небольшом периоде.
функции:
SQL код:
--получение для артикула id маркетинговых акций за период .
--если акций несколько, возврат нескольких значений через разделитель (,).
--если акций нет, то возврат null
--MyArticle - артикул
Create or Replace Function RAD_Get_AU_ID_By_Date(ADateFrom in date, ADateTo in date, ALocID in supermag.smstorelocations.id%type,AArticle in supermag.smcard.article%type)
return varchar2 is
l_str varchar2(2000) default null;
l_sep varchar2(1) default null;
BEGIN
for x in ( select au.id from supermag.SMSpecMA sp,supermag.smauctions au,supermag.smdocuments d
where ((ADateFrom between trunc(au.datebegin) and trunc(au.dateend)) or (ADateTo between trunc(au.datebegin) and trunc(au.dateend)))
and sp.DOCID=au.ID and sp.Article=AArticle and d.Location=ALocID and d.ID=AU.ID and D.doctype=AU.doctype and d.doctype='MA') loop
l_str := l_str||l_sep||x.id;
l_sep := ',';
end loop;
return l_str;
EXCEPTION WHEN OTHERS THEN RETURN NULL;
end RAD_Get_AU_ID_By_Date;
/
commit;
--Проверка наличия скидки на товар в чеках за определенный период
--вход. параметры: дата начала периода, дата конца периода, код места хранения, артикул, КОД СКИДКИ ИЗ УКМ4 (можно посмотреть в чеках в СМ+ или в параметрах скидки в укм4)
--Возврат =0 (нет чеков с такой скидкой) =1(есть чеки с такой скидкой)
create or replace function RAD_Is_Card_In_Check_Discounts(ADateFrom in date, ADateTo in date, ALocID in supermag.smstorelocations.id%type,
AArticle in supermag.smcard.article%type, AProgramID in integer) return integer
is
res integer:=0;
begin
select count(*) into res from dual
where exists (SELECT (S.Article), UKM4.PROGRAMID
FROM SVAnalyticsCheckItems S,SVAnalyticsCheck Z,SMCASHITEMSDISCUKM4 UKM4
WHERE S.LocID=UKM4.LocID(+) and S.DeskNum=UKM4.DeskNum(+) and S.ZNum=UKM4.ZNum(+) and S.CheckNum=UKM4.CheckNum(+) and S.Item=UKM4.Item(+)
and Z.LocID=S.LocID and Z.DeskNum=S.DeskNum and Z.ZNum=S.ZNum and Z.CheckNum=S.CheckNum
and S.article=AArticle and Z.CheckDate between trunc(ADateFrom) and trunc(AdateTo)
and Z.LocID=ALocID
and UKM4.PROGRAMID=AProgramID);
return (res);
exception when no_data_found then
return(0);
end RAD_Is_Card_In_Check_Discounts;
/
commit;
Добавил функцию, изменил код скидки, отчёт упирается в ошибку:
Код:
2018.04.20 (Friday) 10:38:52 1.35.0.0 sp1 Sm.Main ( NANALY )
----- Прерывание работы программы -----
сообщение: "Информацию о формировании курсора задачи смотрите в файле: D:\SM2000\Data\SmAnalyticsErrorLog.txt"
исключение: Sm.Core.InteropException
hResult: 80004005h; доп. код: 0
источник: Супермаг+
----- Причина исключения, уровень вложения 1 -----
сообщение: "Ошибка открытия курсора. ORA-00904: "RAD_IS_CARD_IN_CHECK_DISCOUNTS": недопустимый идентификатор"
исключение: Sm.Core.InteropException
hResult: 80004005h; доп. код: 20012
источник: База данных
----- Причина исключения, уровень вложения 2 -----
сообщение: "ORA-20012: Ошибка открытия курсора. ORA-00904: "RAD_IS_CARD_IN_CHECK_DISCOUNTS": недопустимый идентификатор
ORA-06512: на "SUPERMAG.CORE", line 353
ORA-06512: на "SUPERMAG.ANALYTICS", line 2563
ORA-00904: "RAD_IS_CARD_IN_CHECK_DISCOUNTS": недопустимый идентификатор
ORA-06512: на "SUPERMAG.SMARUNTEMPLATE", line 5
ORA-06512: на line 1"
исключение: Sm.Core.InteropException
hResult: 80004005h; доп. код: 20012
источник: Microsoft OLE DB Provider for Oracle
----- Причина исключения, уровень вложения 3 -----
сообщение: "begin supermag.SMARunTemplate(1452); end;"
исключение: Sm.Core.InteropException
hResult: 80004005h; доп. код: 0
источник: SmLibaryBase trace
Неа, не добавили. По крайней мере, ругается, что нет такой функции. Может быть, если копировали текст в SQL+, там размер буфера ограничен и целиком текст обеих функций не влез. Попробуйте функции добавить по очереди, сперва одну, затем вторую.
Либо, как вариант, версия см+ старая и там нет таблицы SMCASHITEMSDISCUKM4 и функция не добавляется из за ошибки.
что получается, если в SQL+ сделать
Starter,
по скидке в чеке отбор происходит, показывает галка есть она или нет, а вот по МА не отображает.
К примеру во вложении, акция есть, продажа была, но в отчёте нет отметки.
Места проведения акции точно указаны - по этому же МХ и отбираю.