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

7. Тестирование процедур работы со спецификацией изделия

/******* Проверяем значения параметров конфигурации ************/

select * from PAR_PROD

where PROD=56

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

Рис. 5. Результат проверки значений параметров конфигурации для примера

Проверка процедуры вывода спецификации варианта исполнения изделия.

Для данных значений параметров конфигурации в спецификации должны отсутствовать:

КП25.00.00.470-01 ПРОУШИНА (ид.=45)

КП25.00.00.454 РАСПОРКА (ид.=35).

Материал стенок должен быть следующий:

КП25.00.00.456-01 СТЕНКА (36) ЛИСТ 10-Б-ПН-ОСТ 3СП 0.003

КП25.00.00.455 СТЕНКА БЧ (34) ЛИСТ 10-Б-ПН-ОСТ 3СП 0.01

Запрос:

select * fromREAD_SPEC_CONF(56,0)

order by oUr.

Результат работы процедуры чтения спецификации представлен на рис. 6:

Рис. 6.

Детали КП25.00.00.470-01 ПРОУШИНА (ид.=45), КП25.00.00.454 РАСПОРКА (ид.=35) в спецификации отсутствуют.

Рис. 7.

Материал стенок соответствует ожидаемому:

КП25.00.00.456-01 СТЕНКА (36) ЛИСТ 10-Б-ПН-ОСТ 3СП 0.003

КП25.00.00.455 СТЕНКА БЧ (34) ЛИСТ 10-Б-ПН-ОСТ 3СП 0.01

Расчет сводных норм расхода ресурсов класса 21 Материалы

Запрос: select * from SUM_Q_F01 (56,1,21);

Ответ:

Рис. 8. Результаты расчета сводных норм для варианта исполнения 56

Проверим формирование еще одной конфигурации Кпр= 2, Кр =4

/********* Занесение значений параметров ***************/

select * from WRITE_PAR3 (57,19,18,0); /*OK*/

select * from WRITE_PAR3 (57,20,21,0); /*OK*/

Запрос: select * from READ_SPEC_CONF01(57,57,0)

order by oUr

Рис. 9.

Появились:

КП25.00.00.470-01 ПРОУШИНА (ид.=45) 2 шт.

КП25.00.00.454 РАСПОРКА (ид.=35). 4 шт.

Материал стенок изменился в соответствии с вариантом исполнения.

Рис. 10.

Результат расчета сводных норм расхода для нового варианта исполнения предствален на рис. 11.

Рис.11. Результат расчета сводных норм варианта исполнения с ид.=57

Выводы

1. Функции формирования параметров конфигурации работают корректно

2. Функции формирования варианта исполнения работают корректно

3. Функции формирования спецификации варианта исполнения работают корректно

4. Процедура расчета сводных норм расхода материальных ресурсов варианта исполнения работает корректно.

Задание по лабораторной работе выполнено.

Список используемых источников

1.

Приложение 1. Скрипты метаданных для задачи 6

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

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

/*ФУНКЦИЯ*/

CREATE TABLE F_COFIG (

ID_F INTEGER NOT NULL,

NAME VARCHAR(50),

SHORT_NAME VARCHAR(15)

);

ALTER TABLE F_CONFIG ADD PRIMARY KEY (ID_F);

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

CREATE GENERATOR F_CONFIG_GEN;

create procedure GEN_ID_F_CONFIG

returns (

ONEW integer)

as

begin

/*функция: возвращает новый уникальный идентификатор*/

oNew=GEN_ID(F_CONFIG_GEN,1); /*вызов генератора*/

suspend;

end

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

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

/*ПРЕДИКАТ*/

CREATE TABLE PREDICAT (

ID_PRED INTEGER NOT NULL

);

ALTER TABLE PREDICAT ADD PRIMARY KEY (ID_PRED);

alter table PREDICAT add ID_PAR integer not null;

alter table PREDICAT add ID_VAL integer not null;

alter table PREDICAT add OPER char(1) not null;

ALTER TABLE PREDICAT ADD FOREIGN KEY (ID_PAR) REFERENCES PARAMETR (ID_PAR);

