Встановлення умов цілостності даних.Створення тригерів. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Встановлення умов цілостності даних.Створення тригерів.



Таблиця FACULT містить довідник факультетів. На факультет може посилатися запис з таблиці SPECIALIT за допомогою зовнішнього ключа LFACULT. Очевидно, що не можна видаляти факультет, поки на нього посилається хоча б одна спеціальність. Для того, щоб проконтролювати видалення запису з таблиці FACULT, створений тригер FACULT_BD_01:

CREATE TRIGGER FACULT_BD_01 FOR FACULT BEFORE DELETE POSITION 1 AS

DECLARE VARIABLE LCNT INTEGER;

BEGIN

SELECT COUNT(S.PRKEY)

FROM SPECIALIT S

WHERE S.LFACULT=OLD.PRKEY

INTO:LCNT;

IF(LCNT>0)THEN EXCEPTION HASLINKS;

DELETE FROM FACULTREGID

WHERE LFACULT=OLD.PRKEY;

END

При наявності посилання з таблиці SPECIALIT на запис таблиці FACULT, що видаляється, буде викликана виняткова ситуація і видалення запису буде заборонено.

Таблиця SPECIALIT містить довідник спеціальностей. На цю таблицю за допомогою зовнішнього ключа посилаються записи таблиці ENTRANT. Тригер SPECIALIT_BD_01 заборонить видалення запису з таблиці SPECIALIT якщо є абітурієнти, що подали заяву на спеціальність, що видаляється.

CREATE TRIGGER SPECIALIT_BD_01 FOR SPECIALIT BEFORE DELETE POSITION 1 AS

DECLARE VARIABLE LCNT INTEGER;

BEGIN

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=OLD.PRKEY

INTO:LCNT;

IF(LCNT>0)THEN EXCEPTION HASLINKS;

END

Аналогічна перевірка необхідна при видаленні записів з таблиць TOWN, FORLANG і EDINST. Нижче описані тригери, що контролюють видалення записів з цих таблиць:

CREATE TRIGGER TOWN_BD_01 FOR TOWN BEFORE DELETE POSITION 1 AS

DECLARE VARIABLE LCNT INTEGER;

BEGIN

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LTOWN=OLD.PRKEY

INTO:LCNT;

IF(LCNT>0)THEN EXCEPTION HASLINKS;

END


CREATE TRIGGER FORLANG_BD_01 FOR FORLANG BEFORE DELETE POSITION 1 AS

DECLARE VARIABLE LCNT INTEGER;

BEGIN

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LFORLANG=OLD.PRKEY

INTO:LCNT;

IF(LCNT>0)THEN EXCEPTION HASLINKS;

END


CREATE TRIGGER EDINST_BD_01 FOR EDINST BEFORE DELETE POSITION 1 AS

DECLARE VARIABLE LCNT INTEGER;

BEGIN

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LEDINST=OLD.PRKEY

INTO:LCNT;

IF(LCNT>0)THEN EXCEPTION HASLINKS;

END

 

Зв'язок між таблицями ENTRANT і PRIVIL є найбільш складний. Тому що для зв'язку абітурієнтів з пільгами необхідний зв'язок “багато – до – багатьох”, створена додаткова таблиця ENTRANTPRIVIL. Ця таблиця містить два зовнішніх ключі LENTRANT і LPRIVIL, за допомогою яких вона посилається на таблиці ENTRANT і PRIVIL. Цим забезпечується можливість одному абітурієнту користатися декількома пільгами одночасно.

При видаленні запису з таблиці PRIVIL тригер PRIVIL_BD_01 перевіряє використання абітурієнтами пільги, що видаляється,. Якщо існують абітурієнти, що користаються цією пільгою, то видалення скасовується.


CREATE TRIGGER PRIVIL_BD_01 FOR PRIVIL BEFORE DELETE POSITION 1 AS

DECLARE VARIABLE LCNT INTEGER;

BEGIN

SELECT COUNT(E.PRKEY)

FROM ENTRANTPRIVIL E

WHERE E.LPRIVIL=OLD.PRKEY

INTO:LCNT;

IF(LCNT>0)THEN EXCEPTION HASLINKS;

END

 

При видаленні запису з таблиці ENTRANT необхідно видалити записи з таблиці ENTRANTPRIVIL, що відповідали за зв'язок пільг з абітурієнтом, що видаляється. Для цього використовується тригер ENTRANT_BD_01:


CREATE TRIGGER ENTRANT_BD_01 FOR ENTRANT BEFORE DELETE POSITION 1 AS

BEGIN

