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

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

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

ON UPDATE NO ACTION

ON DELETE CASCADE

)

--------------------------------------------------НОВЫЕ ТАБЛИЦЫ-------

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

CREATE TABLE SHD ( --Таблица Субъекта Хозяйственной Деятельности

ID_SHD

serial NOT NULL PRIMARY KEY, -- идентификатор СХД

SHORT_NAME

text, -- Короткое наименование СХД

SHD_NAME

text, --Наименование СХД

CL_SHD

INTEGER NOT NULL, --Ссылка на класс СХД

MAIN_SHD

INTEGER, --Ссылка на Родительский СХД

CONSTRAINT CL_SHD FOREIGN KEY (CL_SHD)

REFERENCES classificator (id_class) MATCH SIMPLE

ON UPDATE NO ACTION

ON DELETE CASCADE

);

ALTER TABLE SHD ADD CONSTRAINT MAIN_SHD FOREIGN KEY (MAIN_SHD) REFERENCES SHD (id_SHD) MATCH SIMPLE

ON UPDATE NO ACTION

ON DELETE cascade;

CREATE TABLE GRC (--Таблица Группового Рабочего Центра

ID_GRC

serial

NOT NULL PRIMARY KEY, --Идентификатор ГРЦ

SHORT_NAME

text,

--Короткое имя ГРЦ

GRC_NAME

text, --Наименование ГРЦ

ID_CL

INTEGER NOT NULL,

--Ссылка на класс ГРЦ

PLACE

INTEGER NOT NULL,

--Ссылка на СХД

CONSTRAINT ID_CL FOREIGN KEY (id_cl)

REFERENCES classificator (id_class) MATCH SIMPLE

ON UPDATE NO ACTION

ON DELETE CASCADE

);

ALTER TABLE GRC ADD CONSTRAINT place FOREIGN KEY (place) REFERENCES SHD (id_SHD) MATCH SIMPLE

21

ON UPDATE NO ACTION

ON DELETE cascade;

CREATE TABLE enumeration --Таблица Перечислений

(

id_enum serial NOT NULL, -- ID перечисления name_enum text NOT NULL, --Имя перечисления

PRIMARY KEY (id_enum)

)

CREATE TABLE enum_value ( --Таблица значений Перечислений

id_value

serial NOT NULL PRIMARY KEY, --ИД значения

id_enum

INTEGER NOT NULL, --Ссылка на пречисление

num integer not null, --Значение перечисления

short_name text, --Короткое наименование значения Перечисления name_ev text, --Наименование значения перечисления

CONSTRAINT id_enum FOREIGN KEY (id_enum)

REFERENCES enumeration (id_enum) MATCH SIMPLE

ON UPDATE NO ACTION

ON DELETE CASCADE

);

create unique index union_num_iden on enum_value(num, id_enum); --

Создадим индекс для уникальности пар (num, id_enum)

CREATE TABLE TM ( --Таблица технологического маршрута

ID_TO serial NOT NULL PRIMARY KEY, --идентификатор ТМ

FOR_PROD integer NOT NULL, --Ссылка на продукт для которого ТМ

NUM integer NOT NULL, --Номер ТМ для этого продукта

CL_TO integer NOT NULL, --Ссылка на класс Технической Операции

CL_PROF integer NOT NULL, --Ссылка на класс Профессионала

Qual integer NOT NULL,--Ссылка на необходимую квалификацию

GRC integer NOT NULL, --Ссылка на задействованный ГРЦ

T_PZ double precision NOT NULL, --Время на подготовку

T_ST double precision NOT null, --Время на ТО для штуки

CONSTRAINT CL_TO FOREIGN KEY (CL_TO)

REFERENCES classificator (id_class) MATCH SIMPLE

22

ON UPDATE NO ACTION

ON DELETE CASCADE

);

ALTER TABLE TM ADD CONSTRAINT CL_PROF FOREIGN KEY (CL_PROF) REFERENCES classificator (id_class) MATCH SIMPLE ON UPDATE NO ACTION

ON DELETE CASCADE;

ALTER TABLE TM ADD CONSTRAINT Qual FOREIGN KEY (Qual) REFERENCES ENUM_VAL (id_value) MATCH SIMPLE ON UPDATE NO ACTION

ON DELETE CASCADE;

ALTER TABLE TM ADD CONSTRAINT GRC FOREIGN KEY (GRC)

REFERENCES GRC (id_grc) MATCH SIMPLE

ON UPDATE NO ACTION

ON DELETE CASCADE;

ALTER TABLE TM ADD CONSTRAINT FOR_PROD FOREIGN KEY (FOR_PROD) REFERENCES product (id_product) MATCH SIMPLE

