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

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

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

into pRes; return next;

end $$ LANGUAGE plpgsql;

/*********************************************************************

*******/

/******* Список параметров конфигурации для типового изделия

************/

CREATE OR REPLACE function FIND_PAR_CONF(pIdProd integer)

returns table (oIdPar integer, oTypePar integer, oNamePar text,oRes integer)

as $$

declare vYesType integer; declare f record;

begin

/*функция: находит список параметров конфигурации типового изделия вход: pIdProdид. типового изделия

выход: oIdPar - ид. параметра, oTypePar - тип параметра, oNamePar - имя параметра

oRes - 0 - ошибка, 1 - параметры найдены*/

oRes=0;

select id_variation from product where id_product = pIdProd into vYesType;

if(vYesType= 2) then --Если продукт типовой: 1-Без конфиг, 2-Типовой,

3-Вариант Конфиг

for f in select id_param from typeprod_param --Будем перебиратьь все параметры для продукта в таблице параметров для типового продукта

where id_prod = pIdProd

loop

oIdPar = f.id_param;

select id_paramtype from parameters --Узнаём тип параметра (1-

Численный, 2 - перерчисление) where id_param = oIdPar into oTypePar;

71

select name_paramtype from type_param --Узнаём название типа

параметра

where id_paramtype =oTypePar into oNamePar;

oRes=1;

return next; end loop;

else

return next; end if;

end $$ LANGUAGE plpgsql;

/*********************************************************************

********************************************/

/***************************Формирование списка значений по типовому продукту************************************/

CREATE OR REPLACE function COPY_PAR_CONF (

PIDPROD integer)

returns table( ORES integer)

as $$

declare VPAR integer; declare VIDCLASS integer; declare VYES integer; declare pTypeProd integer; declare f record;

declare flag integer; begin

/*функция: Формирует список для значений параметров конфигурации экземпляра pIdProd

вход:pIdProd - ид. варианта исполнения pTypeProd - ид. типового продукта

выход:oRes - 0 - ошибка 1 - список сформирован эффекты: */

72

oRes=1;

select id_type_prod from product where id_product = PIDPROD into pTypeProd; --Узнаем какой продукт типовой для данного

if (select id_variation from product where id_product = PIDPROD) = 3 then --Проверим является ли введённый продукт вариацией

for f in select id_param from typeprod_param -- переберёём все парраметры конфигурации типового для введённого изделия

where id_prod = pTypeProd

loop

vPar = f.id_param;

select id_pair from prod_param --Узнаем был ли уже записан данный парамметр

where id_prod = pIdProd and id_param = vPar into vYes;

if(vYes is null) then --Если не был

select r.oRes from add_prod_param(pIdProd, VPAR , NULL, NULL) as r into flag; --Запишем его

if(flag = 1) then oRes = 1;

else

oRes = 0; end if;

else

oRes=0; end if;

end loop;

else oRes=0;

end if; return next;

end $$ LANGUAGE plpgsql;

/*****************************Создает вариант исполнения**********************************/

CREATE OR REPLACE function NEW_VAR_PROD ( pTypeProd integer) returns table(

73

OIDPROD integer, oName text,

RESu integer) as $$

declare vConf integer; declare vIdCl integer; declare VYESTERM integer;

begin

/*функция:Создает вариант исполнения по прототипу типового изделия с параметрами

вход:pTypeProd

выход:OIDPROD - ид. варианта исполнения, oName - имя варианта,

oShName - обозначние варианта,

ORES - oRes - 0 - ошибка, 1 - новый вариант создан

*/

RESu=0;

select name_product,id_variation, id_class from product --найдем имя,

класс и Варинт конфигурации типового продукта where id_product = pTypeProd

into oName,vConf,vIdCl;

if(vConf=2) then --Если изделие по которому мы создаем вариацию типовое

RESu=1;

select * from add_product(oName,vIdCl,pTypeProd,3) into oIdProd; --Вызов стандартной функции создания изделия

select Res from COPY_PAR_PROD(oIdProd) into RESu; --создадим список параметров класса

select oRes from COPY_PAR_CONF(oIdProd) --создадим список типовых параметров

into RESu; end if;

return next;

end $$ LANGUAGE plpgsql; /********************************************Cписок значений параметров конфигурации варианта исполнения************************************************/

74

CREATE OR REPLACE function READ_VAR_CONF(pIdProd integer)

returns table(oIdPar integer, oName text, oVal double precision, oValEnumName text

)

as $$

declare vTypePar integer; declare vTypeProd integer; declare f record;

declare vIdEnum integer; declare vVal integer; declare vIdVal integer;

begin

/*функция: возвращает список значений параметров конфигурации варианта исполнения

вход: pIdProd - ид.изделия,

выход: oIdPar - ид.параметра, oName - имя параметра,

oVal - значение вещественного параметра, oValEnum - код значения перечисления, oValEnumName - имя значения перечисления, oRes - 0 - ошибка, 1 - ОК

*/

select id_type_prod from product where id_product = pIdProd

into vTypeProd;

if (select id_variation from product where id_product = pIdProd) = 2 then

vTypeProd = pIdProd; end if;

for f in select id_param from typeprod_param --Рассматриваем параметры конфигурации

where id_prod = vTypeProd

loop

oIdPar = f.id_param;

select name_param,id_paramtype,id_enum from parameters --Их имя,

ид. и перечисление

75

where id_param = oIdPar

into oName,vTypePar, vIdEnum;

select value ,id_enum_value from prod_param --Узнаём значения этих параметров

where (id_prod = pIdProd)and(id_param = oIdPar) into oVal,vIdVal;

select name_value from enum_value where id_value = vIdVal

into oValEnumName;

return next; end loop;

end $$ LANGUAGE plpgsql;