DELETE FROM ENTRANTPRIVIL

WHERE LENTRANT=OLD.PRKEY;

END

ПРОГРАМНА ЧАСТИНА

3.1 Створення збережених процедур

 

Збережені процедури являють собою фрагменти коду, що виконуються на сервері серверними процесами. Ці програми можуть запускатися з додатку, правилами перевірки цілісності даних або тригерами.

Перевага збережених процедур заключається в тому, що вони виконуються на сервері в середовищі SQL Server. На перший погляд ця перевага може показатися недостатньо очевидною, але насправді вона складає саму суть моделі клієнт/сервер. Оскільки базами даних управляє SQL-сервер, то доцільно виконувати збережені процедури саме на сервері.

Збережені процедури можуть повертати деяку величину, модифікувати і перевіряти введені користувачем значення на відповідність заздалегідь заданим умовам, встановленим для вашої інформаційної системи. У збережену процедуру можна передавати значення. У той же час вона може повертати значення, які не обов'язково беруться безпосередньо з таблиці, а навпаки, обчислюються в ході виконання самої процедури.

Процедура NAME_CONTAINING використовується для фільтрації строкових даних при вибірці з таблиць-довідників. Процедура має 2 параметри. Перший параметр – вихідне значення рядка. Другий – значення фільтра. Якщо другий параметр є субрядком першого, незалежно від регістра, то процедура поверне перший параметр. У противному випадку результатом буде рядок 'ERROR'. Нижче приводиться текст збереженої процедури:


CREATE PROCEDURE NAME_CONTAINING (

IN_LNAM VARCHAR(255),

MASK VARCHAR(255)

) RETURNS (

OUT_LNAM VARCHAR(255)

) AS

BEGIN

IF ((IN_LNAM COLLATE PXW_CYRL) CONTAINING MASK) THEN OUT_LNAM=IN_LNAM;

ELSE OUT_LNAM='ERROR';

SUSPEND;

END

 

Процедура ENTRANTREPORT2_SELECT використовується для одержаня звіту «Сводка про хід подачі заяв»:


CREATE PROCEDURE ENTRANTREPORT2_SELECT RETURNS (

ORT INTEGER,

OFPRKEY INTEGER,

OFNAM VARCHAR(50),

OSPRKEY INTEGER,

OSNAM VARCHAR(50),

OPLAN INTEGER,

OTEACHFORMD INTEGER,

OTEACHFORMW INTEGER,

OJOINED INTEGER,

OPAYED INTEGER,

OENTERED INTEGER

) AS

DECLARE VARIABLE LPLANGOV INTEGER;

DECLARE VARIABLE LPLANEC INTEGER;

DECLARE VARIABLE LPLAN INTEGER;

DECLARE VARIABLE LJOINED INTEGER;

DECLARE VARIABLE LPAYED INTEGER;

DECLARE VARIABLE LENTERED INTEGER;

DECLARE VARIABLE LTEACHFORMD INTEGER;

DECLARE VARIABLE LTEACHFORMW INTEGER;

BEGIN

FOR SELECT F.PRKEY,F.LNAM

FROM FACULT F

ORDER BY F.LNAM

INTO:OFPRKEY,:OFNAM

DO

BEGIN

ORT=1;

OPLAN=NULL;

OJOINED=NULL;

OPAYED=NULL;

OENTERED=NULL;

SUSPEND;

LPLAN=0;

LJOINED=0;

LPAYED=0;

LENTERED=0;

LTEACHFORMD=0;

LTEACHFORMW=0;

ORT=2;

FOR SELECT S.PRKEY,S.LNAM,S.PLANGOV,S.PLANEC

FROM SPECIALIT S

WHERE S.LFACULT=:OFPRKEY

ORDER BY S.LNAM

INTO:OSPRKEY,:OSNAM,:LPLANGOV,:LPLANEC

DO

BEGIN

OPLAN=0;

IF(LPLANGOV>0)THEN OPLAN=OPLAN+LPLANGOV;

IF(LPLANEC>0)THEN OPLAN=OPLAN+LPLANEC;

OJOINED=0;

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=:OSPRKEY AND.GOTMONEY=0

INTO:OJOINED;

IF(OJOINED IS NULL)THEN OJOINED=0;

OPAYED=0;

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=:OSPRKEY AND E.PAYED=1

INTO:OPAYED;

IF(OPAYED IS NULL)THEN OPAYED=0;

OENTERED=0;

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=:OSPRKEY AND E.ENTERED=1

INTO:OENTERED;

