
- •Задание на работу
- •1.1. Разработать проект каркаса для работы со спецификациями изделий
- •1.2. Содержание работы
- •1.3. Исходные данные для задачи
- •1.4. Рекомендуемые инструменты
- •1.5. Рекомендуемые источники
- •Аннотация
- •1. Анализ исходных данных
- •2. Разработка функциональных требований к подсистеме
- •3. Разработка проектной модели классов
- •4. Разработка модели хранения
- •5. Разработка процедур поддержки работы со спецификациями
- •6. Подготовка примера спецификации изделия
- •7. Тестирование процедур работы со спецификацией изделия
- •Список используемых источников
- •Приложение 1. Скрипты метаданных для задачи 6
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)
/***************************************************************/