[ОТВЕТИТЬ]
24.10.2012 15:41
whitewizard
 
Сделал отчёт типа оборотной ведомости, но более расширенный.
Показывает приходы, расходы, списания, возвраты, штрихкода и последнего поставщика.
Всё хорошо, но появилась мысль сделать в фильтре ещё отбор по контрагенту.
Но у меня это поле вычисляемое и текстовое.
Есть мысли как контрагента добавить в филтр?
По табличкам бизнес-анализа полазил, но чот идеи не возникло.
24.10.2012 16:16
Mtirt
 
Версия Супермага?
24.10.2012 16:22
Mtirt
 
Фильтр - Добавить - Поля задачи, не сработает?
24.10.2012 16:24
whitewizard
 
Работает. Но там текстовое поле и надо в него копировать наименование контрагента.
А хочется выбор сделать.
24.10.2012 16:26
baggio
 
поставь в фильтр не наименование ...а код контрагента...
но тогда у тебя другой косяк вылезет...
будут показыватся документытолько по данному постащику...
а он в розницу не торгует 6)

тоже не знаю пока как побороть...
24.10.2012 16:30
whitewizard
 
В этой задаче вообще контрагента нет. Это вычисляемое поле.
24.10.2012 16:31
Mtirt
 
Разницы Код или Наименование нету...
В любом случае выбор не организовать - это объект, не связанный с объектами БД.


whitewizard, для текста условие "Содержит" нельзя выбрать?
24.10.2012 16:35
whitewizard
 
Неа. Надо именно выбор из списка.
24.10.2012 16:37
baggio
 
Цитата:
whitewizard В этой задаче вообще контрагента нет. Это вычисляемое поле.
э... а ты какую системную задачу брал за основу?
24.10.2012 16:40
whitewizard
 
Движение артикула за период
24.10.2012 16:45
baggio
 
Блин... а чего то туплю?...
у меня только:

Востребованность артикулов. ABC-анализ
Движение артикула в производстве
Движение артикула по контрагентам
Количество приходов / расходов артикула
Основания товародвижения по FIFO
Остатки на дату
Остатки на дату по свойствам
Остатки текущие
Остатки текущие по свойствам
Реализация в закупочных ценах по артикулам
Реализация по артикулам
Реализация по чекам
Сумма реализации в закупочных ценах по местам хранения и датам
Сумма реализации по артикулам. ABC-анализ
Сумма реализации по группам товаров. ABC-анализ
Сумма реализации по группам товаров с детализацией по местам хранения
Сумма реализации по местам хранения и датам
24.10.2012 17:01
Mtirt
 
Цитата:
baggio Блин... а чего то туплю?...
у меня только:

Востребованность артикулов. ABC-анализ
Движение артикула в производстве
Движение артикула по контрагентам
Количество приходов / расходов артикула
Основания товародвижения по FIFO
Остатки на дату
Остатки на дату по свойствам
Остатки текущие
Остатки текущие по свойствам
Реализация в закупочных ценах по артикулам
Реализация по артикулам
Реализация по чекам
Сумма реализации в закупочных ценах по местам хранения и датам
Сумма реализации по артикулам. ABC-анализ
Сумма реализации по группам товаров. ABC-анализ
Сумма реализации по группам товаров с детализацией по местам хранения
Сумма реализации по местам хранения и датам
Это стандартные отчеты. А задача называется "Движение артикула".
При создании новой попробуй выбрать - увидишь.
15.01.2013 10:09
Starter
 
Цитата:
whitewizard Сделал отчёт типа оборотной ведомости, но более расширенный.
Показывает приходы, расходы, списания, возвраты, штрихкода и последнего поставщика.
Всё хорошо, но появилась мысль сделать в фильтре ещё отбор по контрагенту.
Но у меня это поле вычисляемое и текстовое.
Есть мысли как контрагента добавить в филтр?
По табличкам бизнес-анализа полазил, но чот идеи не возникло.
Делали нечто подобное, только за основу брали движение артикула по документам. там есть контрагент. Но там слегка логика извращенная - указывается период побольше, выбирается контрагент, затем отбираются приходы по нему, и уже по этим карточкам вычисляется документ последнего прихода, поставщик последнего прихода, продажи с момента последнего прихода и оперативный остаток.
довольно часто бывает, что поставщик по которому отбор велся первоначально вовсе не поставщик последнего прихода.

