
- •Задание на работу
- •1.1. Функциональные требования
- •1.2. Содержание работы
- •1.3. Исходные данные для задачи
- •Рекомендуемые инструменты
- •1.5. Рекомендуемые источники
- •Аннотация
- •1. Анализ исходных данных
- •2. Разработка функциональных требований к подсистеме
- •3. Разработка проектной модели классов
- •4. Разработка модели хранения
- •5. Разработка физической модели данных и поддерживающих процедур
- •6. Тестирование проекта
- •Список используемых источников Приложение Скрипты метаданных
Список используемых источников Приложение Скрипты метаданных
/***************************************************************/
/*************Расширение модели хранения для задачи ведения заказов
на изделия с вариантами исполнения *********************************/
/*СХД*/
CREATE TABLE SHD (
ID_SHD INTEGER NOT NULL,
NAME VARCHAR(50),
SHORT_NAME VARCHAR(15)
);
ALTER TABLE SHD ADD PRIMARY KEY (ID_SHD);
/***************************************************************/
CREATE GENERATOR SHD_GEN;
create procedure GEN_ID_SHD
returns (
ONEW integer)
as
begin
/*функция: возвращает новый уникальный идентификатор*/
oNew=GEN_ID(SHD_GEN,1); /*вызов генератора*/
suspend;
end
/***************************************************************/
/***************************************************************/
/*Заказы*/
CREATE TABLE ORDER1 (
ID_ORDER INTEGER NOT NULL,
NUM VARCHAR(50),
CUSTOMER INTEGER NOT NULL,
DATE_REG DATE
);
ALTER TABLE ORDER1 ADD PRIMARY KEY (ID_ORDER);
ALTER TABLE ORDER1 ADD FOREIGN KEY (CUSTOMER) REFERENCES SHD (ID_SHD);
/***************************************************************/
CREATE GENERATOR ORDER1_GEN;
/***************************************************************/
create procedure GEN_ID_ORDER1
returns (
ONEW integer)
as
begin
/*функция: возвращает новый уникальный идентификатор*/
oNew=GEN_ID(ORDER1_GEN,1); /*вызов генератора*/
suspend;
end
/**************************************************************/
/***************************************************************/
/*Позиции заказа*/
CREATE TABLE POS_ORDER (
ID_ORDER INTEGER NOT NULL,
NUM_POS INTEGER NOT NULL,
ID_PROD INTEGER NOT NULL,
Q double precision
);
ALTER TABLE POS_ORDER ADD FOREIGN KEY (ID_ORDER) REFERENCES ORDER1 (ID_ORDER);
ALTER TABLE POS_ORDER ADD FOREIGN KEY (ID_PROD) REFERENCES PROD(ID_PROD);
ALTER TABLE POS_ORDER ADD PRIMARY KEY (ID_ORDER, NUM_POS);
/***************************************************************/
/***************************************************************/
create procedure NEW_POS(pIdOrder integer)
returns (oNumPos integer, oRes integer)
as
begin
/*функция: возвращает новый локальный номер позиции заказа
вход: pIdOrder - ид. заказа
выход: oNumPos - номер новой позиции
oRes - 0 - ошибка, 1 - новый номер выдан*/
oRes=0;
oNumPos=0;
select count(*) from ORDER1
where ID_ORDER=:pIdOrder
into :oRes;
if (:oRes>0) then
begin
select count(*) from POS_ORDER
where ID_ORDER=:pIdOrder
into :oNumPos;
if (:oNumPos=0) then
oNumPos=1;
else
begin
select MAX(NUM_POS) from POS_ORDER
where ID_ORDER=:pIdOrder
into :oNumPos;
oNumPos=oNumPos+1;
end
end
suspend;
end
/***************************************************************/
/***************************************************************/
/*Парамеры продукции*/
CREATE TABLE PAR_TYPE_PROD (
ID_PAR INTEGER NOT NULL,
ID_PROD INTEGER NOT NULL
);
ALTER TABLE PAR_TYPE_PROD ADD FOREIGN KEY (ID_PAR) REFERENCES PARAMETR (ID_PAR);
ALTER TABLE PAR_TYPE_PROD ADD FOREIGN KEY (ID_PROD) REFERENCES PROD (ID_PROD);
ALTER TABLE PAR_TYPE_PROD ADD PRIMARY KEY (ID_PROD,ID_PAR);
/***************************************************************/
/***************************************************************/
ALTER TABLE PROD ADD CONF integer not null;
ALTER TABLE PROD ADD TYPE_PROD integer not null;
ALTER TABLE PROD ADD FOREIGN KEY (TYPE_PROD) REFERENCES PROD (ID_PROD);
/*********************************************************/
/************************************************************/
/*************** Поддерживающие процедуры *****************/
/***************************************************************/
/******* Изменения в процедуре создания изделия ************/
create procedure INS_PROD2 (
PIDCLASS integer,
PSHNAME varchar(15),
PNAME varchar(100),
pConf integer,
pTypeProd integer)
returns (
OIDPROD integer,
ORES integer)
as
declare variable VYESCLASS integer;
declare variable VYESTERM integer;
begin
if(:pTypeProd=0) then pTypeProd = null;
oRes=0;
select count(*) from CHEM_CLASS
where ID_CLASS=:pIdClass
into :vYesClass;
if(:vYesClass =1) then
begin
select count(*) from CHEM_CLASS
where MAIN_CLASS=:pIdClass
into :vYesTerm;
if(:vYesTerm=0) then
begin
oRes=1;
select oNew from GEN_ID_PROD
into :oIdProd;
insert into PROD(ID_PROD,SHORT_NAME,NAME,ID_CL,CONF,TYPE_PROD)
values(:oIdProd,:pShName,:pName,:pIdClass,:pConf,:pTypeProd);
select oRes from COPY_PAR_PROD(:oIdProd)
into :oRes;
end
end
suspend;
end
/***************************************************************/
/***************************************************************/
create procedure FIND_PAR_CONF(pIdProd integer)
returns (oIdPar integer, oTypePar integer, oNamePar varchar(100),oRes integer)
as
declare variable vYesType integer;
begin
/*функция: находит список параметров конфигурации типового изделия
вход: pIdProd- ид. типового изделия
выход: oIdPar - ид. параметра,
oTypePar - тип параметра,
oNamePar - имя параметра
oRes - 0 - ошибка, 1 - параметры найдены*/
oRes=0;
select CONF from PROD
where ID_PROD=:pIdProd
into : vYesType;
if(:vYesType= 1) then
begin
for select ID_PAR from PAR_TYPE_PROD
where ID_PROD=:pIdProd
into :oIdPar do
begin
select TYPE_PAR from PARAMETR
where ID_PAR=:oIdPar
into :oTypePar;
select NAME from TYPE_PAR
where ID_TYPE=:oTypePar
into :oNamePar;
oRes=1;
suspend;
end
end
else
suspend;
end
/***************************************************************/
/***************************************************************/
alter procedure COPY_PAR_PROD (
PIDPROD integer)
returns (
ORES integer)
as
declare variable VPAR integer;
declare variable VIDCLASS integer;
declare variable VYES integer;
begin
/*функция: Формирует список для значений параметров экземпляра pIdProd
вход:pIdProd - ид. продукта
выход:oRes - 0 - ошибка 1 - список сформирован
эффекты: */
oRes=1;
select ID_CL from PROD
where ID_PROD=:pIdProd
into :vIdClass;
for select p1.PAR from PAR_CLASS p1
where p1.CLASS=:vIdClass
into :vPar
do
begin
select count(*) from PAR_PROD
where PROD=:pIdProd and PAR=:vPar
into :vYes;
if(:vYes=0) then
insert into PAR_PROD(PROD,PAR)
values ( :pIdProd,:vPar);
else oRes=0;
end
suspend;
end
/**************************************************************/
/***************************************************************/
create procedure COPY_PAR_CONF (
PIDPROD integer, pTypeProd integer)
returns (
ORES integer)
as
declare variable VPAR integer;
declare variable VIDCLASS integer;
declare variable VYES integer;
begin
/*функция: Формирует список для значений параметров конфигурации экземпляра pIdProd
вход:pIdProd - ид. варианта исполнения
pTypeProd - ид. типового продукта
выход:oRes - 0 - ошибка 1 - список сформирован
эффекты: */
oRes=1;
for select p1.ID_PAR from PAR_TYPE_PROD p1
where p1.ID_PROD=:pTypeProd
into :vPar
do
begin
select count(*) from PAR_PROD
where PROD=:pIdProd and PAR=:vPar
into :vYes;
if(:vYes=0) then
insert into PAR_PROD(PROD,PAR)
values ( :pIdProd,:vPar);
else oRes=0;
end
suspend;
end
/***************************************************************/
/***************************************************************/
create procedure NEW_VAR_PROD ( pTypeProd integer)
returns (
OIDPROD integer,oName varchar(250), oShName varchar(50),
ORES integer)
as
declare variable vConf integer;
declare variable vIdCl integer;
declare variable VYESTERM integer;
begin
/*функция:Создает вариант исполнения по прототипу типового изделия с параметрами
вход:pTypeProd
выход:OIDPROD - ид. варианта исполнения,
oName - имя варианта,
oShName - обозначние варианта,
ORES - oRes - 0 - ошибка, 1 - новый вариант создан
*/
oRes=0;
select SHORT_NAME,NAME,CONF, ID_CL from PROD
where ID_PROD=:pTypeProd
into :oShName,:oName,:vConf,:vIdCl;
if(:vConf=1) then
begin
oRes=1;
select oNew from GEN_ID_PROD
into :oIdProd;
insert into PROD(ID_PROD,SHORT_NAME,NAME,ID_CL,CONF,TYPE_PROD)
values(:oIdProd,:oShName,:oName,:vIdCl,2,:pTypeProd);
select oRes from COPY_PAR_PROD(:oIdProd)
into :oRes;
if(:oRes=1) then
select oRes from COPY_PAR_CONF(:oIdProd,:pTypeProd)
into :oRes;
end
suspend;
end
/***************************************************************/
/***************************************************************/
create procedure WRITE_VAL_PAR(pIdProd integer, pIdPar integer, pVal double precision, pValEnum integer)
returns (oRes integer) ???????????????????????????????
as
begin
/*функция: заносит значение параметра конфигурации для варианта исполнения
вход: pIdOrder - ид. заказа
выход: oNumPos - номер новой позиции
oRes - 0 - ошибка, 1 - новый номер выдан*/
oRes=0;
oNumPos=0;
/***************************************************************/
/***************************************************************/
create procedure WRITE_VAL_PAR(pIdProd integer, pIdPar integer, pVal double precision, pValEnum integer)
returns (oRes integer) ???????????????????????????????
as
begin
/*функция: заносит значение параметра конфигурации для варианта исполнения
вход: pIdOrder - ид. заказа
выход: oNumPos - номер новой позиции
oRes - 0 - ошибка, 1 - новый номер выдан*/
oRes=0;
oNumPos=0;
/***************************************************************/
/***************************************************************/
ALTER TABLE PARAMETR ADD ID_ENUM integer;
ALTER TABLE PARAMETR ADD FOREIGN KEY (ID_ENUM) REFERENCES ENUM (ID_ENUM);
/***************************************************************/
/***************************************************************/
ALTER TABLE PARAMETR ADD MIN_VAL double precision;
ALTER TABLE PARAMETR ADD MAX_VAL double precision;
ALTER TABLE PAR_TYPE_PROD ADD MIN_VAL double precision;
ALTER TABLE PAR_TYPE_PROD ADD MAX_VAL double precision;
/***************************************************************/
/***************************************************************/
create procedure WRITE_PAR2 (
PIDPROD integer,
PIDPAR integer,
PVAL double precision)
returns (
ORES integer)
as
declare variable VYESPAR integer;
declare variable vYesParConf integer;
declare variable VIDCLASS integer;
declare variable vConf integer;
declare variable vTypePar integer;
declare variable vValConf integer;
declare variable vIdEnum integer;
declare variable vYesVal integer;
declare variable vYesParClass integer;
declare variable vTypeProd integer;
declare variable vMinVal double precision;
declare variable vMaxVal double precision;
/* функция: Проверяет допустимость значения параметра экземпляра продукта и записывает его значение
вход:pIdProd - ид. продукта
pIdPar - ид. параметра
выход:oRes - 0 - ошибка, 1 - ок
эффекты:*/
begin
select CONF, TYPE_PROD,ID_CL from PROD
where ID_PROD=:pIdProd
into :vConf, :vTypeProd,:vIdClass;
select count(*) from PAR_PROD
where PAR= :pIdPar and PROD=:pIdProd
into :vYesPar;
select count(*) from PAR_TYPE_PROD
where ID_PAR= :pIdPar and ID_PROD=:vTypeProd
into :vYesParConf;
select TYPE_PAR,ID_ENUM from PARAMETR
where ID_PAR=:pIdPar
into : vTypePar,:vIdEnum;
oRes=1;
select count(*) from PAR_CLASS
where CLASS=:vIdClass and PAR=:pIdPar
into :vYesParClass;
if((:vYesPar>0)and(:vTypePar=1)and (:vYesParClass>0)) then
begin
select MIN_VAL,MAX_VAL from PAR_CLASS
where PAR=:pIdPar and CLASS=:vIdClass
into :vMinVal,:vMaxVal;
if((:pVal>= :vMinVal) and (:pVal <= :vMaxVal)or (:pVal is null)) then
begin
oRes=1;
update PAR_PROD
set VAL=:pVal
where PROD=:pIdProd and PAR=:pIdPar;
end
end
else oRes=0;
if((:vYesParConf>0)and(:vTypePar=1)) then
begin
select MIN_VAL,MAX_VAL from PAR_TYPE_PROD
where ID_PAR=:pIdPar and ID_PROD=:vTypeProd
into :vMinVal,:vMaxVal;
if((:pVal>= :vMinVal) and (:pVal <= :vMaxVal)) then
begin
oRes=1;
update PAR_PROD
set VAL=:pVal
where PROD=:pIdProd and PAR=:pIdPar;
end
else oRes=0;
end
else
if((:vYesParConf>0)and(:vTypePar=2)) then
begin
vValConf=pVal;
select count(*) from ENUM_VAL
where (ID_ENUM=:vIdEnum)and (ID_VAL=:vValConf)
into :vYesVal;
if(:vYesVal>0) then
begin
oRes=1;
update PAR_PROD
set ENUM_VAL=:vValConf
where PROD=:pIdProd and PAR=:pIdPar;
end
end
else oRes=0;
suspend;
end
/***************************************************************/
create procedure ADD_PROD_ORDER(pIdOrder integer, pIdProd integer,
pQ double precision)
returns (oNumPos integer, oRes integer)
as
begin
/*функция: возвращает новый локальный номер позиции заказа
вход: pIdOrder - ид. заказа
выход: oNumPos - номер новой позиции
oRes - 0 - ошибка, 1 - новый номер выдан*/
oRes=0;
oNumPos=0;
select oNumPos,oRes from NEW_POS(:pIdOrder)
into :oNumPos, :oRes;
if(:oRes=1) then
insert into POS_ORDER(ID_ORDER,NUM_POS,ID_PROD,Q)
values(:pIdOrder,:oNumPos,:pIdProd,:pQ);
suspend;
end
/***************************************************************/
/***************************************************************/
create procedure READ_VAR_CONF(pIdProd integer)
returns (oIdPar integer, oName varchar(100), oVal double precision, oValEnumName varchar(150),
oRes integer)
as
declare variable vTypePar integer;
declare variable vTypeProd integer;
declare variable vIdEnum integer;
declare variable vVal integer;
declare variable vIdVal integer;
begin
/*функция: возвращает список значений параметров конфигурации варианта исполнения
вход: pIdProd - ид.изделия,
выход: oIdPar - ид.параметра,
oName - имя параметра,
oVal - значение вещественного параметра,
oValEnum - код значения перечисления,
oValEnumName - имя значения перечисления,
oRes - 0 - ошибка, 1 - ОК
*/
oRes=0;
select TYPE_PROD from PROD
where ID_PROD=:pIdProd
into :vTypeProd;
for select ID_PAR from PAR_TYPE_PROD
where ID_PROD=:vTypeProd
into :oIdPar do
begin
select NAME,TYPE_PAR,ID_ENUM from PARAMETR
where ID_PAR=:oIdPar
into :oName,:vTypePar, :vIdEnum;
select VAL,ENUM_VAL from PAR_PROD
where (PROD =:pIdProd)and(PAR=:oIdPar)
into :oVal,vIdVal;
if(:vTypePar=2) then
select NAME from ENUM_VAL
where ID_VAL=:vIdVal
into :oValEnumName;
suspend;
end
end
/***************************************************************/
/***************************************************************/
/************Подготовка данных для примера*********************/
/***************************************************************/
/***********Добавление единицы измерения***********************/
select * from INS_EI('796','шт','Штука');
/*ид. = 9*/
/****************Расширение классификатора**********************/
select * from INS_CLASS (1, '','Воздуховоды и фасонные части',9); /* 14 */
/***************************************************************/
/********* Добавление типовых изделий **************/
select * from INS_PROD2(14,'ВПСПУ','Воздуховод прямоугольного сечения, прямой участок',1,0);
/*id = 15*/
select * from INS_PROD2(14,'ВПСПУ','Воздуховод и фасонные части с одним круглым сечением',1,0>);
/*id = 19*/
/***************************************************************/
/************* Создание перечислений *********************/
Перечисления уже созданы
1 Тип прямоугольного соединения
1 А
2 В
3 С
4 D
/************* Изменение процедуры создания параметра *********/
create or alter procedure INS_PARAMETR (
PSHNAME varchar(15),
PNAME varchar(100),
PIDEI integer,
PTYPEPAR integer,
pIdEnum integer)
returns (
OIDPAR integer,
ORES integer)
as
declare variable VYES integer;
declare variable vIdEnum integer;
declare variable vIdEI integer;
begin
/*функция: Создание нового параметра
вход: PSHNAME - обозначение параметра,
PNAME - имя параметра,
PIDEI - единица измерения парметра,
PTYPEPAR - тип параметра (1 - численный, 2 - перечисление, 3 - агрегат),
pIdEnum - ид. перечисления
эффекты:
требования:
1.для типов 1,3 pIdEnum=0,
2. Для типов 2,3 pIdEI=0*/
oRes=1;
select count(*) from PARAMETR
where SHORT_NAME=:pShName or NAME=:pName
into :vYes;
if (:vYes=0) then
begin
if((:pTypePar=1)or(:pTypePar=3)) then vIdEnum=null;
else vIdEnum=pIdEnum;
if((:pTypePar=2)or(:pTypePar=3)) then vIdEI=null;
else vIdEI=pIdEI;
select oNew from GEN_ID_PAR
into :oIdPar;
insert into PARAMETR(ID_PAR,SHORT_NAME,NAME,EI_PAR,TYPE_PAR,ID_ENUM)
values(:oIdPar,:pShName,:pName,:vIdEI,:pTypePar,:vIdEnum);
end
else
oRes=0;
suspend;
end
/***************************************************************/
/***************** Создание параметров *************/
select * from INS_PARAMETR('A мм','Ширина ',1,1,0);/* 15 */
select * from INS_PARAMETR('B мм','Высота ',1,1,0); /* 16 */
select * from INS_PARAMETR('L мм','Длина ',1,1,0); /* 17 */
select * from INS_PARAMETR('Тип ПС','Тип прямоугольного соединения',0,2,1); /* 18 */
/***************************************************************/
/********** Добавление параметров для типового изделия **/
insert into PAR_TYPE_PROD(ID_PROD,ID_PAR,MIN_VAL,MAX_VAL)
values(15,15,50,1000);
insert into PAR_TYPE_PROD(ID_PROD,ID_PAR,MIN_VAL,MAX_VAL)
values(15,16,50,1000);
insert into PAR_TYPE_PROD(ID_PROD,ID_PAR,MIN_VAL,MAX_VAL)
values(15,17,500,2000);
insert into PAR_TYPE_PROD(ID_PROD,ID_PAR,MIN_VAL,MAX_VAL)
values(15,18,0,0);
/***************************************************************/
/****** Тестирование создания варианта исполнения *********/
/***************************************************************/
select * from NEW_VAR_PROD ( 15) /*27*/
/***************************************************************/
/********* Занесение значений параметров ***************/
select * from WRITE_PAR2 (27,15,200); /*OK*/
select * from WRITE_PAR2 (27,16,250); /*OK*/
select * from WRITE_PAR2 (27,16,10); /*ER*/
select * from WRITE_PAR2 (27,17,1000); /*OK*/
select * from WRITE_PAR2 (27,18,1); /*OK*/
select * from WRITE_PAR2 (27,18,5); /*ER*/
/***************************************************************/
/************** Создание Заказа **********************/
create procedure INS_SHD (
pName varchar(100) ,
pShName varchar(15))
returns (oIdSHD integer)
as
begin
select oNew from GEN_ID_SHD
into :oIdSHD;
insert into SHD(ID_SHD,NAME,SHORT_NAME)
values(:oIdSHD,:pName,:pShName);
suspend;
end
/***************************************************************/
select * from INS_SHD ( 'Ремонтный завод','РМЗ' ) /*1*/
/***************************************************************/
/************ Создание Заказа **********************/
create or alter procedure INS_ORDER (
PIdCastomer integer,
PDateReg date,
PNUM varchar(50))
returns (oIdOrder integer)
as
begin
select oNew from GEN_ID_ORDER1
into :oIdOrder;
insert into ORDER1(ID_ORDER,NUM,DATE_REG,CUSTOMER)
values(:oIdProd,:pNum,:pDateReg,:pIdCustomer);
suspend;
end
/***************************************************************/
select * from INS_ORDER ( 1,'8.9.2015','РМЗ-0001' ) /*1*/
/***************************************************************/
/********* Создание новой позиции заказа ***********/
select * from ADD_PROD_ORDER(1, 27, 10) /*oNumPos=1,oRes =1*/
/***************************************************************/
/******* Найти параметры варианта исполнения ************/
select * from READ_VAR_CONF(27)
/***************************************************************/
/********** Найти состав заказа ****************/
select * from POS_ORDER
where ID_ORDER=1
/*************************************************************/