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;