В принципе, можно взять эту задачу за основу, но из полей задачи брать только карточку, контрагента, приход, а продажи уже вычислять. тогда фильтр будет работать по контрагенту. Вот только вычислить - действительно ли продажи были именно из приходов этого контрагента - не реально будет. если товар поставлялся несколькими поставщиками, данные некорректные будут.
07.03.2014 07:05
konvik
 
Ребята, подскажите, пожалуйста, как выбрать Поставщика Последнего прихода? Выбрала за основу задачу Остатки на дату. Пробовала взять Движение артикула по документам, но там также отображается Контрагент из Расхода (Если расход был последним по дате документом по артикулу). А надо взять контрагента только Прихода.
Цель отчета совсем простая - Артикул - Остаток по артикулу - Поставщик последнего прихода
07.03.2014 19:56
Starter
 
выбрать - никак. в задачу можно добавить такое поле - поставщик последнего прихода, но для этого нужны доп. функции.
ниже пример использования и сами функции - вычисление документа последнего прихода, получение информации по документу, получение информации по коду контрагента.
пример использования в бизнес анализе:
получение кода контрагента последнего прихода для определенного артикула.
Get_Document_Info( Article_LastDocID({Место хранения. Код места хранения},{Карточка товара. Артикул},0),'CLIENTINDEX','WI')
получение наименования контрагента
RAD_GET_Client_Info(TO_NUMBER({...здесь поле задачи с вычислением кода контрагента...}),0)

А зная документ последнего прихода несложно вычислить цену последнего прихода, количество и прочее-прочее.

=======
Create or Replace Function Article_LastDocID(
MyStoreloc IN SUPERMAG.SMSTORELOCATIONS.ID%TYPE,
MyArticle IN SUPERMAG.SMCARD.ARTICLE%TYPE,
MyOpCode IN SUPERMAG.SMDOCUMENTS.OPCODE%TYPE,
MyUserOp IN SUPERMAG.SMDOCUMENTS.USEROP%TYPE := null)
return VARCHAR2 is
res_all varchar2 (100);
res_0 integer := -1;
BEGIN
-- res_0 - признак типа МХ для операции: 0 - нет операции, 1 - расход, 2 - приход. -1 - внутреннее перемещение
select (decode(a.incometype, 0,
decode(a.expensetype, 0, 0, 1), 2))
into res_0
from supermag.saoperation a
where a.id = MyOpCode
and a.incometype*a.expensetype = 0;
res_0:= nvl(res_0, -1);

IF res_0 >= 0 THEN
SELECT MAX(TO_CHAR(d.CREATEDAT, 'YYYYMMDD') || d.ID)
INTO res_all
FROM supermag.smdocuments d, supermag.smspec s
WHERE d.opcode = MyOPCode
and (d.userop = MyUserOp or MyUserOp is null)
and d.createdat <= TRUNC(sysdate)
and decode(res_0, 0, d.location, 1, d.locationfrom, 2, d.locationto) = MyStoreloc
and d.docstate = 3 -- статус документа
and s.doctype = d.doctype
and s.docID = d.ID
and s.article = MyArticle;
ELSE -- дял внутренних перемещений всех видов
SELECT MAX(TO_CHAR(d.CREATEDAT, 'YYYYMMDD') || d.ID)
INTO res_all
FROM supermag.smdocuments d, supermag.smspec s
WHERE d.opcode = MyOPCode
and (d.userop = MyUserOp or MyUserOp is null)
and d.createdat <= TRUNC(sysdate)
and (d.locationfrom = MyStoreloc or d.locationto = MyStoreloc)
and d.docstate = 3 -- статус документа
and s.doctype = d.doctype
and s.docID = d.ID
and s.article = MyArticle;
END IF;

IF res_all IS NULL THEN
RETURN NULL;
ELSE
RETURN(SUBSTR(res_all, 9, LENGTH(res_all) - 8));
END IF;
EXCEPTION WHEN NO_DATA_FOUND THEN RETURN NULL;

END Article_LastDocID;
/
grant execute on supermag.Article_LastDocID to supermag_user;
commit;