ON UPDATE NO ACTION

ON DELETE CASCADE;

CREATE TABLE IN_RES ( --Таблица входного ресурса

ID_pair

serial NOT NULL PRIMARY KEY, --Идентификатор Пары

OUT_TO

INTEGER NOT NULL,

--Выходной ресурс

IN_TO integer NOT NULL, --Входной ресурс

Q double precision NOT NULL,

--Количество входного ресурса

FOR_Q double precision NOT NULL); --Количество Выходного

ALTER TABLE IN_RES ADD CONSTRAINT OUT_TO FOREIGN KEY (OUT_TO) REFERENCES TM (ID_TO) MATCH SIMPLE

ON UPDATE NO ACTION

ON DELETE CASCADE;

ALTER TABLE IN_RES ADD CONSTRAINT IN_TO FOREIGN KEY (IN_TO) REFERENCES TM (ID_TO) MATCH SIMPLE

ON UPDATE NO ACTION

23

ON DELETE CASCADE;

-----------------------------------------ФУНКЦИИ----------------------

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

-----------------------------НАЙТИ ТЕХНОЛОГИЙСКИЙ МАРШРУТ-------------

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

/*функция: возвращает ТМ со списком входных ресурсов каждой операции позиции

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

выход: oNum – порядковый номер ТО,

IdTO – ид. ТО,

IdClTO integer,

ShNameTO – обозн. класса ТО,

NameTO – имя класса ТО,

IdGRC – ид. ГРЦ,

ShNameGRC – обозн. ГРЦ,

NameGRC – имя ГРЦ,

IdPlace – ид. места,

ShNamePlace – обозн. места,

NamePlace – имя места ,

IdProf – ид. профессии,

ShNameProf – обозн. проф.,

NameProf – имя проф.,

IdKval – ид. квалификации,

ShNameKval – обозн. квал.,

TPZ - Тпз,

TSt - Тшт,

IdInRes – ид. вх. ресурса,

ShNameInRes – обозн. вх. ресурса,

NameInRes – имя вх. ресурса,

IdClInRes – ид. класса вх. ресурса,

ShNameClInRes – обозн. класса вх. ресурса,

NameClInRes – имя класса вх ресурса,

Q – расход ресурса,

ForQ – для количества,

эффекты: 1) при отсутствии входных ресурсов все выходные равны

NULL,

2) при отсутствии изделия все выходные равны NULL,

24

требования: изделие с ид. pIdEl должно быть в PRODUCT*/

create or replace function FIND_TM ( PIDEL integer)

returns table( IdTO integer, NUM integer, IDClTO integer, NAMETO text, IDGRC integer, SHNAMEGRC text, NAMEGRC text,

IDPLACE integer,

SHNAMEPLACE text,

NAMEPLACE text,

IDPROF integer,

NAMEPROF text,

IDKVAL integer,

SHNAMEKVAL text,

TPZ double precision,

TST double precision,

IDINRES integer,

NAMEINRES text,

IDCLINRES integer,

NAMECLINRES text,

Q double precision,

FORQ double precision

)

as $$

declare VYESTM int; declare VIDINTO int; declare RES INT; declare f record; declare f2 record; begin

select count(*) from TM

where FOR_PROD = PIDEL

25

into Res;

if (Res > 0) then

/*Для каждой операции ТМ найти по ид. имена и обозначения*/

for f in select P1.ID_TO, P1.NUM, P1.CL_TO, P1.CL_PROF, P1.qual, P1.GRC, P1.T_PZ, P1.T_ST

from TM P1

where P1.FOR_PROD = PIDEL order by P1.NUM

loop

IDTO := F.id_TO;

NUM := F.NUM;

IDCLTO := F.CL_TO;

IDPROF := F.CL_PROF;

IDKVAL := F.QUAL;

IDGRC := F.GRC;

TPZ := f.T_PZ; TST := F.T_ST; select name_class

from classificator where ID_CLASS = F.CL_TO into NAMETO;

select name_class from classificator

where ID_CLASS = F.CL_PROF into NAMEPROF;

select SHORT_NAME from ENUM_VALUE

where ID_VALUE = F.QUAL into SHNAMEKVAL;

select SHORT_NAME, GRC_NAME, PLACE from GRC

where ID_GRC = F.GRC

into SHNAMEGRC, NAMEGRC, IDPLACE;

select SHORT_NAME, SHD_NAME

26

from SHD

where ID_SHD = IDPLACE

into SHNAMEPLACE, NAMEPLACE;

