- •1.База данных (условной) предметной области.
- •2.Создание базы данных. Работа с InterBase windows ib_console.
- •Active after update position 0
- •Begin delete from rasxod
- •Create trigger ai_rasxod1 for rasxod
- •Create procedure get_kod_tovar
- •Create procedure get_kod_pokup
- •Create procedure get_kod_rasxod
- •Violation of primary or unique key constraint "integ_4" on table "tovary"
- •Violation of foreign key constraint "tov_rash" on table "rasxod"
- •Violation of foreign key constraint "pok_rash" on table "rasxod"
- •3.Администрирование базы данных. Bde. Создание псевдонима.
- •4.Разработка клиентского места
- •4.1 Основная экранная форма
- •If not RasxodTable.Eof then RasxodTable.Next
Create procedure get_kod_tovar
RETURNS (NR INTEGER) AS
BEGIN NR=GEN_ID(TOVARY_KOD,1); END
Create procedure get_kod_pokup
RETURNS (NR INTEGER) AS
BEGIN NR=GEN_ID(POKUPATELI_KOD,1); END
Create procedure get_kod_rasxod
RETURNS (NR INTEGER) AS
BEGIN NR=GEN_ID(RASXOD_KOD,1); END
В результате наших действий на сервере формируется следующая база:
/* Extract Database c:\uchbase\sklad\ib_sklad.gdb */
CREATE DATABASE "c:\uchbase\sklad\ib_sklad.gdb" PAGE_SIZE 1024
DEFAULT CHARACTER SET WIN1251;
/* Domain definitions */
CREATE DOMAIN KEY_TYPE AS INTEGER DEFAULT 0 NOT NULL;
/* Table: POKUPATELI, Owner: SYSDBA */
CREATE TABLE POKUPATELI (KOD_POKUP KEY_TYPE,
POKUP VARCHAR(30) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL,
GOROD VARCHAR(20) CHARACTER SET WIN1251 DEFAULT ''
COLLATE PXW_CYRL,
ADRES VARCHAR(25) CHARACTER SET WIN1251 DEFAULT ''
COLLATE PXW_CYRL,
TEL VARCHAR(8) CHARACTER SET WIN1251 COLLATE PXW_CYRL,
PRIMARY KEY (KOD_POKUP));
/* Table: RASXOD, Owner: SYSDBA */
CREATE TABLE RASXOD (KOD_RASH KEY_TYPE,
DATA_RASH TIMESTUMP NOT NULL,
KOLVO INTEGER DEFAULT 0,
STOIM KEY_TYPE,
KOD_TOVAR KEY_TYPE,
KOD_POKUP KEY_TYPE,
PRIMARY KEY (KOD_RASH));
/* Table: TOVARY, Owner: SYSDBA */
CREATE TABLE TOVARY (KOD_TOVAR INTEGER NOT NULL,
TOVAR VARCHAR(20) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL,
ED_IZM VARCHAR(10) CHARACTER SET WIN1251 DEFAULT ''
COLLATE PXW_CYRL,
ZENA INTEGER DEFAULT 0,
COUNT_TOV INTEGER,
PRIMARY KEY (KOD_TOVAR));
ALTER TABLE RASXOD ADD CONSTRAINT TOV_RASH FOREIGN KEY (KOD_TOVAR) REFERENCES TOVARY(KOD_TOVAR) ON UPDATE CASCADE ON DELETE CASCADE;
ALTER TABLE RASXOD ADD CONSTRAINT POK_RASH FOREIGN KEY (KOD_POKUP) REFERENCES POKUPATELI(KOD_POKUP);
CREATE GENERATOR TOVARY_KOD;
CREATE GENERATOR POKUPATELI_KOD;
CREATE GENERATOR RASXOD_KOD;
ALTER TABLE TOVARY ADD
CHECK (ZENA >= 0);
COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;
/* Stored procedures */
CREATE PROCEDURE GET_KOD_POKUP AS BEGIN EXIT; END ^
CREATE PROCEDURE GET_KOD_RASXOD AS BEGIN EXIT; END ^
CREATE PROCEDURE GET_KOD_TOVAR AS BEGIN EXIT; END ^
ALTER PROCEDURE GET_KOD_POKUP RETURNS (NR INTEGER) AS
BEGIN
NR=GEN_ID(POKUPATELI_KOD,1);
END
^
ALTER PROCEDURE GET_KOD_RASXOD RETURNS (NR INTEGER) AS
BEGIN
NR=GEN_ID(RASXOD_KOD,1);
END
^
ALTER PROCEDURE GET_KOD_TOVAR RETURNS (NR INTEGER) AS
BEGIN
NR=GEN_ID(TOVARY_KOD,1);
END
^
SET TERM ; ^
COMMIT WORK ;
SET AUTODDL ON;
SET TERM ^ ;
/* Triggers only will work for SQL triggers */
CREATE TRIGGER AU_POKUPATELI FOR POKUPATELI
ACTIVE AFTER UPDATE POSITION 0 AS
BEGIN
IF (OLD.KOD_POKUP <> NEW.KOD_POKUP) THEN
UPDATE RASXOD
SET KOD_POKUP=NEW.KOD_POKUP
WHERE KOD_POKUP = OLD.KOD_POKUP;
END
^
CREATE TRIGGER AD_POKUPATELI FOR POKUPATELI
ACTIVE AFTER DELETE POSITION 0 AS
BEGIN
DELETE FROM RASXOD
WHERE RASXOD.KOD_POKUP = POKUPATELI.KOD_POKUP;
END
^
CREATE TRIGGER AI_RASXOD1 FOR RASXOD
ACTIVE AFTER INSERT POSITION 1 AS
BEGIN
UPDATE TOVARY
SET COUNT_TOV= COUNT_TOV-NEW.KOLVO
WHERE KOD_TOVAR = NEW.KOD_TOVAR;
END
^
CREATE TRIGGER AU_RASXOD1 FOR RASXOD
ACTIVE AFTER UPDATE POSITION 1 AS
BEGIN
IF ((OLD.KOLVO <> NEW.KOLVO) AND
(OLD.KOD_TOVAR = NEW.KOD_TOVAR)) THEN
UPDATE TOVARY
SET COUNT_TOV= COUNT_TOV+OLD.KOLVO-NEW.KOLVO
WHERE KOD_TOVAR = OLD.KOD_TOVAR;
END
^ CREATE TRIGGER BD_RASXOD1 FOR RASXOD
ACTIVE BEFORE DELETE POSITION 0 AS
BEGIN
UPDATE TOVARY
SET COUNT_TOV= COUNT_TOV+RASXOD.KOLVO
WHERE KOD_TOVAR = RASXOD.KOD_TOVAR;
END
^
CREATE TRIGGER AU_RASXOD0 FOR RASXOD
ACTIVE AFTER UPDATE POSITION 0 AS
DECLARE VARIABLE OldKod INTEGER;
BEGIN
IF (OLD.KOD_TOVAR <> NEW.KOD_TOVAR) THEN
BEGIN OldKod = NULL;
SELECT KOD_TOVAR FROM TOVARY
WHERE KOD_TOVAR = OLD.KOD_TOVAR
INTO :OldKod;
IF (OldKod IS NOT NULL) THEN
BEGIN
UPDATE TOVARY
SET COUNT_TOV= COUNT_TOV+OLD.KOLVO
WHERE KOD_TOVAR = OLD.KOD_TOVAR;
UPDATE TOVARY
SET COUNT_TOV= COUNT_TOV-NEW.KOLVO
WHERE KOD_TOVAR = NEW.KOD_TOVAR;
END
END
END
^
COMMIT WORK ^
SET TERM ; ^
/* Grant permissions for this database */
При завершении работы в WINDOWS IB_CONSOLE необходимо зафиксировать изменения в базе данных, выбрав пункт меню «TRANSACTION > COMMIT». Выбор пункта меню TRANSACTION > ROLLBACK» приведет к отказу от всех изменений, произведенных в текущем сеансе работы (после последнего COMMIT).
Заполнение данных в таблице может быть выполнено в двух режимах:
1. Заполнение записей таблицы в интерактивном режиме с использованием средств IB CONSOLE. Для этого необходимо вызвать на экран интерактивное окно свойств соответствующей таблицы и, щелкнув на вкладке Data, начать набор данных. При вводе данных отрабатывают все триггера, определенные в базе данных.
2. Другим вариантом заполнения таблицы является использование операторов языка SQL. Для этого (используя любой редактор текстов, например WordPad) подготовим SQL-программу (SQL-Script) (см. файл ..\TBLOAD.SQL) и выполним ее в окне Interactive SQL (пункт меню Qwery > LOAD Script).
По
Ниже приведен протокол работы этой программы:
SET NAMES WIN1251;
CONNECT 'SKLAD\Ib_sklad.gdb'
USER 'SYSDBA' PASSWORD 'masterkey';
DELETE FROM RASXOD;
DELETE FROM POKUPATELI;
DELETE FROM TOVARY;
SELECT * FROM POKUPATELI;
INSERT INTO POKUPATELI (KOD_POKUP,POKUP,GOROD,ADRES,TEL)
VALUES (1,'Алиса','Казань','ул.Латышских стрелков','92-45-67');
INSERT INTO POKUPATELI (KOD_POKUP,POKUP,GOROD,ADRES,TEL)
VALUES (2,'Буратино','Рим','Италия','23-45-35');
INSERT INTO POKUPATELI (KOD_POKUP,POKUP,GOROD,ADRES,TEL)
VALUES (5,'Тротилла','Пруд','Италия',NULL);
INSERT INTO POKUPATELI (KOD_POKUP,POKUP,GOROD,ADRES,TEL)
VALUES (6,'Шекспир','Лондон','Англия',NULL);
SELECT * FROM POKUPATELI;
KOD_POKUP POKUP GOROD ADRES TEL
=========== ============================== ==================== ========================= ========
1 Алиса Казань ул.Латышских стрелков 92-45-67
2 Буратино Рим Италия 23-45-35
5 Тротилла Пруд Италия <null>
6 Шекспир Лондон Англия <null>
SELECT * FROM TOVARY;
INSERT INTO TOVARY (KOD_TOVAR,TOVAR,ED_IZM,ZENA,COUNT_TOV)
VALUES (1,'Сахар','кг',12,1442);
INSERT INTO TOVARY (KOD_TOVAR,TOVAR,ED_IZM,ZENA,COUNT_TOV)
VALUES (2,'Макароны','кг',5,86);
INSERT INTO TOVARY (KOD_TOVAR,TOVAR,ED_IZM,ZENA,COUNT_TOV)
VALUES (3,'Огурцы весовые','кг',6,250);
INSERT INTO TOVARY (KOD_TOVAR,TOVAR,ED_IZM,ZENA,COUNT_TOV)
VALUES (4,'Огурцы баночные','банки',10,475);
INSERT INTO TOVARY (KOD_TOVAR,TOVAR,ED_IZM,ZENA,COUNT_TOV)
VALUES (5,'Крупа манная','кг',8,1010);
INSERT INTO TOVARY (KOD_TOVAR,TOVAR,ED_IZM,ZENA,COUNT_TOV)
VALUES (2,'Масло подсолнечное','л',10,1977);
Statement failed, SQLCODE = -803