Create or Replace Function Article_LastDocID_from_DATE(
MyStoreloc IN SUPERMAG.SMSTORELOCATIONS.ID%TYPE,
MyArticle IN SUPERMAG.SMCARD.ARTICLE%TYPE,
MyOpCode IN SUPERMAG.SMDOCUMENTS.OPCODE%TYPE,
MyUserOp IN SUPERMAG.SMDOCUMENTS.USEROP%TYPE := null,
MyDATE IN DATE
)
return VARCHAR2 is
res_all varchar2 (100);
res_0 integer := -1;
BEGIN
-- res_0 - признак типа МХ для операции: 0 - нет операции, 1 - расход, 2 - приход. -1 - внутреннее перемещение
select (decode(a.incometype, 0,
decode(a.expensetype, 0, 0, 1), 2))
into res_0
from supermag.saoperation a
where a.id = MyOpCode
and a.incometype*a.expensetype = 0;
res_0:= nvl(res_0, -1);

IF res_0 >= 0 THEN
SELECT MAX(TO_CHAR(d.CREATEDAT, 'YYYYMMDD') || d.ID)
INTO res_all
FROM supermag.smdocuments d, supermag.smspec s
WHERE d.opcode = MyOPCode
and (d.userop = MyUserOp or MyUserOp is null)
and d.createdat <= TRUNC(MyDATE)
and decode(res_0, 0, d.location, 1, d.locationfrom, 2, d.locationto) = MyStoreloc
and d.docstate = 3 -- статус документа
and s.doctype = d.doctype
and s.docID = d.ID
and s.article = MyArticle;
ELSE -- дял внутренних перемещений всех видов
SELECT MAX(TO_CHAR(d.CREATEDAT, 'YYYYMMDD') || d.ID)
INTO res_all
FROM supermag.smdocuments d, supermag.smspec s
WHERE d.opcode = MyOPCode
and (d.userop = MyUserOp or MyUserOp is null)
and d.createdat <= TRUNC(sysdate)
and (d.locationfrom = MyStoreloc or d.locationto = MyStoreloc)
and d.docstate = 3 -- статус документа
and s.doctype = d.doctype
and s.docID = d.ID
and s.article = MyArticle;
END IF;

IF res_all IS NULL THEN
RETURN NULL;
ELSE
RETURN(SUBSTR(res_all, 9, LENGTH(res_all) - 8));
END IF;
EXCEPTION WHEN NO_DATA_FOUND THEN RETURN NULL;

END Article_LastDocID_from_DATE;
/
grant execute on supermag.Article_LastDocID_from_DATE to supermag_user;

Create or Replace Function Get_Document_Info(
MyDocID IN VARCHAR2,
MyWhat IN VARCHAR2,
MyDocType in VARCHAR2)
return VARCHAR2 is
res_all varchar2 (1024);
VSQL VARCHAR2(25000);
i integer := 0;
iData_Type varchar2(100);
BEGIN
SELECT COUNT(*) -- проверка правильности ввода имени столбца
INTO i
FROM SYS.ALL_TAB_COLUMNS
WHERE OWNER = 'SUPERMAG' AND TABLE_NAME = 'SMDOCUMENTS' AND UPPER(COLUMN_NAME) = UPPER('' || MyWhat || '');
if nvl(i, 0) = 0 then
return (null);
end if;

i := 0; -- проверка наличия документа в БД
select 1
into i
from supermag.smdocuments
where id = MyDocID and doctype=MyDocType;
if nvl(i, 0) = 0 then
return (null);
end if;

SELECT Data_Type -- тип столбца
INTO iData_Type
FROM SYS.ALL_TAB_COLUMNS
WHERE OWNER = 'SUPERMAG' AND TABLE_NAME = 'SMDOCUMENTS' AND UPPER(COLUMN_NAME) = UPPER('' || MyWhat || '');


