Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

МиСПрИС_Задание2_4_Петрова_Романова_Заболотников_9373

.pdf
Скачиваний:
16
Добавлен:
20.06.2023
Размер:
1.31 Mб
Скачать

select 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