for f2 in select IN_TO, R.Q, R.FOR_Q from IN_RES as R

where OUT_TO = IDTO loop

VIDINTO := F2.IN_TO;

Q := F2.Q;

FORQ := F2.FOR_Q; select P2.FOR_PROD

from TM P2

where P2.ID_TO = VIDINTO into IDINRES;

select name_product, id_class from PRODUCT

where id_product = IDINRES into NAMEINRES, IDCLINRES;

select name_class from classificator

where ID_CLASS = IDCLINRES into NAMECLINRES;

return next; end loop;

end loop;

else

RES = 0; return next;

end if;

end $$ LANGUAGE plpgsql;

--------------------------------------НОРМЫ МАТЕРИАЛЬНЫХ РЕСУРСОВ-----

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

/* Функция: НОРМЫ МАТЕРИАЛЬНЫХ РЕСУРСОВ ДЛЯ ИД ИЗДЕЛИЯ Вход: pIdTO - ид. е операции,

27

pQ - для количества,

Выход: oInEl - ид. входного изделия, oQ - требуемое количество,

oRes - наличие ошибки 0, отсутствие ошибки > 0

Эффекты: 1) При отсутствии изделия с ид. pIdEl вых. параметры равны

0, oRes=0;

Требования: Наличие в PROD изделия с ид. pIdEl */

create or replace function MR_Q ( PIDTO integer, PQ double precision)

returns TABLE( OINEL integer, OQ double precision, oRes integer) as $$

declare VINEL integer; declare vIdEl integer; declare vYesTM integer; declare vYesRes integer; declare VQ double precision; declare VVQ double precision;

declare vForQ double precision; declare VVINEL integer; declare vInTO integer;

declare vIdTO integer;

declare f record; begin

/*Находим ид. изделия для pIdTO */ select FOR_PROD from TM

where ID_TO= pIdTO into vIdEl;

if(vIdEl > 0) then vYesTM=1;

end if;

select count(*) from IN_RES where OUT_TO = pIdTO into vYesRes;

if (vYesTM > 0) then oRes:=1;

if( vYesRes > 0) then

28

/*Для каждого входного ресурса pIdTO*/

for F IN select IN_TO,Q,FOR_Q from IN_RES where OUT_TO=pIdTO

loop

VINTO := F.IN_TO;

VQ := F.Q;

VFORQ := F.FOR_Q;

vInEl:=0;

vvQ:=0;

select p2.FOR_PROD from TM p2 where p2.ID_TO = vInTO into vInEl;

if (vInEl>0) then vvQ:=vQ*pQ/vForQ; oQ:=vvQ; oInEl:=vInEl; return next;

end if; end loop;

else oInEl:=0;

oQ:=0; return next;

end if; else

oInEl := 0; oQ := 0; return next;

end if; end

$$ LANGUAGE plpgsql;

----------------------------------СВОДНЫЕ НОРЫ МАТЕРИАЛЬНЫХ РЕСУРСОВ--

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

/*функция: СВОДНЫЕ НОРМЫ МАТ. РЕСУРСОВ ДЛЯ ИД ИЗДЕЛИЯ вход: pIdEl - ид. исходного изделия,

выход: oInEl - ид. входного ресурса

29

oQ - расход

oRes - 0 - ошибка, > 0- без ошибки

эффекты: 1) если изделия с ид. pIdEl нет, то oInEl=0, oQ=0, oRes=0;

2) если изделия с ид. pIdEl не имеет вх. ресурсов, то oInEl=0, oQ=0, oRes=1;

требования:1)изделие с ид. pIdEl должно существовать в TM */

create or replace function SUM_MR(pIdEl integer, pQ double precision) returns table (oInEl integer, oQ double precision, oRes integer)

as $$

declare vIdTO integer; declare vRes integer;

declare f record; declare F2 RECORD; declare F3 RECORD; begin

select count(*) from PRODUCT where id_product = pIdEl into oRes;

if(oRes>0) then

for F in select ID_TO from TM where FOR_PROD = pIdEl order by NUM desc

loop

VIDTO = F.ID_TO;

for F2 IN select FUNC.oInEl as A,SUM(FUNC.oQ) as SUMQ, FUNC.oRes as ORE from MR_Q(vIdTO,pQ) as FUNC

group by A,FUNC.oRes

loop oInEl:=F2.A; oQ := F2.SUMQ;

vRes := F2.ORE;

if(oInEl <> pIdEl and oInEl > 0) then return next;

for F3 in select FOO.oInEl as A, SUM(FOO.oQ) as SUMQ, FOO.oRes as ORE from SUM_MR(oInEl, oQ) as FOO

30