ПриложениеА
РисунокА.1– Схемаданных
РисунокБ.1–Диаграммадекомпозицииблока«Приёмтовара»(IDEF0)
РисунокБ.2–Диаграммадекомпозицииблока«Учёттовара»(IDEF0)
ПрограммныйкодбазыданныхCREATE TABLE TDOCUMTITLES (FID BIGINT NOT NULL,FTYPE INTEGERNOTNULL,FSTATEINTEGERDEFAULT1NOTNULL,FDATE DATE DEFAULT CURRENT_DATE NOT NULL,FTIME TIMEDEFAULT CURRENT_TIME,FPERSONINTEGER,FUSER INTEGERNOTNULL,FSUMM DECIMAL(15,2));ALTERTABLETDOCUMTITLESADDCONSTRAINTPK_TDOCUMTITLESPRIMARYKEY(FID);ALTER TABLE TDOCUMTITLES ADD CONSTRAINT FK_TDOCUMTITLES_1 FOREIGNKEY(FTYPE)REFERENCES TDOCUMTYPE (FID);ALTER TABLE TDOCUMTITLES ADD CONSTRAINT FK_TDOCUMTITLES_2 FOREIGNKEY(FPERSON) REFERENCES TPERSON(FID);ALTER TABLE TDOCUMTITLES ADD CONSTRAINT FK_TDOCUMTITLES_3 FOREIGNKEY(FUSER) REFERENCES TUSERS(FID);ALTER TABLE TDOCUMTITLES ADD CONSTRAINT FK_TDOCUMTITLES_4 FOREIGNKEY(FSTATE)REFERENCES TDOCUMSTATE (FID);CREATE TABLE TDOCUMCONTENT (FID BIGINTNOTNULL,FDOCID BIGINT NOT NULL,FDOCTYPESMALLINT NOT NULL,FGOODSIDINTEGER NOT NULL,FAMOUNTNUMERIC(8,3)NOTNULL,FPRICE DECIMAL(15,2),FSTOREIDBIGINT);ALTER TABLE TDOCUMCONTENT ADD CONSTRAINT PK_TDOCUMCONTENTPRIMARYKEY(FID);ALTER TABLE TDOCUMCONTENT ADD CONSTRAINT FK_TDOCUMCONTENT_1FOREIGN KEY (FDOCID)REFERENCES TDOCUMTITLES(FID);ALTER TABLE TDOCUMCONTENT ADD CONSTRAINT FK_TDOCUMCONTENT_2FOREIGN KEY (FGOODSID) REFERENCESTGOODS (FID);ALTER TABLE TDOCUMCONTENT ADD CONSTRAINT FK_TDOCUMCONTENT_3FOREIGN KEY (FSTOREID)REFERENCES TSTORE (FID);CREATETABLETGOODS(FID INTEGERNOTNULL,FGROOP INTEGERDEFAULT 1,FGOODSNAMEVARCHAR(150)DEFAULT'Новый_товар'NOTNULL,FUNIT INTEGER,FARTICLE VARCHAR(30),FCOMMENT
VARCHAR(30),
FSTATE SMALLINT DEFAULT 1, FAMOUNT NUMERIC(8,3), FPRICE DECIMAL(15,2));
ALTER TABLE TGOODS ADD CONSTRAINT PK_TGOODS PRIMARY KEY (FID); ALTER TABLE TGOODS ADD CONSTRAINT FK_TGOODS_1 FOREIGN KEY (FGROOP) REFERENCES TGROOP (FID);
ALTER TABLE TGOODS ADD CONSTRAINT FK_TGOODS_2 FOREIGN KEY (FUNIT) REFERENCES TUNITS (FID);
CREATE TABLE TPERSON (
FID INTEGER NOT NULL, FTYPE SMALLINT DEFAULT 1,
FGROUP SMALLINT DEFAULT 0 NOT NULL,
FSHORTNAME VARCHAR(30) DEFAULT 'NewPerson' NOT NULL, FFULLNAME VARCHAR(250),
FADDR VARCHAR(250), FADDR2 VARCHAR(250), FPHONE VARCHAR(30), FEMAIL VARCHAR(50), FSCHET VARCHAR(50), FBIK VARCHAR(15), FKPP VARCHAR(15), FINN VARCHAR(12), FOKPO VARCHAR(250), FOGRN VARCHAR(20));
ALTER TABLE TPERSON ADD CONSTRAINT PK_TPERSON PRIMARY KEY (FID); ALTER TABLE TPERSON ADD CONSTRAINT FK_TPERSON_1 FOREIGN KEY (FGROUP) REFERENCES TPERSONGROOP (FID);
CREATE TABLE TSTORE ( FID BIGINT NOT NULL,
FGOODSID INTEGER NOT NULL, FAMOUNT NUMERIC(8,3) NOT NULL, FPRICE DECIMAL(15,2) NOT NULL, FPERSON INTEGER NOT NULL,
FUSER INTEGER DEFAULT 1 NOT NULL);
ALTER TABLE TSTORE ADD CONSTRAINT PK_TSTORE PRIMARY KEY (FID); ALTER TABLE TSTORE ADD CONSTRAINT FK_TSTORE_1 FOREIGN KEY (FGOODSID) REFERENCES TGOODS (FID);
ALTER TABLE TSTORE ADD CONSTRAINT FK_TSTORE_2 FOREIGN KEY (FPERSON) REFERENCES TPERSON (FID);
ALTER TABLE TSTORE ADD CONSTRAINT FK_TSTORE_3 FOREIGN KEY (FUSER) REFERENCES TUSERS (FID);
create or alter procedure DOC_EX (VIN_DOCID bigint not null = 0,VIN_PERSON integer not null = 0,VIN_USERintegernot null= 0)asdeclarevariableVMY_DOCTYPEsmallint;/*типдокумента*/declarevariableVMY_DOCSTATEsmallint;/*состояниедокумента*/declarevariableVMY_GOODSIDinteger;/* номертовара*/declare variable VMY_AMOUNT double precision; /* количество товара */declarevariable VMY_PRICEdecimal(15,2); /*ценатовара*/declarevariableVMY_PRICE_DISPLAYdecimal(15,2);/*отображаемый цена*/declare variable VMY_AMOUNT_DISPLAY double precision; /* отображаемый остаток */declarevariable VMY_LAPCOUNTinteger;declare variable VMY_STOREID integer; /* код товара на складе */declarevariable VMY_SUMMdecimal(15,2); /*сумма*/BEGINVMY_SUMM=0;VMY_LAPCOUNT=0;/* ПОЛУЧИТЬ ТИП ДОКУМЕНТА */SELECTFTYPE, FSTATEFROM TDOCUMTITLESWHEREFID=:VIN_DOCIDINTO:VMY_DOCTYPE,:VMY_DOCSTATE;/* ПРОВЕРИТЬ СОСТОЯНИЕ ДОКУМЕНТА */IF(:VMY_DOCSTATE <>1) THENEXCEPTION EDOCUMTITLES_ERRSTATEDOC 'Документ уже Проведён илиУдалён!';/*----------ПОСТ УПЛЕ НИЕТМЦ */IF (:VMY_DOCTYPE = 1) THENBEGINFOR SELECT FGOODSID, FAMOUNT, FPRICEFROMTDOCUMCONTENTWHERE(FDOCID=:VIN_DOCID)INTO:VMY_GOODSID,:VMY_AMOUNT,:VMY_PRICEDOBEGINVMY_LAPCOUNT=(:VMY_LAPCOUNT+1);/*РАСЧЕТСУММЫ*/VMY_SUMM=(:VMY_SUMM + (:VMY_AMOUNT * :VMY_PRICE));/*-----ПОЛУЧИТЬТЕКУЩИЕЗНАЧЕНИЯ */SELECT FAMOUNT, FPRICEFROMTGOODSWHERE(FID=:VMY_GOODSID)INTO:VMY_AMOUNT_DISPLAY,:VMY_PRICE_DISPLAY;/*-----ВСТАВКАНАСКЛАД */INSERT INTO TSTORE (FGOODSID, FAMOUNT, FPRICE, FPERSON, FUSER)VALUES(:VMY_GOODSID,:VMY_AMOUNT,:VMY_PRICE,:VIN_PERSON,:VIN_USER);/*-----ВИЗУАЛЬНЫЕИЗМЕНЕНИЯ *//*РАСЧИТАТЬНОВОЕКОЛИЧЕСТВО*/IF(:VMY_AMOUNT_DISPLAYISNULL)THENVMY_AMOUNT_DISPLAY=0;VMY_AMOUNT=(:VMY_AMOUNT_DISPLAY+:VMY_AMOUNT);/*РАСЧИТАТЬНОВУЮЦЕНУ*/IF(:VMY_PRICE_DISPLAYISNOTNULL)THENIF ((:VMY_PRICE_DISPLAY = 0) OR ((:VMY_PRICE_DISPLAY <> :VMY_PRICE)))
THENVMY_PRICE=0;/*ОБНОВИТЬТАБЛИЦУ*/UPDATETGOODSSET FAMOUNT = :VMY_AMOUNT,FPRICE=:VMY_PRICEWHERE FID = :VMY_GOODSID;ENDENDELSE/*----------Р Е АЛИЗА ЦИЯТ ОВ АРА */IF (:VMY_DOCTYPE = 2) THENBEGINFOR SELECT C.FGOODSID, C.FAMOUNT, C.fprice, C.FSTOREIDFROM(TDOCUMCONTENT CLEFTJOINTGOODSGONC.FGOODSID=G.FID)WHERE(C.FDOCID=:VIN_DOCID)INTO:VMY_GOODSID,:VMY_AMOUNT,:VMY_PRiCe,:VMY_STOREIDDOBEGINVMY_LAPCOUNT=(:VMY_LAPCOUNT+1);/*РАСЧЕТСУММЫ*/VMY_SUMM = (:VMY_SUMM + (:VMY_AMOUNT * :VMY_price));BEGIN/*-----СПИСАНИЕСОСКЛАДА */SELECT FAMOUNTFROMTSTOREWHERE(FID=:VMY_STOREID)INTO VMY_AMOUNT_DISPLAY;/* ПОЛУЧИТЬ ТЕК. ЗНАЧЕНИЕ НА СКЛАДЕ */IF((:VMY_AMOUNT_DISPLAY -:VMY_AMOUNT)<0 ) THENEXCEPTION ESTORE_LACKAMOUNT 'Не хватает количества для позиции №"'||:VMY_LAPCOUNT||'"';UPDATETSTORESETFAMOUNT =(:VMY_AMOUNT_DISPLAY-:VMY_AMOUNT)WHERE(FID=:VMY_STOREID);/*ОБНОВИТЬЗНАЧЕНИЕНАСКЛАДЕ*//*-----ВИЗУАЛЬНЫЕИЗМЕНЕНИЯ */SELECT FAMOUNT, FPRICEFROMTGOODSWHERE(FID=:VMY_GOODSID)INTOVMY_AMOUNT_DISPLAY,:VMY_PRICE_DISPLAY;/*РАСЧИТАТЬНОВОЕКОЛИЧЕСТВО*/VMY_AMOUNT = (:VMY_AMOUNT_DISPLAY - :VMY_AMOUNT);IF(:VMY_AMOUNT=0) THENBEGINVMY_AMOUNT = NULL;VMY_PRICE=NULL;ENDELSEBEGIN/* ПРОВЕРИТЬ НА НАЛИЧИЕ НЕСКОЛЬКИХ ЦЕН */IF(:VMY_PRICE_DISPLAY=0)THENIF((SELECTFIRST1COUNT(DISTINCTFPRICE)FROMTSTOREWHERE ((FGOODSID = :VMY_GOODSID) AND (FAMOUNT > 0))) > 1) THENVMY_PRICE= 0;ELSEVMY_PRICE=(SELECTFIRST1FPRICEFROMTSTOREWHERE ((FGOODSID = :VMY_GOODSID) AND (FAMOUNT > 0)));END/* ОБНОВИТЬ ТАБЛИЦУ */UPDATETGOODSSET FAMOUNT = :VMY_AMOUNT,FPRICE=:VMY_PRICEWHEREFID=:VMY_GOODSID;end endENDELSE/*----------С ПИСАНИЕТ ОВАРА */IF (:VMY_DOCTYPE = 3) THENBEGINVMY_LAPCOUNT= (:VMY_LAPCOUNT+ 1);FOR SELECT FGOODSID, FAMOUNT, FPRICE, FSTOREIDFROMTDOCUMCONTENTWHERE(FDOCID=:VIN_DOCID)INTO:VMY_GOODSID,
:VMY_AMOUNT,:VMY_PRICE,:VMY_STOREIDDOBEGIN/*-----СПИСАНИЕ СОСКЛАДА */SELECT FAMOUNTFROMTSTOREWHERE(FID=:VMY_STOREID)INTO VMY_AMOUNT_DISPLAY;/* ПОЛУЧИТЬ ТЕК. ЗНАЧЕНИЕ НА СКЛАДЕ */IF((:VMY_AMOUNT_DISPLAY-:VMY_AMOUNT)<0)THENEXCEPTION ESTORE_LACKAMOUNT 'Не хватает количества для позиции №"'||:VMY_LAPCOUNT||'"';UPDATETSTORESETFAMOUNT =(:VMY_AMOUNT_DISPLAY -:VMY_AMOUNT)WHERE(FID=:VMY_STOREID);/*ОБНОВИТЬЗНАЧЕНИЕНАСКЛАДЕ*//*РАСЧЕТСУММЫ*/VMY_SUMM=(:VMY_SUMM + (:VMY_AMOUNT * :VMY_PRICE));/*-----ВИЗУАЛЬНЫЕИЗМЕНЕНИЯ */SELECT FAMOUNT, FPRICEFROMTGOODSWHERE(FID=:VMY_GOODSID)INTOVMY_AMOUNT_DISPLAY,:VMY_PRICE_DISPLAY;/*РАСЧИТАТЬНОВОЕКОЛИЧЕСТВО*/VMY_AMOUNT=(:VMY_AMOUNT_DISPLAY-:VMY_AMOUNT);/* РАСЧИТАТЬ НОВУЮ ЦЕНУ */IF (:VMY_AMOUNT = 0) THENBEGINVMY_AMOUNT = NULL;VMY_PRICE=NULL;ENDELSEBEGIN/*ПРОВЕРИТЬНАНАЛИЧИЕНЕСКОЛЬКИХЦЕН*/IF(:VMY_PRICE_DISPLAY=0)THENIF((SELECTFIRST1COUNT(DISTINCTFPRICE)FROMTSTOREWHERE ((FGOODSID = :VMY_GOODSID) AND (FAMOUNT > 0))) > 1) THENVMY_PRICE= 0;ELSEVMY_PRICE=(SELECTFIRST1FPRICEFROMTSTOREWHERE((FGOODSID=:VMY_GOODSID)AND(FAMOUNT>0)));END/* ОБНОВИТЬ ТАБЛИЦУ */UPDATETGOODSSET FAMOUNT = :VMY_AMOUNT,FPRICE=:VMY_PRICEWHERE FID = :VMY_GOODSID;ENDENDELSE/*---------- ВОЗВР АТТ ОВ АРА */IF (:VMY_DOCTYPE = 4) THENBEGINFOR SELECT C.FGOODSID,C.FAMOUNT, C.FPRICEFROM(TDOCUMCONTENT CLEFTJOINTGOODSGONC.FGOODSID=G.FID)WHERE(C.FDOCID=:VIN_DOCID)INTO:VMY_GOODSID,:VMY_AMOUNT,:VMY_PRICEDOBEGINVMY_LAPCOUNT=(:VMY_LAPCOUNT+1);/*РАСЧЕТСУММЫ*/VMY_SUMM=(:VMY_SUMM + (:VMY_AMOUNT * :VMY_PRICE));/*-----ВСТАВКАНАСКЛАД */INSERT INTO TSTORE (FGOODSID, FAMOUNT, FPRICE, FPERSON, FUSER)VALUES(:VMY_GOODSID,:VMY_AMOUNT,:VMY_PRICE,:VIN_PERSON,:VIN_USER);/*-----ВИЗУАЛЬНЫЕИЗМЕНЕНИЯ */SELECT FAMOUNT, FPRICEFROMTGOODSWHERE(FID