Скачиваний:
3
Добавлен:
29.03.2025
Размер:
264.38 Кб
Скачать

Список используемых источников Приложение Скрипты метаданных

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

/*************Расширение модели хранения для задачи ведения заказов

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

/*СХД*/

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

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

27

Соседние файлы в папке 3