ALTER TABLE PREDICAT ADD FOREIGN KEY (ID_VAL) REFERENCES ENUM_VAL (ID_VAL);

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

CREATE GENERATOR PREDICAT_GEN;

create procedure GEN_ID_PRED

returns (

ONEW integer)

as

begin

/*функция: возвращает новый уникальный идентификатор*/

oNew=GEN_ID(PREDICAT_GEN,1); /*вызов генератора*/

suspend;

end

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

/************ Расширение таблицы SPEC_PROD *********/

alter table SPEC_PROD add ID_F integer ;

ALTER TABLE SPEC_PROD ADD FOREIGN KEY (ID_F) REFERENCES F_CONFIG (ID_F);

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

CREATE TABLE BODY_F (

ID_F INTEGER NOT NULL,

NUM_D integer not null,

NUM_K integer not null,

ID_PRED integer not null

);

ALTER TABLE BODY_F ADD PRIMARY KEY (ID_F,NUM_D,NUM_K);

ALTER TABLE BODY_F ADD FOREIGN KEY (ID_F) REFERENCES F_CONFIG (ID_F);

ALTER TABLE BODY_F ADD FOREIGN KEY (ID_PRED) REFERENCES PREDICAT(ID_PRED);

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

/*************** Поддерживающие процедуры ***************/

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

create procedure NEW_F(pShName varchar(15),pName varchar(50))

returns(oIdF integer,oRes integer)

as

DECLARE VARIABLE vYesF INTEGER;

begin

/*функция: Создает новую функцию без тела

вход:pShName - обозначение

pName - имя

выход: oIdF - ид. новой функции

oRes - 0 - ошибка 1 - функция сформирована

эффекты: */

oRes=1;

select count(*) from F_CONFIG

where NAME=:pNAME and SHORT_NAME=:pShName

into vYesF;

if(:vYesF>0) then oRes=0;

else

begin

select oNew from GEN_ID_F_CONFIG

into :oIdF;

insert into F_CONFIG(ID_F,NAME,SHORT_NAME)

values(:oIdF,:pName,:pShName);

oRes=1;

end

suspend;

end

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

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

create procedure NEW_PRED(pIdPar integer,pOper char(1),pVal integer)

returns(oIdPred integer,oRes integer)

as

DECLARE VARIABLE vYesPar INTEGER;

DECLARE VARIABLE vYesVal INTEGER;

begin

/*функция: Создает новый предикат

вход:pIdPar - ид.параметра

pOper - оператор '=', '>', '<'

pVal - ид. значения

выход: oIdPred - ид. нового продукта

oRes - 0 - ошибка 1 - предикат сформирован

эффекты: */

oRes=1;

select count(*) from PARAMETR

where ID_PAR=:pIdPar

into vYesPar;

select count(*) from ENUM_VAL

where ID_VAL=:pVal

into vYesVal;

if (((:pOper = '=') or (:pOper='>')or(:pOper='<'))

and (:vYesPar>0) and (:vYesVal>0)) then

begin

oRes=1;

select oNew from GEN_ID_PRED

into :oIdPred;

insert into PREDICAT(ID_PRED,ID_PAR,OPER,ID_VAL)

values(:oIdPred,:pIdPar,:pOper,:pIdVal);

end

else

begin

oIdPred=0;

oRes=0;

end

suspend;

end

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

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

create procedure ADD_PRED(pIdF integer,pNumD integer, pIdPred integer)

returns(oNumK integer,oRes integer)

as

DECLARE VARIABLE vYesF INTEGER;

DECLARE VARIABLE vYesPred INTEGER;

DECLARE VARIABLE vYesNumD INTEGER;

DECLARE VARIABLE vMaxNumK INTEGER;

begin

/*функция: Добавляет в функцию новый предикат

вход:pIdF - ид.фуекции

pNumD - номер дизъюнкции

pIdPred - ид. предиката

выход: oNumK - номер конъюнкции

oRes - 0 - ошибка 1 - предикат сформирован

эффекты: */

oRes=1;

select count(*) from F_CONFIG

where ID_F=:pIdF

into vYesF;

select count(*) from PREDICAT