/********************************************Cписок значений параметров

************************************************/

CREATE OR REPLACE function READ_Param(pIdProd integer)

returns table(oIdPar integer, oName text, oVal double precision, oValEnumName text,

oRes integer)

as $$

declare vTypePar integer; declare vTypeProd integer; declare f record;

declare vIdEnum integer; declare vVal integer; declare vIdVal integer;

begin

/*функция: возвращает список значений параметров конфигурации варианта исполнения

вход: pIdProd - ид.изделия,

выход: oIdPar - ид.параметра, oName - имя параметра,

oVal - значение вещественного параметра, oValEnum - код значения перечисления,

76

oValEnumName - имя значения перечисления, oRes - 0 - ошибка, 1 - ОК

*/

oRes=0;

for f in select id_param, value, id_enum_value from prod_param --

Рассматриваем параметры

where id_prod = pIdProd

loop

oIdPar = f.id_param; vIdEnum = f.id_enum_value;

select name_param, id_paramtype from parameters p where oIdPar = p.id_param

into oName, vTypePar;

select name_value from enum_value where id_value = vIdEnum into oValEnumName;

oVal = f.value; oRes = 1;

return next; end loop;

end $$ LANGUAGE plpgsql;

/************************************************Демонстрация заказа***********************************************/

CREATE OR REPLACE function show_order_pos(pIdOrder integer)

returns table(oIdProd integer, oNameProd text, oNum int, oQ int, oNameType text, oNameTypeProd text)

as $$

declare f record; declare vIdType int; declare vIdTypeProd int;

begin

/*функция: возвращает список значений параметров конфигурации варианта исполнения

77

вход: pIdProd - ид.изделия,

выход: oIdPar - ид.параметра, oName - имя параметра,

oVal - значение вещественного параметра, oValEnum - код значения перечисления, oValEnumName - имя значения перечисления, oRes - 0 - ошибка, 1 - ОК

*/

for f in select id_prod, num, q from pos_order --Рассматриваем все позиции заказа

where id_order = pIdOrder

loop

oIdProd = f.id_prod; oNum = f.num;

oQ = f.q;

select name_product, id_type_prod, id_variation from product where oIdProd = id_product

into oNameProd, vIdTypeProd, vIdType;

select name_product from product where vIdTypeProd = id_product into oNameTypeProd;

select name_variation from varconf where id_variation = vIdType into oNameType;

return next; end loop;

end $$ LANGUAGE plpgsql;

----------------------------------------------------------------------

Тестирование

----------------------------------------------------------------------

--Заказчик

select add_shd('Здоровый Город');

--Единицы измерения

select add_uom('ч','час'); select add_uom('ед','единица'); select add_uom('м','метр');

78

select add_uom('т','тонна'); select add_uom('мм','милиметр'); select add_uom('кг','килограм'); select add_uom('шт','штука'); select add_uom('л','литр');

--Классы

select add_class('Велосипед',null,7); select add_class('Прогулочный',1,7); select add_class('Спортивный',1,7);

--Типы продуктов

select add_varConf('Изделие без конфигурации');

select add_varConf('Типовое изделие с конфигурацией'); select add_varConf('Вариация конфигурации');

--Типы парметров

select add_typeParam('Численный'); select add_typeParam('Перечисление');

--Перечисления

select add_enum('Цвет'); --Значения перечислений

select add_value ('Белый', 1); select add_value ('Синий', 1); select add_value ('Красный', 1); select add_value ('Зелёный', 1); --Параметры PNAME text,

--PUOM integer,

--PTYPEPAR integer,

--pIdEnum integerPNAME text,

--PUOM integer,

--PTYPEPAR integer,

--pIdEnum integer

select add_parameter('Цвет_Корпуса',null,2,1); select add_parameter('Вес',6,1,null);

select add_parameter('Количество_Передач',7,1,null); select add_parameter('Максимальная_высота_руля',5,1,null);

79

select add_parameter('Максимальная_высота_сидения',5,1,null); select add_parameter('Диаметр_колеса',5,1,null);

select add_parameter('Цвет_звонка',null,2,1);

--Заполним таблицу класс-параметр iIdCl int, iIdParam int, max_value int default null, min_value int default null

select add_class_param (2,1);--Цвет

select add_class_param (2,3,6,1);--Кол-во ппередач select add_class_param (2,2,15,10);--Вес

select add_class_param (2,4,300,60); --Макс высота руля select add_class_param (2,5,500,300);--Макс высота сидения select add_class_param (2,6,600,400); --Диаметр колеса

--Добавим типовой продукт велосипед Орион nameOfNewProduct text,

--idClassOfNewProduct integer,

--idTypeProd integer,

--idVar integer

select * from ins_prod('Орион',2,null,2); --Добавим ему параметр

-- Заполним таблицу typeProd_param: iIdProd int, iIdParam int, max_value int default null, min_value int default null

select add_typeprod_param(23,7,null,null); select add_typeprod_param(23,3,4,1);

--Добавим теперь значения параметровupdate_prod_param (iIdProd int, iIdParam int, val double precision, iIdEnumVal int) RETURNS table(ORES integer)

select update_prod_param(23,1,null,1); --Белый цвет корпуса select update_prod_param(23,2,12,null); --Вес 12 кг

select update_prod_param(23,3,5,null); --5 передач для 4 типовых возможных Err

select update_prod_param(23,3,3,null);--3 передачи

select update_prod_param(23,4,100,null);--100 мм макс высота руля select update_prod_param(23,5,400,null);--100 мм макс высота сидения select update_prod_param(23,6,500,null);--500 мм диаметр колеса select update_prod_param(23,7,null,2);-- синий цвет звонка

--Создадим вариацию типового продукта Орион select new_var_prod(23);

--Зададим значения прамметров для вариации

80