if UPPER(iData_Type) = 'DATE' then -- конвертация для типа Date
VSQL := 'select to_char(s.' || MyWhat || ', ''dd.mm.yyyy'')' ||
' from supermag.smdocuments s ' ||
' where s.id = ''' || MyDocID || ''''||
' and s.doctype = ''' || MyDocType || ''''
;
else
VSQL := 'select (s.' || MyWhat || ') as MyValue' ||
' from supermag.smdocuments s ' ||
' where s.id = ''' || MyDocID || '''' ||
' and s.doctype = ''' || MyDocType || ''''
;
end if;

EXECUTE IMMEDIATE VSQL into res_all;

RETURN nvl(res_all, NULL);

EXCEPTION WHEN others THEN
RETURN (null);

END Get_Document_Info;
/
grant execute on supermag.Get_Document_Info to supermag_user;

--Функция получения информации по контрагенту по его коду.
--MyWhat - что получаем, по умолчанию - полное название
-- 1 = ИНН
create or replace function RAD_GET_Client_Info
(MyClientID IN NUMBER,MyWhat in number) return varchar2 is
Result varchar2(255);
begin
Result:='';
IF (MyWhat=1) THEN
select D.INN into Result from Supermag.SMClientInfo D
WHERE D.ID=MyClientID;
ELSE
select D.NAME into Result from Supermag.SMClientInfo D
WHERE D.ID=MyClientID;
END IF;
return Result;
end RAD_GET_Client_Info;
/
commit;
08.03.2014 11:15
konvik
 
Starter, спасибо за помощь! Попробую после выходных!
11.03.2014 10:56
konvik
 
Получилось добавить новое поле Код поставщика. А Наименование поставщика не получается - выдается ошибка

----- Прерывание работы программы -----
сообщение: "ORA-01481: недопустимая модель формата числа
"
исключение: Sm.Core.InteropException
hResult: 80004005h; доп. код: 1481
источник: Microsoft OLE DB Provider for Oracle

----- Причина исключения, уровень вложения 1 -----
сообщение: "begin supermag.SMARunTemplate(1019); end;"
исключение: Sm.Core.InteropException
hResult: 80004005h; доп. код: 0
источник: SmLibaryBase trace
11.03.2014 11:10
OlegON
 
Так показывай, как делала...
11.03.2014 11:31
OlegON
 
почитай описание to_number и посмотри, что ты туда напихала...
11.03.2014 12:06
konvik
 
Starter говорит Код клиента считаем так: Get_Document_Info( Article_LastDocID({Место хранения. Код места хранения},{Карточка товара. Артикул},0),'CLIENTINDEX','WI')
Получение наименования контрагента
RAD_GET_Client_Info(TO_NUMBER({...здесь поле задачи с вычислением кода контрагента...}),0)

Поэтому я запихала туда только это. Помогите!
11.03.2014 12:07
Starter
 
И для этого поля нужно использовать тип возвращаемых данных "строка"
как у нас вычисляется:
RAD_GET_Client_Info(TO_NUMBER({Поля задачи. 6. Пост. ПП}),0)
в качестве первого аргумента используется уже существующее поле задачи (где код контрагента последнего прихода).
но можно и вот так:
RAD_GET_Client_Info(TO_NUMBER(Get_Document_Info( Article_LastDocID({Место хранения. Код места хранения},{Карточка товара. Артикул},0),'CLIENTINDEX','WI')),0)
11.03.2014 12:12
konvik
 
Цитата:
Starter И для этого поля нужно использовать тип возвращаемых данных "строка"
как у нас вычисляется:
RAD_GET_Client_Info(TO_NUMBER({Поля задачи. 6. Пост. ПП}),0)
в качестве первого аргумента используется уже существующее поле задачи (где код контрагента последнего прихода).
но можно и вот так:
RAD_GET_Client_Info(TO_NUMBER(Get_Document_Info( Article_LastDocID({Место хранения. Код места хранения},{Карточка товара. Артикул},0),'CLIENTINDEX','WI')),0)
:-* Starter огромное спасибо!
09.07.2015 17:41
hells
 
Подыму тему. Подскажите кто знает как подтянуть контрагента не последнего прихода, а меньше даты "остатка на конец" из Модели: Остатки на дату.
Я так понимаю вместо Get_Document_Info нужна другая таблица?
09.07.2015 21:19
Starter
 
Т.е. интересует контрагент не последнего прихода (т.е. на сегодняшнее число), а чтобы бралась дата, и уже от этой даты искался последний приход и соответствующий контрагент ?
Тогда рекомендую функцию Article_LastDocID изменить.
Вместо нее использовать Article_LastDocID_from_DATE:
Вызов аналогичен Article_LastDocID, только добавлен еще один параметр - дата, начиная с которой идет поиск.
SQL код:
Create or Replace Function Article_LastDocID_from_DATE(
                
MyStoreloc IN SUPERMAG.SMSTORELOCATIONS.ID%TYPE
                
MyArticle IN SUPERMAG.SMCARD.ARTICLE%TYPE
                
MyOpCode IN SUPERMAG.SMDOCUMENTS.OPCODE%TYPE
                
MyUserOp IN SUPERMAG.SMDOCUMENTS.USEROP%TYPE := null,
      
MyDATE IN DATE

return 
VARCHAR2 is
res_all varchar2 
(100);
res_0 integer := -1;
BEGIN
        
-- res_0 признак типа МХ для операциинет операциирасходприход. -внутреннее перемещение
        select 
(decode(a.incometype0
                    
decode(a.expensetype001), 2))
            
into res_0
       from supermag
.saoperation a
            where a
.id MyOpCode
            
and a.incometype*a.expensetype 0;
        
res_0:= nvl(res_0, -1);
        
        IF  
res_0 >= 0 THEN 
        SELECT MAX
(TO_CHAR(d.CREATEDAT'YYYYMMDD') || d.ID)
            
INTO res_all
        FROM supermag
.smdocuments dsupermag.smspec s
        WHERE d
.opcode MyOPCode
          
and (d.userop MyUserOp or MyUserOp is null)
          and 
d.createdat <= TRUNC(MyDATE)
          and 
decode(res_00d.location1d.locationfrom2d.locationto) = MyStoreloc
          
and d.docstate -- статус документа
          
and s.doctype d.doctype
          
and s.docID d.ID
          
and s.article MyArticle;
      ELSE -- 
дял внутренних перемещений всех видов
        SELECT MAX
(TO_CHAR(d.CREATEDAT'YYYYMMDD') || d.ID)
            
INTO res_all
        FROM supermag
.smdocuments dsupermag.smspec s
        WHERE d
.opcode MyOPCode
          
and (d.userop MyUserOp or MyUserOp is null)
          and 
d.createdat <= TRUNC(sysdate)
          and (
d.locationfrom MyStoreloc or d.locationto MyStoreloc)
          and 
d.docstate -- статус документа
          
and s.doctype d.doctype
          
and s.docID d.ID
          
and s.article MyArticle;
      
END IF;
               
        IF 
res_all IS NULL THEN
           
RETURN NULL;   
        ELSE   
          RETURN(
SUBSTR(res_all9LENGTH(res_all) - 8));
        
END IF;
       
EXCEPTION WHEN NO_DATA_FOUND THEN RETURN NULL;
      
END Article_LastDocID_from_DATE;
/
grant execute on supermag.Article_LastDocID_from_DATE to supermag_user;
commit
09.07.2015 22:57
hells
 
Прошу прощения за тупость, я в SQL не силен, а как это добавить в masdef
09.07.2015 23:28
hells
 
Пытаюсь так:

TO_NUMBER(Get_Document_Info( Article_LastDocID_from_DATE({Место хранения. Код места хранения},{Карточка товара. Артикул},0,{Фильтр. Параметр модели. Отчетный период. FDateLast}),'CLIENTINDEX','WI'))

Выдает:

Причина исключения, уровень вложения 1 -----
сообщение: "Ошибка открытия курсора. ORA-06553: PLS-306: ошибочно число или типы аргументов при обращении к 'ARTICLE_LASTDOCID_FROM_DATE'"
исключение: Sm.Core.InteropException
hResult: 80004005h; доп. код: 20012
источник: База данных

----- Причина исключения, уровень вложения 2 -----
сообщение: "ORA-20012: Ошибка открытия курсора. ORA-06553: PLS-306: ошибочно число или типы аргументов при обращении к 'ARTICLE_LASTDOCID_FROM_DATE'
ORA-06512: на "SUPERMAG.CORE", line 324
ORA-06512: на "SUPERMAG.ANALYTICS", line 2224
ORA-06553: PLS-306: ошибочно число или типы аргументов при обращении к 'ARTICLE_LASTDOCID_FROM_DATE'
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(1886); end;"
исключение: Sm.Core.InteropException
hResult: 80004005h; доп. код: 0
источник: SmLibaryBase trace
10.07.2015 06:48
Mtirt
 
Как-то описание аргументов функции Article_LastDocID_from_DATE не совпадает с тем, что вы в неё передаете.
4-ый аргумент MyUserOp, а вы туда дату пытаетесь передать, которая должна быть в 5-м аргументе.
Опции темы


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

 

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