where ID_PRED=:pIdPred

into :vYesPred;

if((:vYesF>0)and(:vYesPred>0)) then

begin

select count(*) from BODY_F

where ID_F=:pIdF and NUM_D=:pNumD

into vYesNumD;

if(:vYesNumD>0)then

begin

select MAX(NUM_K) from BODY_F

where ID_F=:pIdF and NUM_D=:pNumD

into :vMaxNumK;

if(:vMaxNumK is null) then vMaxNumK=1;

else vMaxNumK=vMaxNumK+1;

end

else

begin

vMaxNumK=1;

end

insert into BODY_F(ID_F,NUM_D,NUM_K,ID_PRED)

values(:pIdF,:pNumD,:vMaxNumK,:pIdPred);

oRes=1;

oNumK=vMaxNumK;

end

else

oRes=0;

suspend;

end

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

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

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

create procedure RES_F(pIdProd integer,pIdPOS integer)

returns(oIdF integer,oRes integer)

as

DECLARE VARIABLE vNumD INTEGER;

DECLARE VARIABLE vResK INTEGER;

DECLARE VARIABLE vResPred INTEGER;

DECLARE VARIABLE vIdPred INTEGER;

DECLARE VARIABLE vPar INTEGER;

DECLARE VARIABLE vValP INTEGER;

DECLARE VARIABLE vOper char(1);

DECLARE VARIABLE vValConf INTEGER;

DECLARE VARIABLE vRes INTEGER;

begin

/*функция: Определяет допустимость включения строки спецификации в вариант исполнения pIdProd

вход:pIdProd - ид.варианта исполнения

pIdPOS - номер строки спецификации

выход: oNumK - номер конъюнкции

oRes - 0 - false 1 - true

эффекты: */

oRes=1;

/*Находим функцию для строки*/

select ID_F from SPEC_PROD

where ID_POS=:pIdPos

into :oIdF;

if ((:oIdF=0)or(:oIdF is null)) then

begin

oRes=1;

oIdF=0;

suspend;

end

else

begin

vResK=0;

for select distinct p1.NUM_D from BODY_F p1

where p1.ID_F=:oIdF

into :vNumD do

begin

if(:vResK=0) then

begin

vResK=1;

for select p2.ID_PRED from BODY_F p2

where p2.ID_F=:oIdF and p2.NUM_D=:vNumD

into :vIdPred do

begin

if(:vResK=1) then

begin

select ID_PAR,ID_VAL,OPER from PREDICAT

where ID_PRED=:vIdPred

into :vPar,:vValP,:vOper;

select ENUM_VAL from PAR_PROD

where PROD=:pIdProd and PAR=:vPar

into :vValConf;

if(:vOper =''='') then

if(:vValP=:vValConf) then vRes=1;

else vRes=0;

else

if(:vOper =''>'') then

if(:vValP>:vValConf) then vRes=1;

else vRes=0;

else

if(:vOper =''<'') then

if(:vValP<:vValConf) then vRes=1;

else vRes=0;

if(:vRes=0) then vResK=0;

end

end

end

end

oRes=vResK;

suspend;

end

end

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

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

create procedure READ_SPEC_CONF01(pMainEl integer,pIdEl integer,pUr integer)

returns(oIdEl integer, oShName varchar(50),

oName varchar(200), oInEl integer,

oInShName varchar(50), oInName varchar(200),

oQ double precision,

oUr integer,

oRes integer)

as

declare variable vInEl integer;

declare variable vIdEl integer;

declare variable vUr integer;

declare variable vFConf integer;

declare variable vIdPos integer;

declare variable vConf integer;

declare variable vREl integer;

declare variable vTypeProd integer;

declare variable vYesPos integer;

declare variable vYesSpec integer;

declare variable vCircle integer;

declare variable vShName varchar(50);

declare variable vName varchar(200);

begin