IF(OENTERED IS NULL)THEN OENTERED=0;

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=:OSPRKEY AND E.TEACHFORM=1

INTO:OTEACHFORMD;

IF(OTEACHFORMD IS NULL)THEN OTEACHFORMD=0;

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=:OSPRKEY AND E.TEACHFORM=2

INTO:OTEACHFORMW;

IF(OTEACHFORMW IS NULL)THEN OTEACHFORMW=0;

LPLAN=LPLAN+OPLAN;

LJOINED=LJOINED+OJOINED;

LPAYED=LPAYED+OPAYED;

LENTERED=LENTERED+OENTERED;

LTEACHFORMD=LTEACHFORMD+OTEACHFORMD;

LTEACHFORMW=LTEACHFORMW+OTEACHFORMW;

SUSPEND;

END

ORT=3;

OPLAN=LPLAN;

OJOINED=LJOINED;

OPAYED=LPAYED;

OENTERED=LENTERED;

OTEACHFORMD=LTEACHFORMD;

OTEACHFORMW=LTEACHFORMW;

SUSPEND;

END

END

 

Процедура FACULTREGID_GET_ID необхідна для генерації реєстраційного номера, унікального в межах факультету. Вона повертає реєстраційний номер і виділяє наступний реєстраційний номер.


CREATE PROCEDURE FACULTREGID_GET_ID (

ILFACULT INTEGER

) RETURNS (

OREGID INTEGER

) AS

DECLARE VARIABLE LCNT INTEGER;

DECLARE VARIABLE LREGID INTEGER;

BEGIN

SELECT MIN(F.REGID)

FROM FACULTREGID F

WHERE F.LFACULT=:ILFACULT

INTO:OREGID;

IF(OREGID IS NULL)THEN

BEGIN

OREGID=1;

 

INSERT INTO FACULTREGID(PRKEY,LFACULT,REGID)

VALUES(GEN_ID(FACULTREGID_PRKEY_GEN,1),:ILFACULT,2);

END

ELSE

BEGIN

DELETE FROM FACULTREGID F

WHERE F.LFACULT=:ILFACULT AND F.REGID=:OREGID;

SELECT COUNT(F.PRKEY)

FROM FACULTREGID F

WHERE F.LFACULT=:ILFACULT AND F.REGID<>:OREGID

INTO:LCNT;

IF((LCNT=0)OR(LCNT IS NULL))THEN

BEGIN

LREGID=OREGID+1;

INSERT INTO FACULTREGID(PRKEY,LFACULT,REGID)

VALUES(GEN_ID(FACULTREGID_PRKEY_GEN,1),:ILFACULT,:LREGID);

END

END

SUSPEND;

END

 

Аналогічно збережена процедура FACULTREGID_FREE_ID використовується при видаленні абітурієнта. Процедура відзначає реєстраційний номер абітурієнта, що видаляється, як невикористовуваний. Цей реєстраційний номер одержить перший абітурієнт, що подає документи у ВНЗ. Нижче приведений код збереженої процедури:


CREATE PROCEDURE FACULTREGID_FREE_ID (

ILFACULT INTEGER,

IREGID INTEGER

) AS

BEGIN

INSERT INTO FACULTREGID(PRKEY,LFACULT,REGID)

VALUES(GEN_ID(FACULTREGID_PRKEY_GEN,1),:ILFACULT,:IREGID);

END

 

3.2 Розробка клієнтської частини додатку

Клієнтська частина додатку розроблена у програмному середовищі Delphi.

Користувач працює з додатком за допомогою меню та кнопок, які забезпечують швидкий доступ до функцій системи. Зовнішній вигляд головної форми додатку показан на малюнку 1:

Рисунок 1 – Головна форма додатку

Підменю вкладених елементів меню зображено на малюнку 2:

Рисунок 2 – Підменю вкладених елементів меню

 

При розробці інтерфейсу додатка були розроблені наступні форми:

FrmMainForm-головна форма додатка (Рисунок 2).

Unit dmDataStore - форма модуля даних

Рисунок 3.

Програмний код форми модуля даних наведен нижче. На формі розташовані компоненти TDatabase і TQuery. Компонент Tdatabase забезпечує зв’язок користувача з базою даних а компонент TQuery використується для формування динимичних запитів. З ціма компонентами працють всі інші форми додатку, крім того вони мають кожна свої компоненти для роботи з таблицями та полями бази даних.

FrmVocsProto-форма - абстрактний клас, від якого успадковуються всі довідники.

Рисунок 4 – Вид форми FrmVocsProto на першій сторінці на етапі проектування

 

