МиСПрИС_Задание2_3_Петрова_Романова_Заболотников_9373
.pdfinto 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