/*

функция: Находит спецификацию изделия с учетом значений параметров конфигурации рассчитывая для каждого элемента уровень U

вход: pMainEl - исходный элемент,

pIdEl текущий элемент

pU - начальный уровень = 0

выход:oIdEl - текущий элемент

oUr - уровень элемента

oName - имя изделия

oShName - обозначение

oInEl - ид. вход. объект

oInShName - имя вх. объекта

oInName - обозначение вх. объекта

oRes - 1 - наличие цикла 0 - циклов нет

эффекты:

1. При наличии циклов oIdEl=0, oRes=1

требования: привызове pUr=0

Требования:

1. При вызове pMainEl=pIdEl, pUr=0

*/

select NAME,SHORT_NAME,CONF,TYPE_PROD from PROD

where ID_PROD=:pIdEl

into :vName,:vShName,:vConf,:vTypeProd;

if ((:vConf=0)or(:vConf=1)or (:vConf is null)) then

vREl=pIdEl;

else vREl=vTypeProd;

select count(*) from SPEC_PROD

where ID_PROD=:vREl

into :vYesSpec;

oRes=0;

if (:vYesSpec >0) then

begin

if(:pUr=0) then

begin

select count(*) from FIND_CIRCLE(:vREl,0)

where oYesCircle>0

into :oRes;

end

vUr=pUr+1;

oUr=vUr;

vIdEl=vREl;

if(:oRes>0) then

suspend;

else

begin

for select USE_EL,Q, ID_F, ID_POS from SPEC_PROD

where ID_PROD=:vREl

into :vInEl,oQ ,:vFConf,:vIdPos do

begin

if(:vFConf >0) then

select oRes from RES_F(:pMainEl,:vIdPOS)

into :vYesPos;

if((:vFConf is null)or(:vFConf>0)and(:vYesPos=1))then

begin

oIdEl=vIdEl;

oName=vName;

oShName=vShName;

oUr=vUr;

select NAME,SHORT_NAME from PROD

where ID_PROD=:vInEl

into :oInName,:oInShName;

oInEl=vInEl;

suspend;

for select oIdEl,oName,oShName,oInEl,oInName,

oInShName,oQ,oUr

from READ_SPEC_CONF01(:pMainEl,:vInEl,:vUr)

into :oIdEl,:oName,:oShName,:oInEl,

:oInName,:oInShName,:oQ,:oUr do

suspend;

end

end

end

end

end

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

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

create procedure SUM_Q_CONF01(pMainEl integer,pIdEl integer,pUr integer,pQ double precision)

returns(oIdEl integer, oShName varchar(50),

oName varchar(200), oInEl integer,

oInShName varchar(50), oInName varchar(200),

oQ double precision,

oUr integer,

oRes integer)

as

declare variable vInEl integer;

declare variable vIdEl integer;

declare variable vUr integer;

declare variable vFConf integer;

declare variable vIdPos integer;

declare variable vConf integer;

declare variable vREl integer;

declare variable vTypeProd integer;

declare variable vYesPos integer;

declare variable vYesSpec integer;

declare variable vCircle integer;

declare variable vShName varchar(50);

declare variable vName varchar(200);

declare variable vQ double precision;

declare variable vTQ double precision;

begin

/*

функция: Находит спецификацию изделия с учетом значений параметров конфигурации рассчитывая для каждого элемента уровень U

вход: pMainEl - исходный элемент,

pIdEl текущий элемент

pU - начальный уровень = 0

выход:oIdEl - текущий элемент

oUr - уровень элемента

oName - имя изделия

oShName - обозначение

oInEl - ид. вход. объект

oInShName - имя вх. объекта

oInName - обозначение вх. объекта

oRes - 1 - наличие цикла 0 - циклов нет

эффекты:

1. При наличии циклов oIdEl=0, oRes=1

требования: привызове pUr=0

Требования:

1. При вызове pMainEl=pIdEl, pUr=0

*/

select NAME,SHORT_NAME,CONF,TYPE_PROD from PROD

where ID_PROD=:pIdEl

into :vName,:vShName,:vConf,:vTypeProd;

if ((:vConf=0)or(:vConf=1)or (:vConf is null)) then

vREl=pIdEl;

else vREl=vTypeProd;

select count(*) from SPEC_PROD

where ID_PROD=:vREl

into :vYesSpec;

oRes=0;

if (:vYesSpec >0) then

begin

