
- •Домашнее задание
- •1.2. Содержание работы
- •1.3. Исходные данные для задачи
- •1.4. Рекомендуемые инструменты
- •1.5. Рекомендуемые источники
- •Аннотация
- •1. Разработка функциональных требований к подсистеме
- •2. Разработка модели классов
- •3. Разработка модели хранения
- •4. Разработка поддерживающих процедур
- •5.Тестирование
4. Разработка поддерживающих процедур
/**** SQL-процедуры ****/
/***************************************************************************/
create or alter procedure COPY_PAR(pIdMain integer, pIdClass integer)
returns(oRes integer)
as
DECLARE VARIABLE vYesMain INTEGER;
DECLARE VARIABLE vPar INTEGER;
DECLARE VARIABLE vYesPar INTEGER;
begin
/*функция: Копирует параметры одного родительского класса классу - потомку
вход:pIdMain - ид. родительского класса
pIdClass -ид потомка
выход: oRes - 0 - ошибка, 1 - ОК
эффекты:
*/
select oYes from IN_GR(:pIdMain, :pIdClass)
into :vYesMain;
oRes=0;
if(:vYesMain>0) then
begin
oRes =1;
for select p1.PAR from PAR_CLASS1 p1
where p1.CLASS=:pIdMain
into :vPar
do
begin
select count(*) from PAR_CLASS1 p2
where p2.PAR=:vPar
into :vYesPar;
if(:vYesPar=0) then
insert into PAR_CLASS1 (CLASS, PAR)
values(:pIdClass,:vPar);
end
end
suspend;
end
/***************************************************************************/
/***************************************************************************/
create or alter procedure INS_PROD(pIdClass integer,pShName varchar(15),pName varchar(100))
returns(oIdProd integer,oRes integer)
as
DECLARE VARIABLE vYesClass INTEGER;
DECLARE VARIABLE vYesTerm INTEGER;
begin
/*функция: Создает новый экземпляр продукции
вход:pIdClass - ид. продукта
pShName - обозначение продукта
pName - имя продукта
выход: oIdProd - ид. нового продукта
oRes - 0 - ошибка 1 - список сформирован
эффекты: */
oRes=0;
select count(*) from CHEM_CLASS
where ID_CLASS=:pIdClass
into :vYesClass;
if(:vYesClass >0) 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)
values(:oIdProd,:pShName,:pName,:pIdClass,0);
select oRes from COPY_PAR_PROD(:oIdProd)
into :oRes;
end
end
suspend;
end
/***************************************************************************/
/***************************************************************************/
create or 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=0;
vYes=1;
vPar=0;
select ID_CL from PROD
where ID_PROD=:pIdProd
into :vIdClass;
for select p1.PAR from PAR_CLASS1 p1
where p1.CLASS=:vIdClass
into :vPar
do
begin
select count(*) from PAR_PROD1
where PROD=:pIdProd and PAR=:vPar
into :vYes;
if(:vYes=0) then
begin
insert into PAR_PROD1(PROD,PAR)
values ( :pIdProd,:vPar);
oRes=1;
end
else
oRes=0;
suspend;
end
end
/***************************************************************************/
/**************************************************************************/
create or alter procedure INS_PARAMETR(pShName varchar(15),pName varchar(100),pIdEI integer, pTypePar integer)
returns(oIdPar integer,oRes integer)
as
DECLARE VARIABLE vYes INTEGER;
DECLARE VARIABLE vNoTerm INTEGER;
DECLARE VARIABLE vYesNEn INTEGER;
DECLARE VARIABLE vYesEI INTEGER;
DECLARE VARIABLE vNN INTEGER;
DECLARE VARIABLE vInt INTEGER;
DECLARE VARIABLE vReal INTEGER;
begin
/*функция: Создает новый параметр и записывает его в каталог
вход:pShName - обозначение параметра
pName - имя параметра
pIdEI - ид. единицы измерения
pTypePar -ид. типа параметра
выход: oIdPar - ид. нового параметра
oRes - 0 - ошибка, 1 - ок
эффекты:
*/
oRes= 0;
vYes=0;
vNN=107; /*численное перечисление*/
vReal=112; /*real*/
vInt=111; /* int*/
vNoTerm = 0;
vYesEI = 0;
select count(*) from EI
where ID_EI= :pIdEI
into :vYesEI;
select oYes from IN_GR(:vNN,:pTypePar)
into :vYesNEn; /* параметр-перечисление*/
select count(*) from PARAMETR1
where SHORT_NAME=:pShName or NAME=:pName
into :vYes; /* есть дубль имени*/
select count(*) from CHEM_CLASS
where MAIN_CLASS= :pTypePar
into :vNoTerm; /* класс терминальный*/
if ((:vYes=0) and (:vNoTerm=0)) then /*класс терминальный и нет повтора*/
begin
if (((:pTypePar = :vReal)or(:pTypePar = :vInt)or (:vYesNEn >0))and (:vYesEI >0))then
oRes=1; /*параметр численного типа или численного перечисления*/
if ((:oRes=0) and(:vYesNEn = 0)and (:pTypePar <> :vReal) and (:pTypePar <> :vInt)) then
oRes=1; /*параметр нечисленного типа или нечисленого перечисления*/
if (:oRes=1) then
begin
select oNew from GEN_ID_PAR
into :oIdPar;
insert into PARAMETR1(ID_PAR,SHORT_NAME,NAME,EI_PAR,TYPE_P)
values(:oIdPar,:pShName,:pName,:pIdEI,:pTypePar);
end
end
suspend;
end
/***********************************************************************/
/*****************************************************************/
create or alter procedure ADD_PARAMETR_CLASS(pIdPar integer,pIdClass integer,pMinVal double precision, pMaxVal double precision)
returns(oNum integer,oRes integer,oIdClass integer)
as
DECLARE VARIABLE vYes INTEGER;
DECLARE VARIABLE vIdClass INTEGER;
begin
/*функция: Добавляет новый параметр pIdPar для класса pIdClass
вход:pIdPar - ид. параметра
pIdClass - ид.класса
pMinVal - доп. мин. значение
pMaxVal - доп. макс. значение
выход: oNum - порядковый номер параметра в списке класса
oRes - 0- операция не выполнена, 1 - операция выполнена успешно
эффекты: 1. параметр добавляется классу и всем его потомкам
*/
oRes=0;
for select oIdGr from FIND_GR_GR (:pIdClass)
into :vIdClass
do
begin
select count(*) from PAR_CLASS1
where PAR=:pIdPar and CLASS=:vIdClass
into :vYes;
if (:vYes=0) then
begin
select MAX(NUM )from PAR_CLASS1
where CLASS=:vIdClass
into :oNum;
if(:oNum is null) then oNum=0;
oNum=oNum+1;
oRes=1;
insert into PAR_CLASS1(PAR,CLASS,NUM,MAX_VAL,MIN_VAL)
values(:pIdPar,:vIdClass,:oNum,:pMaxVal,:pMinVal);
oIdClass=vIdClass;
end
else
begin
update PAR_CLASS1
set MAX_VAL=:pMaxVal,
MIN_VAL=:pMinVal
where CLASS =:vIdClass and PAR=:pIdPar;
oRes=1;
end
suspend;
end
end
/**************************************************************************/
/************************************************************************/
create or alter procedure FIND_PAR_CLASS(pIdClass integer)
returns(oIdPar integer, oShName varchar(15),oName varchar(100),oMinVal double precision,
oMaxVal double precision, oIdEi integer, oShNameEI varchar(15))
as
begin
/* функция: Находит вектор значений параметров экземпляра продукта
вход:pId
выход:
эффекты:
*/
for select PAR,MIN_VAL,MAX_VAL from PAR_CLASS1
where CLASS=:pIdClass
into :oIdPar,oMinVal,:oMaxVal
do
begin
select SHORT_NAME,NAME,EI_PAR from PARAMETR1
where ID_PAR=:oIdPar
into :oShName,:oName,:oIdEI;
select SHORT_NAME from EI
where ID_EI=:oIdEI
into :oShNameEI;
suspend;
end
end
/***********************************************************************/
/************************Проверка допустимости значения параметра *****/
create or alter procedure WRITE_PAR(pIdProd integer,pIdPar integer,pVal double precision, pStr varchar(50)
returns(oRes integer)
as
DECLARE VARIABLE vYesPar INTEGER;
DECLARE VARIABLE vIdClass INTEGER;
DECLARE VARIABLE vMinVal double precision;
DECLARE VARIABLE vMaxVal double precision;
begin
/* функция: Проверяет допустимость значения параметра экземпляра продукта и записывает его значение
вход:pIdProd - ид. продукта
pIdPar - ид. параметра
выход:oRes - 0 - ошибка, 1 - ок
эффекты:
*/
select count(*) from PAR_PROD1
where PAR= :pIdPar and PROD=:pIdProd
into :vYesPar;
oRes=1;
if(:vYesPar>0) then
begin
select ID_CL from PROD
where ID_PROD=:pIdProd
into :vIdClass;
select MIN_VAL,MAX_VAL from PAR_CLASS1
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
else
oRes=0;
end
suspend;
end
/*****************************************************************/
/**********************************************************************/
create or alter procedure WRITE_PAR_PROD(pIdProd integer,pIdPar integer,pVal double precision, pValStr varchar(150), pEnumVal integer)
returns(oRes integer)
as
DECLARE VARIABLE vYesPar INTEGER;
DECLARE VARIABLE vIdClass INTEGER;
DECLARE VARIABLE vYesR INTEGER;
DECLARE VARIABLE vYesEn INTEGER;
DECLARE VARIABLE vYesStr INTEGER;
DECLARE VARIABLE vInt INTEGER;
DECLARE VARIABLE vReal INTEGER;
DECLARE VARIABLE vStr INTEGER;
DECLARE VARIABLE vEn INTEGER;
DECLARE VARIABLE vEI INTEGER;
DECLARE VARIABLE vTypePar INTEGER;
DECLARE VARIABLE vMinVal double precision;
DECLARE VARIABLE vMaxVal double precision;
begin
/* функция: Находит тип параметра, проверяет допустимость численного значения параметра экземпляра продукта и записывает его значение, проверяет наличие перечисления и его значения
вход:pIdProd - ид. продукта
pIdPar - ид. параметра
выход:oRes - 0 - ошибка, 1 - ок
эффекты:
*/
oRes = 0;
vInt=111;
vReal=112;
vStr=110;
vEn=106;
vEI=0;
select ID_CL from PROD
where ID_PROD=:pIdProd
into :vIdClass;
select count(*) from PAR_PROD1
where PAR= :pIdPar and PROD=:pIdProd
into :vYesPar;
if(:vYesPar>0) then /*есть параметр*/
begin
select EI_PAR, TYPE_P from PARAMETR1
where ID_PAR= :pIdPar
into :vEI,:vTypePar;
select oYes from IN_GR(:vReal,:vTypePar)
into :vYesR; /*вещественный параметр*/
select count(*) from POS_ENUM
where ID_POS = :pEnumVal and ID_ENUM = :vTypePar
into :vYesEn; /* параметр перечисления*/
select oYes from IN_GR(:vStr,:vTypePar)
into :vYesStr; /* параметр строкового типа*/
if (:vYesR >0) then
begin
select MIN_VAL,MAX_VAL from PAR_CLASS1
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_PROD1
set VAL_R =:pVal
where PROD=:pIdProd and PAR=:pIdPar;
end
end
else
if ((:vYesStr>0) or (:vYesEn>0)) then /* параметр перечисление или строка*/
begin
oRes=1;
update PAR_PROD1
set ENUM_VAL=:pEnumVal,
VAL_STR = :pValStr
where PROD=:pIdProd and PAR=:pIdPar;
end
end
else
oRes=0;
suspend;
end
/**********************************************************************/
/***********************************************************************/
create or alter procedure FIND_PAR_PROD(pIdProd integer)
returns(oIdPar integer, oShName varchar(15),oName varchar(100),oValR double precision, oValInt integer, oShNameEI varchar(15), oValStr varchar(50),oEnumVal integer,oNameValEn varchar(20),oBlob blob)
as
DECLARE VARIABLE vIdClass INTEGER;
DECLARE VARIABLE vTypePar INTEGER;
DECLARE VARIABLE vYesPic INTEGER;
DECLARE VARIABLE vEnPic INTEGER;
begin
/* функция: Находит вектор значений параметров экземпляра продукта
вход:pIdProd - ид. изделия
выход: oIdPar - ид. параметра
oShName - обозначение параметра
oName - имя параметра
oValR - значения вещ параметра
oValStr – значение строкового параметра
oNamePic- имя изобраения
oBlob – изобраение поз.
эффекты:
*/
vEnPic = 105;
select ID_CL from PROD
where ID_PROD=:pIdProd
into :vIdClass;
for select oIdPar,oShName,oName,oShNameEI from FIND_PAR_CLASS(:vIdClass)
into :oIdPar,:oShName,:oName,:oShNameEI
do
begin
select VAL_R,VAL_STR,VAL_INT,ENUM_VAL from PAR_PROD1
where PROD=:pIdProd
and PAR=:oIdPar
into :oValR,:oValStr,:oValInt,:oEnumVal;
select TYPE_P from PARAMETR1
where ID_PAR = :oIdPar
into :vTypePar;
oNamePic= null;
oBlob = null;
oNameValEn = 0;
select oYes from IN_GR(:vEnPic,:vTypePar)
into :vYesPic;
if ( :oEnumVal is not null)then
select PIC, NAME from POS_ENUM
where ID_POS=:oEnumVal
into :oBlob, :oNameValEn;
if (:vYesPic = 0) then oBlob= null;
suspend;
end
end
/***************************************************************************/