МиСПрИС_Задание2_4_Петрова_Романова_Заболотников_9373
.pdfselect name_product,id_variation ,id_type_prod from product where id_product = pIdEl into vName,vConf,vTypeProd;
if ((vConf=1)or(vConf=2)or (vConf is null)) then --Если это не вариация,
то выберем за ииследуемый продукт введённый vREl=pIdEl;
else --Если нет, то выберем типовой vREl=vTypeProd;
end if;
select count(*) from spec_product where id_mainproduct = vREl into vYesSpec; --Посмотрим, есть ли вообще спецификации для этого продукта
oRes=0;
if ( vYesSpec >0) then --Если есть
if( pUr=0) then --Если 0 уровень, то есть первый прогон функции,
то проверим на циклы
select count(*) from FIND_CIRCLE(vREl,0) where oYesCircle>0 into oRes;
end if; vUr=pUr+1; oUr=vUr; vIdEl=vREl;
if(oRes>0) then --Если есть циклы, то выйде из функции
raise notice '% % % % % %', oIdEl, oName, oInEl, oInName, oQ,
oUr;
return next;
else --Если циклов нет
for f in select id_useproduct ,q_insp , id_function, id_pair from spec_product where id_mainproduct = vREl --будем выбирать каждый продукт в специф. для заданного продукта
loop
vInEl = f.id_useproduct; vQ = f.q_insp;
vFConf = f.id_function; vIdPos = f.id_pair;
if(vFConf >0) then --Если правило для этой позиции в специф.
есть
select s.oRes from isInSpec(pMainEl,vIdPOS) as s into vYesPos; --Проверим, удовлетворяет ли она его
41
end if;
if((vFConf is null)or(vFConf>0)and(vYesPos=1))then --Если правила нет или оно есть и выполнено, то
oIdEl=vIdEl;
oName=vName;
oUr=vUr;
select name_product from product where id_product = vInEl into oInName; --найде имя этого продукта
oInEl=vInEl;
vTQ=vQ*pQ;
oQ=vTQ;
raise notice '% % % % % %', oIdEl, oName, oInEl, oInName,
oQ, oUr;
return next;
for f2 in select tab.oIdEl, tab.oName, tab.oInEl, tab.oInName, tab.oQ,tab.oUr from SUM_Q_CONF(pMainEl,vInEl,vUr,vTQ) as tab
loop
oIdEl = f2.oIdEl; oName =f2.oName; oInEl = f2.oInEl;
oInName = f2.oInName; oQ =f2.oQ;
oUr = f2.oUr;
raise notice '% % % % % %', oIdEl, oName, oInEl,
oInName, oQ, oUr;
return next; end loop;
end if; end loop;
end if; end if;
END $$ LANGUAGE plpgsql;
/***************************************************************/
42
CREATE OR REPLACE function SUM_Q_F (
PIDEL integer, |
|
PQ double precision, |
|
PGR integer) |
|
returns table( |
|
INEL integer, |
|
OIDGR integer, |
|
ONAMEGR text, |
|
ONAMEEL text, |
|
OSUMQ double precision, |
|
oShortNameEI text, |
|
OIDEI integer) |
|
as $$ |
|
declare |
VGR integer; |
declare |
VYES integer; |
declare |
vIdCl integer; |
declare f record; |
|
BEGIN |
|
/*функция: |
|
Расчет расхода компонентов для исходного количества pQ на всю глубину |
|
спецификации для элемента pIdEl |
|
вход: |
|
pIdEl |
- Код элемента, для которого ведется расчет норм расхода |
pQ |
- Исходное количество в основной единице измерения |
выход: |
|
oInEl - ид. исходного элемента,
oIdGr - ид. терминальной группы входящего элемента, oNameGr - имя группы,
oShortNameEl обозначение группы, oNameEl - имя входящего элемента,
oSumQ - суммарное количество входящего элемента, oIdEI - ид. единицы измерения количества,
oShortNameEI - обозначение единицы измерения количества
*/ |
|
/*инициализация переменных |
*/ |
InEl=0; |
|
oIdGr=0; |
|
oSumQ=0.00001; |
|
|
43 |
oIdEI=0;
/*Группирование и суммирование всех найденных применяемостей*/
for f in select oInEl, SUM(oQ) as s from SUM_Q_CONF(pIdEl,pIdEl,0,pQ) group by oInEl
loop
InEl = f.oInEl; oSumQ = f.s;
raise notice '% % ', InEl,oSumQ; /*Поиск дополнительных характеристик*/
select name_product ,id_class from product where id_product = InEl into oNameEl,vGr;
raise notice '% % ', oNameEl,vGr;
select id_uom from classificator where id_class = vGr into oIdEI;
select short_name_uom from unit_of_measure where id_uom = oIdEI into oShortNameEI;
raise notice '% ', oShortNameEI;
/*Определение терминальной группы по коду схемы группирования*/
select name_class from classificator where id_class = vGr into
ONAMEGR;
OIDGR = vGr; return next;
end loop;
END $$ LANGUAGE plpgsql;
44