if(:pUr=0) then

begin

select count(*) from FIND_CIRCLE(:vREl,0)

where oYesCircle>0

into :oRes;

end

vUr=pUr+1;

oUr=vUr;

vIdEl=vREl;

if(:oRes>0) then

suspend;

else

begin

for select USE_EL,Q, ID_F, ID_POS from SPEC_PROD

where ID_PROD=:vREl

into :vInEl,vQ ,:vFConf,:vIdPos do

begin

if(:vFConf >0) then

select oRes from RES_F(:pMainEl,:vIdPOS)

into :vYesPos;

if((:vFConf is null)or(:vFConf>0)and(:vYesPos=1))then

begin

oIdEl=vIdEl;

oName=vName;

oShName=vShName;

oUr=vUr;

select NAME,SHORT_NAME from PROD

where ID_PROD=:vInEl

into :oInName,:oInShName;

oInEl=vInEl;

vTQ=vQ*pQ;

oQ=vTQ;

suspend;

for select oIdEl,oName,oShName,oInEl,oInName,

oInShName,oQ,oUr

from SUM_Q_CONF01

(:pMainEl,:vInEl,:vUr,:vTQ)

into :oIdEl,:oName,:oShName,:oInEl,

:oInName,:oInShName,:oQ,:oUr do

suspend;

end

end

end

end

end

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

create procedure SUM_Q_F01 (

PIDEL integer,

PQ double precision,

PGR integer)

returns (

OINEL integer,

OIDGR integer,

ONAMEGR varchar(50),

OSHORTNAMEEL varchar(25),

ONAMEEL varchar(50),

OSUMQ double precision,

OIDEI integer,

OSHORTNAMEEI varchar(50))

as

declare variable VGR integer;

declare variable VYES integer;

declare variable vIdCl integer;

BEGIN

/*функция:

Расчет расхода компонентов для исходного количества pQ на всю глубину спецификации для элемента pIdEl

вход:

pIdEl - Код элемента, для которого ведется расчет норм расхода

pQ - Исходное количество в основной единице измерения

выход:

oInEl - ид. исходного элемента,

oIdGr - ид. терминальной группы входящего элемента,

oNameGr - имя группы,

oShortNameEl обозначение группы,

oNameEl - имя входящего элемента,

oSumQ - суммарное количество входящего элемента,

oIdEI - ид. единицы измерения количества,

oShortNameEI - обозначение единицы измерения количества

редактор:

26.10.2012 Дубенецкий В.А.

*/

/*инициализация переменных */

oInEl=0;

oIdGr=0;

oNameGr='';

oSumQ=0.00001;

oInEl=0;

oNameEl='';

oShortNameEl='';

oIdEI=0;

oShortNameEI='';

/*Группирование и суммирование всех найденных применяемостей*/

for select oInEl, SUM(oQ) from SUM_Q_CONF01

(:pIdEl,:pIdEl,0,:pQ)

group by oInEl

into :oInEl,:oSumQ

do

begin

/*Поиск дополнительных характеристик*/

select SHORT_NAME, NAME,ID_CL from PROD

where ID_PROD=:oInEl

into :oShortNameEl,:oNameEl,:vGr;

select BASE_EI from CHEM_CLASS

where ID_CLASS=:vGr

into :oIdEI;

select SHORT_NAME from EI

where ID_EI=:oIdEI

into :oShortNameEI;

/*Определение терминальной группы по коду схемы группирования*/

oIdGr=0;

oNameGr='';

select oYes from IN_GR(:pGR, :vGR)

into :vYes;

if(:vYes=1) then

begin

oIdGr=vGr;

select NAME from CHEM_CLASS

where ID_CLASS=:vGr

into :oNameGr;

suspend;

end

end

end

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

/************Подготовка данных для примера*********************/

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

/********* Добавление изделий **************/

/*0 - «Изделие без конфигуратора»

2 1 - «Типовое изделие с конфигуратором»

3 2 - «Вариант исполнения»

*/

select * from INS_PROD2(15,'','ЛИСТ 14-Б-ПН-ОСТ 3СП',0,0);

/*id = 54*/