Рисунок 5 – Вид форми FrmVocsProto на другій сторінці на етапі проектування

Дана форма являє собою шаблон, за яким розроблені усі форми, які працюють з довідниками. На формі розташовані дві сторінки, перша для відображення усіх записів таблиці – довідника, друга для детального відображення усіх полей вибраного на першій сторінки запису. Під час роботи з першою сторінкою за допомогою кнопки F1 – Справка можно доступитися к пунктам вспливаючого меню, яке дозволяє вибрати команди для додавання нового запису, видалення та редагування вибраного запису. Після вибору необхідної команди, автоматично виникає друга вкладка, за допомогою якої виконуються усі дії, які підтверджуються або відменяються. Види форми на етапі розробці показані на малюнках 4 та 5.

FrmVocsEntrant-довідник абітурієнтів. Ця форма на першій сторінці відображає інформацію про всіх абітурієнтів що надали заяви до вступу в ВНЗ (рисунок 6). При виборі потрібної команди із випливаючого меню виникає друга сторінка з детальною інформацією про вибраного абітурієнта. Вид форми на другій сторінці на етапі проектування показан на малюнке 7.

Рисунок 6 – Вид форми FrmVocsEntrant на другій сторінці на етапі виконання.

 

Рисунок 7– Вид форми FrmVocsEntrant на другій сторінці на етапі проектування.

 

FrmVocsFacult-довідник факультетів.

FrmVocsSpecialit-довідник спеціальностей.

Рисунок 8 – Вид форми FrmVocsSpecialit на першій сторінці на етапі проектування.

 

Рисунок 9 – Вид форми FrmVocsSpecialit на другій сторінці на етапі проектування.

 

FrmVocsEdInst-довідник типів навчальних закладів.

FrmVocsForLang-довідник іноземних мов.

FrmVocsPrivil-довідник пільг.

FrmVocsEntrantPrivil-форма вибору пільг для абітурієнта.

FrmVocsTown-довідник міст.

QrepEntrantReport2-звіт «Сводка про хід подачі заяв».

(рисунок 10).

QrepEntrantsEntered-звіт «Список до зарахування».

QrepAccessConfirmedReport-звіт «Протокол про допуск до здачі іспитів».

Рисунок 10 – Вид форми на друк

Форми frmSelectParams1..6 і qrepSelectParams1..6 використовуються для вказівки параметрів вибірок і друку/перегляду (малюнки 11 і 12).

.

Рисунок 11 – Вікно вибору параметрів форми

 

Рисунок 12 – Вікно вибору параметрів форми

 

Сервісні функції додатка

При роботі з додатком виконується контроль і обмеження вхідних даних. Цей контроль виконується як засобами Interbase-сервера так і за допомогою компонентів Delphi.

Виклик довідників виконується за допомогою стандартних кнопок, розташованих на головній формі додатку. У кожнім довіднику для швидкого пошуку його елементів можна накладати фільтр. Завдання фільтра вибору даних здійснюється за допомогою клавіш CTRL+F.

За допомогою меню «Виборки» користувач може одержати різноманітні дані про хід роботи приймальної комісії.

За допомогою меню «Отчеты» формуються і друкуються основні звіти для керівників приймальної комісії.

За допомогою меню «Очистка» можна швидко і просто підготувати систему до нового сезону прийому абітурієнтів.

Меню «Помощь» дозволяє одержати додаткову інформацію про програму.

 

4 ОРГАНІЗАЦІЯ ЗАПУСКУ ДОДАТКА

 

Перед запуском додатка необхідно настроїти BDE. Для цього варто запустити додаток “BDE Administrator” або “Real SQLExplorer”. Потім створимо аліас ABITYRIENT і вкажемо наступні параметри:

Database Driver Name Interbase

SERVER NAME Шлях до файлу бази даних

 

4.1 Інсталяція додатка

Для інсталяції додатка необхідно скопіювати файл Abityrient.exe з дискети на твердий диск і створити ярлик на робочому столі на цей файл, для зручного і швидкого запуску додатка.

 

4.2 Запуск і закриття встановленого додатка

Запуск додатка здійснюється за допомогою ярлика на робочому столі.

Для виходу з додатка варто натиснути ALT+F4 чи мишею натиснути на хрестик у правому верхньому куті головного вікна програми.

 

ВИСНОВКИ

 

Розроблена система одержала зручний інтерфейс, що дозволяє швидко і легко виконувати необхідні користувачу дії. Система дозволяє роздруковувати звіти і вибірки, вести повний електронний облік роботи приймальної комісії.

 