select * from INS_PROD2(15,'','ЛИСТ 10-Б-ПН-ОСТ 3СП',0,0);

/*id = 55*/

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

/************* Создание перечислений *********************/

select * from INS_ENUN('Кпр','КОЛ. ПРОУШИН') /*3*/

select * from INS_ENUN('Кр','КОЛ. РАСПОРОК') /*4*/

select * from INS_VAL_ENUM(3,'','',0); /*16*/

select * from INS_VAL_ENUM(3,'1','1',1); /*17*/

select * from INS_VAL_ENUM(3,'2','2',2); /*18*/

select * from INS_VAL_ENUM(4,'','',0); /*19*/

select * from INS_VAL_ENUM(4,'','',2); /*20*/

select * from INS_VAL_ENUM(4,'','',4); /*21*/

/***************** Создание параметров *************/

select * from INS_PARAMETR('К_ПР шт','КОЛ.ПРОУШИН ',9,2,3);/*19*/

select * from INS_PARAMETR('К_Р шт','КОЛ. РАСПОРОК',9,2,4); *20*/

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

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

insert into PAR_TYPE_PROD(ID_PROD,ID_PAR,MIN_VAL,MAX_VAL)

values(52,19,0,2);

insert into PAR_TYPE_PROD(ID_PROD,ID_PAR,MIN_VAL,MAX_VAL)

values(52,20,0,4);

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

/********* Создание предикатов **********************/

/* NEW_PRED(pIdPar integer,pOper char(1),pVal integer)*/

/***

1. (Кпр=0 and Кр=0) or (Кпр=0 and Кр=2) or (Кпр=1 and Кр=0) для материала M3

2. (Кпр=1 and Кр=2) or (Кпр=2 and Кр=2) для материала M2

3. (Кпр=2 and Кр=4) для материала M1

4. (Кпр=1 and Кр=0) or (Кпр=1 and Кр=2) для строки с количеством проушин 1

5. (Кпр=2 and Кр=2) or (Кпр=2 and Кр=4) для строки с количеством проушин 2

6. Кр=2 для строки с количеством распорок 2

7. (Кпр=2 and Кр=4) для строки с количеством распорок 4

Недопустимые варианты задаются функцией:

(Кпр=0 and Кр=4) or (Кпр=1 and Кр=4) or ( Кпр=2 and Кр=0)

*/

select * from NEW_PRED(19,'=',16) /*1 Кпр=0 */

select * from NEW_PRED(20,'=',19) /*2 Кр=0 */

select * from NEW_PRED(20,'=',20) /*3 Кр=2 */

select * from NEW_PRED(19,'=',17) /*4 Кпр=1 */

select * from NEW_PRED(19,'=',18) /*5 Кпр=2 */

select * from NEW_PRED(20,'=',21) /*6 Кр=4 */

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

/********* Создание функций **********************/

/* procedure NEW_F(pShName varchar(15),pName varchar(50))

returns(oIdF integer,oRes integer)

*/

select * from NEW_F('1','1') /*9*/

select * from NEW_F('2','2') /*10*/

select * from NEW_F('3','3') /*11*/

select * from NEW_F('4','4') /*12*/

select * from NEW_F('5','5') /*13*/

select * from NEW_F('6','6') /*14*/

select * from NEW_F('7','7') /*15*/

select * from NEW_F('ER','ER') /*16*/

/********* Создание тела функций **********************/

/* procedure ADD_PRED(pIdF integer,pNumD integer, pIdPred integer)

returns(oNumK integer,oRes integer)

*/

/*1. (Кпр=0 and Кр=0) or (Кпр=0 and Кр=2) or (Кпр=1 and Кр=0) для материала M3*/

select * from ADD_PRED(9,1,1);

select * from ADD_PRED(9,1,2);

select * from ADD_PRED(9,2,1);

select * from ADD_PRED(9,2,3);

select * from ADD_PRED(9,3,4);

select * from ADD_PRED(9,3,2);

/*2. (Кпр=1 and Кр=2) or (Кпр=2 and Кр=2) для материала M2*/

select * from ADD_PRED(10,1,4);

select * from ADD_PRED(10,1,3);

select * from ADD_PRED(10,2,5);

select * from ADD_PRED(10,2,2);

/*3. (Кпр=2 and Кр=4) для материала M1 */

select * from ADD_PRED(11,1,5);

select * from ADD_PRED(11,1,6);

/*4. (Кпр=1 and Кр=0) or (Кпр=1 and Кр=2) для строки с количеством проушин 1 */

select * from ADD_PRED(12,1,4);

select * from ADD_PRED(12,1,2);

select * from ADD_PRED(12,2,4);

select * from ADD_PRED(12,2,3);

/*5. (Кпр=2 and Кр=2) or (Кпр=1 and Кр=4) для строки с количеством проушин 2 */

select * from ADD_PRED(13,1,5);

select * from ADD_PRED(13,1,2);

select * from ADD_PRED(13,2,4);

select * from ADD_PRED(13,2,6);

/*6. Кр=2 для строки с количеством распорок 2 */

select * from ADD_PRED(14,1,3);

/*7. (Кпр=2 and Кр=4) для строки с количеством распорок 4 */

select * from ADD_PRED(15,1,5);

select * from ADD_PRED(15,1,6);

/*Недопустимые варианты задаются функцией:

(Кпр=0 and Кр=4) or (Кпр=1 and Кр=4) or ( Кпр=2 and Кр=0) */

select * from ADD_PRED(16,1,1);

select * from ADD_PRED(16,1,6);

select * from ADD_PRED(16,2,4);

select * from ADD_PRED(16,2,6);

select * from ADD_PRED(16,3,5);

select * from ADD_PRED(16,3,2);

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

/********* Изменение спецификации **********************/

select * from INS_POS(52,45, 2); /* кличество проушин 2*/

select * from INS_POS(52,35, 4); /* количество распорок 4*/

select * from INS_POS(36,54, 0.004); /*замена материала стенок */

select * from INS_POS(36,55, 0.003);

select * from INS_POS(34,54, 0.012);

select * from INS_POS(36,55, 0.01);

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

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

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

/*procedure NEW_VAR_PROD ( pTypeProd integer)

returns (

OIDPROD integer,oName varchar(250), oShName varchar(50),

ORES integer)

*/

select * from NEW_VAR_PROD ( 52) /*56*/

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

/*ADD_PARAMETR_CLASS (

PIDPAR integer,

PIDCLASS integer,

PMINVAL double precision,

PMAXVAL double precision)*/

select * from ADD_PARAMETR_CLASS(19,24,0,2)

select * from ADD_PARAMETR_CLASS(20,24,0,4)

/*procedure COPY_PAR_PROD (

PIDPROD integer)

returns (

ORES integer)

*/

select * from COPY_PAR_PROD (52)

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

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

create procedure WRITE_PAR3 (

PIDPROD integer,

PIDPAR integer,

pIdVal 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 - ид. параметра

pIdVal - ид. для значения

pVal - численное значение параметра

выход: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=pIdVal;

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

/********* Занесение значений параметров ***************/

select * from WRITE_PAR3 (56,19,16,0); /*OK*/

select * from WRITE_PAR3 (56,20,19,0); /*OK*/

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

/**************** Поиск спецификации****************/

select * from READ_SPEC_CONF1(56,56,0)

order by oUr .

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

/******* Найти параметры варианта исполнения ************/

select * from READ_VAR_CONF01(56)

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

/* Расчет сводных норм расхода ресурсов заданного класса **/

/* 21 - ид. класса Материалы*/

select * from SUM_Q_F01 (56,1,21)

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

select * from NEW_VAR_PROD ( 52) /*57*/

/********* Занесение значений параметров ***************/

select * from WRITE_PAR3 (57,19,18,0); /*OK*/

select * from WRITE_PAR3 (57,20,21,0); /*OK*/

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

/**************** Поиск спецификации****************/

select * from READ_SPEC_CONF01(57,57,0)

order by oUr

/* Расчет сводных норм расхода ресурсов заданного класса **/

/* 21 - ид. класса Материалы*/

select * from SUM_Q_F01 (57,1,21)

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

37

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