Скрипт – файл створення бази даних та ії об’єктів

 

CREATE DATABASE "D:\Abit\ABITYRIENT.GDB"

USER 'SYSDBA' PASSWORD 'masterkey'

PAGE_SIZE 1024 DEFAULT CHARACTER SET WIN1251;

 

CREATE TABLE FACULT(

PRKEY INTEGER NOT NULL,

SNAM VARCHAR(10) CHARACTER SET WIN1251,

LNAM VARCHAR(50) CHARACTER SET WIN1251,

CONSTRAINT FACULT_PK1 PRIMARY KEY (PRKEY));

CREATE TABLE SPECIALIT(

PRKEY INTEGER NOT NULL,

LFACULT INTEGER,

TEACHFORMD INTEGER,

TEACHFORMW INTEGER,

CIPHER VARCHAR(10) CHARACTER SET WIN1251,

LNAM VARCHAR(50) CHARACTER SET WIN1251,

PLANGOV INTEGER,

PLANEC INTEGER,

CONSTRAINT SPECIALIT_PK1 PRIMARY KEY (PRKEY));

 

CREATE TABLE TOWN(

PRKEY INTEGER NOT NULL,

LNAM VARCHAR(20) CHARACTER SET WIN1251,

CONSTRAINT TOWN_PK1 PRIMARY KEY (PRKEY));

 

CREATE TABLE FORLANG(

PRKEY INTEGER NOT NULL,

LNAM VARCHAR(20) CHARACTER SET WIN1251,

 

CONSTRAINT FORLANG_PK1 PRIMARY KEY (PRKEY));

CREATE TABLE EDINST(

PRKEY INTEGER NOT NULL,

LNAM VARCHAR(20) CHARACTER SET WIN1251,

CONSTRAINT EDINST_PK1 PRIMARY KEY (PRKEY));

 

CREATE TABLE PRIVIL(

PRKEY INTEGER NOT NULL,

LNAM VARCHAR(20) CHARACTER SET WIN1251,

CONSTRAINT PRIVIL_PK1 PRIMARY KEY (PRKEY));

 

CREATE TABLE ENTRANT(

PRKEY INTEGER NOT NULL,

REGID INTEGER,

FIO VARCHAR(50) CHARACTER SET WIN1251,

LSPECIALIT INTEGER,

TEACHFORM INTEGER,

BIRTHDAT DATE,

SEX INTEGER,

LTOWN INTEGER,

ADDRESS VARCHAR(50) CHARACTER SET WIN1251,

PHONE VARCHAR(15) CHARACTER SET WIN1251,

ITN VARCHAR(15) CHARACTER SET WIN1251,

JOINDAT DATE,

GOTMONEY INTEGER,

ENTERED INTEGER,

PAYED INTEGER,

MUSTPAY INTEGER,

WANTFREE INTEGER,

MARK1 INTEGER,

 

MARK2 INTEGER,

MARK3 INTEGER,

MARKT INTEGER,

LEDINST INTEGER,

EDINSTNAM VARCHAR(50) CHARACTER SET WIN1251,

EDINSTFINDAT DATE,

AVRMRK NUMERIC(15,1),

LFORLANG INTEGER,

CAT INTEGER,

ADDDATA BLOB SUB_TYPE 0 SEGMENT SIZE 80,

CONSTRAINT ENTRANT_PK1 PRIMARY KEY (PRKEY));

 

CREATE TABLE FACULTREGID(

PRKEY INTEGER NOT NULL,

LFACULT INTEGER,

REGID INTEGER,

CONSTRAINT FACULTREGID_PK1 PRIMARY KEY (PRKEY));

 

CREATE TABLE ENTRANTPRIVIL(

PRKEY INTEGER NOT NULL,

LENTRANT INTEGER,

LPRIVIL INTEGER,

CONSTRAINT ENTRANTPRIVIL_PK1 PRIMARY KEY (PRKEY));

 

CREATE GENERATOR FACULT_PRKEY_GEN;

SET GENERATOR FACULT_PRKEY_GEN TO 10000;

 

CREATE GENERATOR SPECIALIT_PRKEY_GEN;

SET GENERATOR SPECIALIT_PRKEY_GEN TO 10000;

 

CREATE GENERATOR TOWN_PRKEY_GEN;

SET GENERATOR TOWN_PRKEY_GEN TO 10000;

 

CREATE GENERATOR FORLANG_PRKEY_GEN;

SET GENERATOR FORLANG_PRKEY_GEN TO 10000;

 

CREATE GENERATOR EDINST_PRKEY_GEN;

SET GENERATOR EDINST_PRKEY_GEN TO 10000;

 

CREATE GENERATOR ENTRANT_PRKEY_GEN;

SET GENERATOR ENTRANT_PRKEY_GEN TO 10000;

 

CREATE GENERATOR FACULTREGID_PRKEY_GEN;

SET GENERATOR FACULTREGID_PRKEY_GEN TO 10000;

 

CREATE GENERATOR PRIVIL_PRKEY_GEN;

SET GENERATOR PRIVIL_PRKEY_GEN TO 10000;

 

CREATE GENERATOR ENTRANTPRIVIL_PRKEY_GEN;

SET GENERATOR ENTRANTPRIVIL_PRKEY_GEN TO 10000;

 

CREATE INDEX SPECIALIT_I_LFACULT ON SPECIALIT(LFACULT);

CREATE INDEX ENTRANT_I_LSPECIALIT ON ENTRANT(LSPECIALIT);

CREATE INDEX ENTRANT_I_LTOWN ON ENTRANT(LTOWN);

CREATE INDEX ENTRANT_I_LEDINST ON ENTRANT(LEDINST);

CREATE INDEX FACULTREGID_I_LFACULTREGID ON FACULTREGID(LFACULT,REGID);

CREATE INDEX ENTRANTPRIVIL_I_LEP ON ENTRANTPRIVIL(LENTRANT,LPRIVIL);

 

 

/* Exceptions */

CREATE EXCEPTION HASLINKS "На элемент существуют ссылки! Удаление

элемента невозможно!";

COMMIT WORK;

SET AUTODDL OFF;

SET TERM ^;

 

/* Stored procedures */

CREATE PROCEDURE NAME_CONTAINING AS BEGIN EXIT; END ^

CREATE PROCEDURE FACULTREGID_GET_ID AS BEGIN EXIT; END ^

CREATE PROCEDURE FACULTREGID_FREE_ID AS BEGIN EXIT; END ^

CREATE PROCEDURE ENTRANTREPORT_SELECT AS BEGIN EXIT; END ^

CREATE PROCEDURE ENTRANTREPORT2_SELECT AS BEGIN EXIT; END ^

 

ALTER PROCEDURE NAME_CONTAINING (

IN_LNAM VARCHAR(255),

MASK VARCHAR(255)

) RETURNS (

OUT_LNAM VARCHAR(255)

) AS

BEGIN

IF ((IN_LNAM COLLATE PXW_CYRL) CONTAINING MASK) THEN OUT_LNAM=IN_LNAM;

ELSE OUT_LNAM='ERROR';

SUSPEND;

END

^

ALTER PROCEDURE FACULTREGID_GET_ID(

ILFACULT INTEGER

)RETURNS(

 

OREGID INTEGER

)AS

DECLARE VARIABLE LCNT INTEGER;

DECLARE VARIABLE LREGID INTEGER;

BEGIN

SELECT MIN(F.REGID)

FROM FACULTREGID F

WHERE F.LFACULT=:ILFACULT

INTO:OREGID;

IF(OREGID IS NULL)THEN

BEGIN

OREGID=1;

INSERT INTO FACULTREGID(PRKEY,LFACULT,REGID)

VALUES(GEN_ID(FACULTREGID_PRKEY_GEN,1),:ILFACULT,2);

END

ELSE

BEGIN

DELETE FROM FACULTREGID F

WHERE F.LFACULT=:ILFACULT AND F.REGID=:OREGID;

SELECT COUNT(F.PRKEY)

FROM FACULTREGID F

WHERE F.LFACULT=:ILFACULT AND F.REGID<>:OREGID

INTO:LCNT;

IF((LCNT=0)OR(LCNT IS NULL))THEN

BEGIN

LREGID=OREGID+1;

INSERT INTO FACULTREGID(PRKEY,LFACULT,REGID)

VALUES(GEN_ID(FACULTREGID_PRKEY_GEN,1),:ILFACULT,:LREGID);

END

END

 

SUSPEND;

END

^

ALTER PROCEDURE FACULTREGID_FREE_ID(

ILFACULT INTEGER,

IREGID INTEGER

)AS

BEGIN

INSERT INTO FACULTREGID(PRKEY,LFACULT,REGID)

VALUES(GEN_ID(FACULTREGID_PRKEY_GEN,1),:ILFACULT,:IREGID);

END

^

 

ALTER PROCEDURE ENTRANTREPORT_SELECT

RETURNS(

ORT INTEGER,

OFPRKEY INTEGER,

OFNAM VARCHAR(50),

OSPRKEY INTEGER,

OSNAM VARCHAR(50),

OPLAN INTEGER,

OJOINED INTEGER,

OPAYED INTEGER,

OENTERED INTEGER

)AS

DECLARE VARIABLE LPLANGOV INTEGER;

DECLARE VARIABLE LPLANEC INTEGER;

DECLARE VARIABLE LPLAN INTEGER;

DECLARE VARIABLE LJOINED INTEGER;

DECLARE VARIABLE LPAYED INTEGER;

 

DECLARE VARIABLE LENTERED INTEGER;

BEGIN

FOR SELECT F.PRKEY,F.LNAM

FROM FACULT F

ORDER BY F.LNAM

INTO:OFPRKEY,:OFNAM

DO

BEGIN

ORT=1;

OPLAN=NULL;

OJOINED=NULL;

OPAYED=NULL;

OENTERED=NULL;

SUSPEND;

LPLAN=0;

LJOINED=0;

LPAYED=0;

LENTERED=0;

ORT=2;

FOR SELECT S.PRKEY,S.LNAM,S.PLANGOV,S.PLANEC

FROM SPECIALIT S

WHERE S.LFACULT=:OFPRKEY

ORDER BY S.LNAM

INTO:OSPRKEY,:OSNAM,:LPLANGOV,:LPLANEC

DO

BEGIN

OPLAN=0;

IF(LPLANGOV>0)THEN OPLAN=OPLAN+LPLANGOV;

IF(LPLANEC>0)THEN OPLAN=OPLAN+LPLANEC;

OJOINED=0;

 

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=:OSPRKEY AND E.GOTMONEY=0

INTO:OJOINED;

IF(OJOINED IS NULL)THEN OJOINED=0;

OPAYED=0;

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=:OSPRKEY AND E.PAYED=1

INTO:OPAYED;

IF(OPAYED IS NULL)THEN OPAYED=0;

OENTERED=0;

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=:OSPRKEY AND E.ENTERED=1

INTO:OENTERED;

IF(OENTERED IS NULL)THEN OENTERED=0;

LPLAN=LPLAN+OPLAN;

LJOINED=LJOINED+OJOINED;

LPAYED=LPAYED+OPAYED;

LENTERED=LENTERED+OENTERED;

SUSPEND;

END

ORT=3;

OPLAN=LPLAN;

OJOINED=LJOINED;

OPAYED=LPAYED;

OENTERED=LENTERED;

SUSPEND;

END

 

END

^

ALTER PROCEDURE ENTRANTREPORT2_SELECT

RETURNS(

ORT INTEGER,

OFPRKEY INTEGER,

OFNAM VARCHAR(50),

OSPRKEY INTEGER,

OSNAM VARCHAR(50),

OPLAN INTEGER,

OTEACHFORMD INTEGER,

OTEACHFORMW INTEGER,

OJOINED INTEGER,

OPAYED INTEGER,

OENTERED INTEGER

)AS

DECLARE VARIABLE LPLANGOV INTEGER;

DECLARE VARIABLE LPLANEC INTEGER;

DECLARE VARIABLE LPLAN INTEGER;

DECLARE VARIABLE LJOINED INTEGER;

DECLARE VARIABLE LPAYED INTEGER;

DECLARE VARIABLE LENTERED INTEGER;

DECLARE VARIABLE LTEACHFORMD INTEGER;

DECLARE VARIABLE LTEACHFORMW INTEGER;

BEGIN

FOR SELECT F.PRKEY,F.LNAM

FROM FACULT F

ORDER BY F.LNAM

INTO:OFPRKEY,:OFNAM

DO

 

BEGIN

ORT=1;

OPLAN=NULL;

OJOINED=NULL;

OPAYED=NULL;

OENTERED=NULL;

SUSPEND;

LPLAN=0;

LJOINED=0;

LPAYED=0;

LENTERED=0;

LTEACHFORMD=0;

LTEACHFORMW=0;

ORT=2;

FOR SELECT S.PRKEY,S.LNAM,S.PLANGOV,S.PLANEC

FROM SPECIALIT S

WHERE S.LFACULT=:OFPRKEY

ORDER BY S.LNAM

INTO:OSPRKEY,:OSNAM,:LPLANGOV,:LPLANEC

DO

BEGIN

OPLAN=0;

IF(LPLANGOV>0)THEN OPLAN=OPLAN+LPLANGOV;

IF(LPLANEC>0)THEN OPLAN=OPLAN+LPLANEC;

OJOINED=0;

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=:OSPRKEY AND E.GOTMONEY=0

INTO:OJOINED;

IF(OJOINED IS NULL)THEN OJOINED=0;

 

OPAYED=0;

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=:OSPRKEY AND E.PAYED=1

INTO:OPAYED;

IF(OPAYED IS NULL)THEN OPAYED=0;

OENTERED=0;

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=:OSPRKEY AND E.ENTERED=1

INTO:OENTERED;

IF(OENTERED IS NULL)THEN OENTERED=0;

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=:OSPRKEY AND E.TEACHFORM=1

INTO:OTEACHFORMD;

IF(OTEACHFORMD IS NULL)THEN OTEACHFORMD=0;

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=:OSPRKEY AND E.TEACHFORM=2

INTO:OTEACHFORMW;

IF(OTEACHFORMW IS NULL)THEN OTEACHFORMW=0;

LPLAN=LPLAN+OPLAN;

LJOINED=LJOINED+OJOINED;

LPAYED=LPAYED+OPAYED;

LENTERED=LENTERED+OENTERED;

LTEACHFORMD=LTEACHFORMD+OTEACHFORMD;

LTEACHFORMW=LTEACHFORMW+OTEACHFORMW;

SUSPEND;

END

 

ORT=3;

OPLAN=LPLAN;

OJOINED=LJOINED;

OPAYED=LPAYED;

OENTERED=LENTERED;

OTEACHFORMD=LTEACHFORMD;

OTEACHFORMW=LTEACHFORMW;

SUSPEND;

END

END

^

 

SET TERM; ^

COMMIT WORK;

SET AUTODDL ON;

SET TERM ^;

 

/* Triggers only will work for SQL triggers */

 

CREATE TRIGGER FACULT_BD_01 FOR FACULT ACTIVE BEFORE DELETE POSITION 1

AS

DECLARE VARIABLE LCNT INTEGER;

BEGIN

SELECT COUNT(S.PRKEY)

FROM SPECIALIT S

WHERE S.LFACULT=OLD.PRKEY

INTO:LCNT;

IF(LCNT>0)THEN EXCEPTION HASLINKS;

DELETE FROM FACULTREGID

 

WHERE LFACULT=OLD.PRKEY;

END

^

CREATE TRIGGER SPECIALIT_BD_01 FOR SPECIALIT ACTIVE BEFORE DELETE POSITION 1

AS

DECLARE VARIABLE LCNT INTEGER;

BEGIN

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=OLD.PRKEY

INTO:LCNT;

IF(LCNT>0)THEN EXCEPTION HASLINKS;

END

^

CREATE TRIGGER TOWN_BD_01 FOR TOWN ACTIVE BEFORE DELETE POSITION 1

AS

DECLARE VARIABLE LCNT INTEGER;

BEGIN

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LTOWN=OLD.PRKEY

INTO:LCNT;

IF(LCNT>0)THEN EXCEPTION HASLINKS;

END

^

CREATE TRIGGER EDINST_BD_01 FOR EDINST ACTIVE BEFORE DELETE POSITION 1

AS

 

DECLARE VARIABLE LCNT INTEGER;

BEGIN

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LEDINST=OLD.PRKEY

INTO:LCNT;

IF(LCNT>0)THEN EXCEPTION HASLINKS;

END

^

CREATE TRIGGER FORLANG_BD_01 FOR FORLANG ACTIVE BEFORE DELETE POSITION 1

AS

DECLARE VARIABLE LCNT INTEGER;

BEGIN

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LFORLANG=OLD.PRKEY

INTO:LCNT;

IF(LCNT>0)THEN EXCEPTION HASLINKS;

END

^

 

CREATE TRIGGER PRIVIL_BD_01 FOR PRIVIL ACTIVE BEFORE DELETE POSITION 1

AS

DECLARE VARIABLE LCNT INTEGER;

BEGIN

SELECT COUNT(E.PRKEY)

FROM ENTRANTPRIVIL E

WHERE E.LPRIVIL=OLD.PRKEY

 

INTO:LCNT;

IF(LCNT>0)THEN EXCEPTION HASLINKS;

END

^

CREATE TRIGGER ENTRANT_BD_01 FOR ENTRANT ACTIVE BEFORE DELETE POSITION 1

AS

BEGIN

DELETE FROM ENTRANTPRIVIL

WHERE LENTRANT=OLD.PRKEY;

END

^

 

COMMIT WORK ^

SET TERM; ^



Поделиться:


Последнее изменение этой страницы: 2017-02-10; просмотров: 71; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.18.112.250 (0.433 с.)