Калужский филиал Государственного образовательного учреждения высшего профессионального образования «Московский государственный технический университет им. Н.Э.Баумана»
Кафедра ЭИУ 3-К «ЭИУК»
Методология проектирования баз данных
Расчётно-пояснительная записка к курсовой работе
по курсу
Проектирование алгоритмов и программного обеспечения
г. Калуга
2007
Содержание
1. Детальная постановка задачи
2. Концептуальное проектирование
3. Логическое проектирование
4. Физическое проектирование.
5. Физическая реализация
Список используемой литературы
1. Детальная постановка задачи
Существует предприятие, занимающееся производством компонентов для систем кабельного и спутникового телевидения.
Предприятие состоит из нескольких подразделений, каждое из которых имеет свой номер и название и ФИО директора подразделения. Принципиальное значение для данной задачи имеет служба качества. В службе качества выделяется ведущий специалист, который является директором этой службы. Это единственный человек на предприятии, который имеет право формировать электронные документы, вносить в них изменения, удалять их. Все остальные работники (пользователи) независимо от принадлежности к тому или иному подразделению имеют право только просматривать электронные документы в режиме чтения. Все документы делятся на две категории:
нормативные документы системы менеджмента качества (СМК)
внутренние документы СМК
Перечень документов и форма их составления являются прерогативой директора службы качества.
Каждый документ имеет реквизиты: номер по классификатору, наименование, дату принятия, тематику, статус, дату изменения, характер изменений (если они были). Необходимо иметь ввиду, что каждому номеру документа по классификатору в категории нормативных документов физически может соответствовать несколько документов (формат ****.doc). Удаленные документы должны помещаться на хранение в электронный архив на неопределенный срок. Очищать этот архив может только директор службы качества.
Ведется протокол работы пользователей с обеими категориями документов, в котором отражается имя документа, к которому осуществлялся доступ, дата доступа, фамилия работника (имя пользователя).
Директор службы качества проводит в подразделениях внутренние проверки системы качества на предмет соответствия работы этих подразделений требованиям нормативной и внутренней документации СМК. Результаты проверок содержат следующие данные:
— проверяемое подразделение
— номер проверки
— дата проверки
— описание несоответствия
— вид несоответствия (значительное, незначительное)
Типовые операции:
— добавление документа
— редактирование документа
— описание внесенных изменений
— удаление документа (добавление в электронный архив)
— удаление документов из электронного архива
— добавление/удаление результатов внутренних проверок СМК
— подготовка отчета о результатах внутренних проверок СМК по форме:
Дата проверки
Наименование проверяемого подразделения
Описание несоответствия(если оно есть)
— подготовка отчета о работе пользователей с документами СМК по форме:
Дата
Наименование документа
Время
Фамилия
2. Концептуальное проектирование
Определение типов сущности:
— подразделение
— Директор службы качества
— работники
— электронный документ
— нормативный документ СМК1
— внутренний документ СМК
— протокол работы
— проверки СМК
Определение типов связи:
— Директор службы качества работает с электронными документами
— Электронные документы включают в себя нормативные документы СМК
— Электронные документы включают в себя внутренние документы СМК
— Документы учитываются в протоколе работы
— Директор службы качества проводит проверки подразделений
— Подразделения участвуют в проверках
— Работники фиксируются в протоколе работы
— Работники приписаны к подразделениям–PAGE_BREAK–
Таблица №1 Типы сущности
Наименование
Краткое описание
Синонимы
Особенности
Подразделение
Структурная единица предприятия
Отдел
Каждое подразделение возглавляется директором
Директор службы качества
Директор по качеству
Центральная фигура в данной постановке задачи
Работники
Общее наименование для всех работающих на предприятии
В данной постановке задачи – это все остальные кроме Директора по качеству
Электронный документ
Документ в электронном виде в формате ***.doc
Файл
Делятся на две категории
Нормативный документ СМК
Документы, отражающие общепринятые стандарты в СМК
Внутренний документ СМК
Документы, действующие внутри предприятия
Протокол работы
Информация о работе с документами
Статистика работы с документами
Обращение любого работника к любому документу должно отражаться в протоколе работы
Проверки СМК
Действие по выявлению несоответствий
Аудит
Только директор службы качества проверяет подразделения
Таблица №2 Типы связей
Тип сущности
Тип связи
Тип сущности
Кардинальность
Степень участия
Директор службы качества
Работает
Эл. документ
1: М
Т: Т
Работники
Приписаны к
Подразделения
М: 1
Т: Т
Работники
Фиксируются
Протокол работы
1: М
Р: Т
Электронные документы
Включают в себя
Нормативные документы СМК
М: N
Р: Т
Электронные документы
Включают в себя
Внутренние документы СМК
М: N
Р: Т
Электронные документы
Учитываются в
Протокол работы
1: М
P: Т
Директор службы качества
Проводит
Проверки
1: М
Т: Т
Подразделения
Участвуют в
Проверки
1: М
Т: Р
Таблица №3 Атрибуты
Тип сущности
(тип связи)
Атрибут
Описание
Тип данных
Значение по умолчанию
Допустимость NULL
Производные/
множественные
Подразделение продолжение
–PAGE_BREAK—-PAGE_BREAK—-PAGE_BREAK–
Изменения электронного документа,
нормативного, внутреннего
Текущая, или раньше текущей даты
Доступа в протоколе работы
текущая
Описание
Характера изменений электронного документа,
нормативного, внутреннего
Символьный(30)
Символьный(1000)
Изменены страницы 2,5,9
Несоответствий в проверках СМК
Описание процессов жизненного цикла продукции не соответствует требованиям нормативной документации, пункт 7.1
Тематика
электронного документа,
нормативного, внутреннего
Символьный (30)
Дирекция.
Планово – экономический отдел.
Статус
электронного документа,
нормативного, внутреннего
Символьный(10)
Изменен.
Удален.
На коррекцию.
Вид несоответствия
В проверках СМК
Символьный (15)
Значительное.
Незначительное.
Таблица №5 Ключи
Сущность
ПК
Альтернативный ключ
Подразделение
Номер
Название
Директор службы качества
Имя пользователя
Ф.И.О.
Работники
Имя пользователя
Ф.И.О.
Электронный документ
Наименование документа +
Номер по классификатору
Нормативный документ СМК
Внутренний документ СМК
Протокол работы
Дата-время
Проверки СМК
Номер проверки
Специализация / генерализация
Преобразуем сущность «электронный документ» в суперкласс. Подклассами будут являться «нормативный документ СМК», «внутренний документ СМК». Подклассы не пересекаются, участие суперкласса полное.
ER– модель
3. Логическое проектирование
Предполагается использование реляционной модели данных. Необходимо избавиться от структур концептуальной модели, не реализуемых в рамках реляционной модели.
Удаляем связь «Директор службы качества работает с электронными документами», т.к. эта связь является транзакцией.
Скорректированная ER-модель
Определение набора отношений
Объединим подклассы «нормативный документ СМК» и «внутренний документ СМК» в одно отношение «Электронный документ», т.к. все экземпляры сущностей обоих подклассов имеют одинаковые атрибуты. Также для этого отношения необходимо определить новый атрибут «вид документа» для того, чтобы идентифицировать, к какому подклассу относится документ.
1. Директор службы качества (Ф.И.О., имя пользователя, дата вступления в должность) ПК: имя пользователя
2. Проверки (№ проверки, дата, описание несоответствия, вид несоответствия, Ф.И.О., № подразделения)
ПК: № проверки
ВК: имя пользователя директора службы качества /> Директор службы качества
ВК: номер подразделения /> Подразделения продолжение
–PAGE_BREAK–
3. Подразделения (№ подразделения, название, Ф.И.О. директора подразделения) ПК: номер
4. Работники (Ф.И.О., имя пользователя, номер подразделения)
ПК: имя пользователя
ВК: номер /> Подразделения
5. Протокол работы (наименование документа, номер по классификатору, дата-время доступа, Ф.И.О., имя пользователя)
ПК: дата-время
ВК: наименование док-та + номер по классификатору /> Электронные документы
ВК: имя пользователя /> Работники
6. Электронные документы (наименование документа, номер по классификатору, дата принятия, дата изменения, тематика, статус, характер изменений, вид документа)
ПК: наименование док-та + номер по классификатору
Проверка отношений на соответствие требованиям нормализации:
2 НФ
1. Ф.И.О. /> дата вступления в должность
Ф.И.О. /> имя пользователя
имя пользователя /> Ф.И.О.
имя пользователя /> дата вступления в должность
2. № проверки /> дата проверки
№ проверки /> описание несоответствия
№ проверки /> вид несоответствия
3. № /> название подразделения
№ />Ф.И.О. директора подразделения
название подразделения /> №
название подразделения /> Ф.И.О. директора подразделения
4. Ф.И.О. /> имя пользователя
имя пользователя /> Ф.И.О.
5. собственный атрибут только один – «дата-время»
6. Наименование документа + номер по классификатору/> дата принятия
Наименование документа + номер по классификатору/> тематика
Наименование документа + номер по классификатору/> статус
Наименование документа + номер по классификатору/> характер изменений
Наименование документа + номер по классификатору/> дата изменения
3 НФ
Транзитивные зависимости отсутствуют, значит, отношения соответствуют 3НФ.
НФБК
В отношениях 1-5 ПК состоит из одного атрибута, а в отношении 6 отсутствуют несколько составных потенциальных ключей, пересекающихся по набору атрибутов. Следовательно, все отношения соответствуют НФБК, что гарантирует отсутствие проблем обновления.
Полученная ER-модель (стр. 15) позволяет реализовать все транзакции, изложенные в постановке задачи.
Требования, обеспечивающие ссылочную целостность
Для всех первичных ключей устанавливается значение NOT NULL.
Атрибуты, которые допускают NULL:
Отношение «Проверки»
Атрибуты: описание несоответствия, вид несоответствия
Отношение «Протокол работы»
Атрибуты, которые являются ВК: ФИО, Наименование документа + номер по классификатору
Отношение «Электронные документы»
Атрибуты: Дата изменения, статус, тематика, характер изменения
ДлявсехВК: ON UPDATE CASCADE ON DELETE NO ACTION
Кроме ВК в отношении «Протокол работы»:
ON UPDATE CASCADE ON DELETE CASCADE
Бизнес-правила:
Директор службы качества имеет полный доступ ко всей информации в БД, все остальные работники имеют ограниченный доступ, а именно, просмотр документов в режиме чтения.
4. Физическое проектирование
Директор службы качества
ФИО(*)
Имя пользователя
Дата вступления в должность
Проверки
№ проверки(*)
Дата
Описание несоответствия
Вид несоответствия
ФИО
№ подразделения
продолжение
–PAGE_BREAK–
Подразделения
Номер(*)
Названия
ФИО директора подразделения
Работники
Номер(*)
ФИО
Имя пользователя
№ подразделения
Протокол работы
Номер(*)
Дата-время доступа
№ работника
№ документа
Электронные документы
Вид документа
№ по классификатору
Наименование документа
Дата принятия
Дата изменения
Статус
Тематика
Характер изменения
№ документа
Архив удаленных документов
№ по классификатору
Наименование документа
Дата принятия
Дата удаления
Тематика
Характер изменения
Вид документа
Номер (*)
Создание вторичных индексов:
Таблица «Работники»: поле «Имя пользователя»
Таблица «Электронные документы»: поле («Наименование» + «№ по классификатору»)
Доступ:
Директор службы качества и администратор – полный доступ, а все остальные – просмотр документов в режиме чтения.
5. Физическая реализация
Серверная часть
/********************************************************/
/** Generated by IBExpert 2004.01.22 23.05.2004 20:38:17 ****/
/********************************************************/
SET SQL DIALECT 3;
SET NAMES WIN1251;
CREATE DATABASE ‘Document:C:\Program Files\Borland\InterBase\bin\ELECTRDOC.GDB’
USER ‘SYSDBA’ PASSWORD ‘administrator’
PAGE_SIZE 1024
DEFAULT CHARACTER SET WIN1251;
/*********************************************************/
/**** Generators ****/
/*********************************************************/
CREATE GENERATOR ARHIVN;
SET GENERATOR ARHIVN TO 16;
CREATE GENERATOR DOCN;
SET GENERATOR DOCN TO 17;
CREATE GENERATOR PODRAZDN;
SET GENERATOR PODRAZDN TO 4;
CREATE GENERATOR PROTOCOLN;
SET GENERATOR PROTOCOLN TO 52; продолжение
–PAGE_BREAK–
CREATE GENERATOR PROVERKIN;
SET GENERATOR PROVERKIN TO 13;
CREATE GENERATOR RABN;
SET GENERATOR RABN TO 19;
/*************************************************************//**** Exceptions****/
/******************************************************/
CREATE EXCEPTION NODELETE ‘Нельзяудалитьданногоработника’;
CREATE EXCEPTION NOLOGIN ‘Имя пользователя должно быть уникальным’;
SET TERM ^;
/************************************************************/
/**** Stored Procedures****/
/************************************************************/
CREATE PROCEDURE ADD_DOCUMENT(
NKLASS VARCHAR(7),
TEMA VARCHAR(30),
DATA DATE,
VID VARCHAR(15),
NAME VARCHAR(70))
AS
BEGIN
EXIT;
END^
CREATE PROCEDURE ADDDIRECTOR(
DATA DATE,
LOGIN VARCHAR(20),
FAMILY VARCHAR(20))
AS
BEGIN
EXIT;
END^
CREATE PROCEDURE ADDPODRAZDELENIE(
NAZV VARCHAR(70),
FIO VARCHAR(20))
AS
BEGIN
EXIT;
END^
CREATE PROCEDURE ADDPROTOCOL(
NUMDOC INTEGER)
AS
BEGIN
EXIT;
END^
CREATE PROCEDURE ADDPROVERKI(
NAZVPODR VARCHAR(70),
FIO VARCHAR(20),
OPISANIE VARCHAR(1000),
VID VARCHAR(15),
DATA DATE)
AS
BEGIN
EXIT;
END^
CREATE PROCEDURE CLEARARHIV
AS
BEGIN
EXIT;
END^
CREATE PROCEDURE CLEARPROTOCOL
AS
BEGIN
EXIT;
END^
CREATE PROCEDURE DELETEDIRECTOR(
FIO VARCHAR(20))
AS
BEGIN
EXIT;
END^
CREATE PROCEDURE DELETEDOC(
NUM INTEGER)
AS
BEGIN
EXIT;
END^
CREATE PROCEDURE DELETEPODRAZD(
NOMER INTEGER)
AS
BEGIN
EXIT;
END^
CREATE PROCEDURE DELETEPROVERKA(
NPROVERKI INTEGER)
AS
BEGIN
EXIT; продолжение
–PAGE_BREAK–
END^
CREATE PROCEDURE DELETERABOTNIK(
NUM INTEGER)
AS
BEGIN
EXIT;
END^
CREATE PROCEDURE EDITPROVERKI(
OPISANIE VARCHAR(1000),
NPROV INTEGER,
VID VARCHAR(15),
NAZVPODR VARCHAR(70),
FIO VARCHAR(20),
DATA DATE)
AS
BEGIN
EXIT;
END^
CREATE PROCEDURE NEW_PROCEDURE(
NAZV VARCHAR(70),
LOGIN VARCHAR(20),
FIO VARCHAR(20))
AS
BEGIN
EXIT;
END^
CREATE PROCEDURE UPDATEDOCUMENT(
IZMEN VARCHAR(30),
TEMA VARCHAR(30),
NUM INTEGER)
AS
BEGIN
EXIT;
END^
SET TERM; ^/****************************************************************/
/**** Tables ****/
/************************************************************/
CREATE TABLE ARHIVDOC (
NDOC INTEGER NOT NULL,
NKLASS VARCHAR(7) NOT NULL,
NAIMENDOC VARCHAR(70) NOT NULL,
VIDDOC VARCHAR(15) NOT NULL,
DATAPRINYATIYA DATE NOT NULL,
DATADELETE DATE NOT NULL,
TEMATIKA VARCHAR(30),
IZMENENIYA VARCHAR(30)
);
CREATE TABLE DIRECTOR (
FIO VARCHAR(20) NOT NULL,
LOGIN VARCHAR(20) NOT NULL,
DATAVSTUPLENIYA DATE NOT NULL
);
CREATE TABLE DOCUMENT (
NDOC INTEGER NOT NULL,
NKLASS VARCHAR(7) NOT NULL,
NAIMENDOC VARCHAR(70) NOT NULL,
VIDDOC VARCHAR(15) NOT NULL,
DATAPRINYATIYA DATE NOT NULL,
DATAIZMEN DATE,
STATUS VARCHAR(10),
TEMATIKA VARCHAR(30),
IZMENENIYA VARCHAR(30)
);
CREATE TABLE PODRAZD (
NPODR INTEGER NOT NULL,
FIOPODR VARCHAR(20) NOT NULL,
NAZVANIE VARCHAR(70) NOT NULL
);
CREATE TABLE PROTOCOL (
NUMBER INTEGER NOT NULL,
DATA DATE NOT NULL,
NRAB INTEGER,
NDOC INTEGER,
VREMYA TIME NOT NULL
);
CREATE TABLE PROVERKI (
NPROVERKI INTEGER NOT NULL,
DATA DATE NOT NULL,
FIO VARCHAR(20) NOT NULL,
NPODR INTEGER NOT NULL,
VID VARCHAR(15) ,
OPISANIE VARCHAR(1000)
);
CREATE TABLE RABOTNIK (
NUMBER INTEGER NOT NULL,
FIO VARCHAR(20) NOT NULL,
LOGIN VARCHAR(20) NOT NULL, продолжение
–PAGE_BREAK–
NPODR INTEGER NOT NULL);/**************************************************************/
/**** Unique Constraints ****/
/*********************************************************/
ALTER TABLE DOCUMENT ADD CONSTRAINT UNQ_DOCUMENT UNIQUE (NKLASS, NAIMENDOC);
ALTER TABLE RABOTNIK ADD CONSTRAINT UNQ_RAB UNIQUE (LOGIN);
/************************************************************/
/**** Primary Keys ****/
/************************************************************/
ALTER TABLE ARHIVDOC ADD CONSTRAINT PK_ARHIVDOC PRIMARY KEY (NDOC);
ALTER TABLE DIRECTOR ADD CONSTRAINT PK_DIRECTOR PRIMARY KEY (FIO);
ALTER TABLE DOCUMENT ADD CONSTRAINT PK_DOCUMENT PRIMARY KEY (NDOC);
ALTER TABLE PODRAZD ADD CONSTRAINT PK_PODRAZD PRIMARY KEY (NPODR);
ALTER TABLE PROTOCOL ADD CONSTRAINT PK_PROTOCOL PRIMARY KEY (NUMBER);
ALTER TABLE PROVERKI ADD CONSTRAINT PK_PROVERKI PRIMARY KEY (NPROVERKI);
ALTER TABLE RABOTNIK ADD CONSTRAINT PK_RABOTNIK PRIMARY KEY (NUMBER);
/************************************************************/
/**** Foreign Keys ****/
/************************************************************/
ALTER TABLE PROTOCOL ADD CONSTRAINT FK_PROTOCOL_DOC FOREIGN KEY (NDOC) REFERENCES DOCUMENT (NDOC) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE PROTOCOL ADD CONSTRAINT FK_PROTOCOL_RAB FOREIGN KEY (NRAB) REFERENCES RABOTNIK (NUMBER) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE PROVERKI ADD CONSTRAINT FK_PROV_DIR FOREIGN KEY (FIO) REFERENCES DIRECTOR (FIO) ON DELETE NO ACTION ON UPDATE CASCADE;
ALTER TABLE PROVERKI ADD CONSTRAINT FK_PROV_PODRAZD FOREIGN KEY (NPODR) REFERENCES PODRAZD (NPODR) ON DELETE NO ACTION ON UPDATE CASCADE;
ALTER TABLE RABOTNIK ADD CONSTRAINT FK_RAB_PODR FOREIGN KEY (NPODR) REFERENCES PODRAZD (NPODR) ON DELETE NO ACTION ON UPDATE CASCADE;
/************************************************************/
/**** Triggers ****/
/************************************************************/
SET TERM ^ ;
/* Trigger: BI_ARHIV */
CREATE TRIGGER BI_ARHIV FOR ARHIVDOC
ACTIVE BEFORE INSERT POSITION 0
AS
begin
/* Trigger text */
NEW.ndoc= GEN_ID(arhivn,1);
end
^
/* Trigger: BI_DOCUMRNT */
CREATE TRIGGER BI_DOCUMRNT FOR DOCUMENT
ACTIVE BEFORE INSERT POSITION 0
AS
begin
/* Trigger text */
NEW.ndoc= GEN_ID(docn,1);
end
^
/* Trigger: BI_PODRAZD */
CREATE TRIGGER BI_PODRAZD FOR PODRAZD
ACTIVE BEFORE INSERT POSITION 0
AS
begin
/* Trigger text */
NEW.npodr= GEN_ID(podrazdn,1);
end
^
/* Trigger: BI_PROTOCOL */
CREATE TRIGGER BI_PROTOCOL FOR PROTOCOL
ACTIVE BEFORE INSERT POSITION 0
AS
begin
/* Trigger text */
NEW.number= GEN_ID(protocoln,1);
end
^
/* Trigger: BI_PROVERKI */
CREATE TRIGGER BI_PROVERKI FOR PROVERKI
ACTIVE BEFORE INSERT POSITION 0
AS
begin
/* Trigger text */
NEW.nproverki= GEN_ID(proverkin,1);
end
^
/* Trigger: BI_RABOTNIK */
CREATE TRIGGER BI_RABOTNIK FOR RABOTNIK
ACTIVE BEFORE INSERT POSITION 0
AS
begin
/* Trigger text */
NEW.number= GEN_ID(rabn,1);
end
^ продолжение
–PAGE_BREAK–
SET TERM; ^
/***********************************************************/
/**** Stored Procedures ****/
/***********************************************************/
SET TERM ^ ;
ALTER PROCEDURE ADD_DOCUMENT (
NKLASS VARCHAR(7),
TEMA VARCHAR(30),
DATA DATE,
VID VARCHAR(15),
NAME VARCHAR(70))
AS
begin
/* Procedure Text */
insert into document(nklass,naimendoc,viddoc,dataprinyatiya,tematika)
values (:nklass,:name,:vid,:data,:tema);
end
^
ALTER PROCEDURE ADDDIRECTOR (
DATA DATE,
LOGIN VARCHAR(20),
FAMILY VARCHAR(20))
AS
begin
insert into director(FIO,LOGIN,DATAVSTUPLENIYA)
values (:family,:login,:data);
/* Procedure Text */ /*$$IBE$$
suspend;
$$IBE$$*/
end
^
ALTER PROCEDURE ADDPODRAZDELENIE (
NAZV VARCHAR(70),
FIO VARCHAR(20))
AS
begin
insert INTO podrazd(FIOPODR,NAZVANIE)
VALUES (:fio, :nazv);
end
^
ALTER PROCEDURE ADDPROTOCOL (
NUMDOC INTEGER)
AS
DECLARE VARIABLE NRAB INTEGER;
DECLARE VARIABLE USE VARCHAR(20);
DECLARE VARIABLE VREMYA TIME;
DECLARE VARIABLE DATA DATE;
begin
/* Procedure Text */
use = user;
data = ‘TODAY’;
vremya = ‘NOW’;
select NUMBER
FROM rabotnik
WHERE LOGIN =: use
INTO :NRAB;
INSERT INTO protocol(DATA ,VREMYA,NRAB,NDOC )
VALUES (:DATA,:VREMYA,:NRAB,:numdoc);
end
^
ALTER PROCEDURE ADDPROVERKI (
NAZVPODR VARCHAR(70),
FIO VARCHAR(20),
OPISANIE VARCHAR(1000),
VID VARCHAR(15),
DATA DATE)
AS
DECLARE VARIABLE PODR INTEGER;
begin
SELECT NPODR
FROM podrazd WHERE NAZVANIE=:NAZVPODR
INTO PODR ;
INSERT INTO PROVERKI(DATA, FIO, NPODR,VID,OPISANIE)
VALUES (:DATA,:FIO,:PODR,:VID,:OPISANIE);
end
^
ALTER PROCEDURE CLEARARHIV
AS
begin
/* Procedure Text */
delete from arhivdoc;
end
^
ALTER PROCEDURE CLEARPROTOCOL
AS
begin
/* Procedure Text */
delete from protocol;
end продолжение
–PAGE_BREAK–
^
ALTER PROCEDURE DELETEDIRECTOR (
FIO VARCHAR(20))
AS
begin
/* Procedure Text */
DELETE FROM director
where FIO=:fio;
end
^
ALTER PROCEDURE DELETEDOC (
NUM INTEGER)
AS
DECLARE VARIABLE IZMENENIYA VARCHAR(30) CHARACTER SET WIN1251;
DECLARE VARIABLE TEMATIKA VARCHAR(30) CHARACTER SET WIN1251;
DECLARE VARIABLE DATA DATE;
DECLARE VARIABLE VIDDOC VARCHAR(15) CHARACTER SET WIN1251;
DECLARE VARIABLE NAIMENDOC VARCHAR(70) CHARACTER SET WIN1251;
DECLARE VARIABLE NKLASS VARCHAR(7) CHARACTER SET WIN1251;
begin
/* Procedure Text */
select nklass,naimendoc,viddoc,dataprinyatiya,tematika,izmeneniya
from document
where ndoc = :num
into :nklass,:naimendoc,:viddoc,:data,:tematika,:izmeneniya ;
delete from document
where ndoc =:num;
insert into arhivdoc(nklass,naimendoc,viddoc,dataprinyatiya,datadelete,tematika,izmeneniya)
values(:nklass,:naimendoc,:viddoc,:data,’TODAY’,:tematika,:izmeneniya);
end
^
ALTER PROCEDURE DELETEPODRAZD (
NOMER INTEGER)
AS
begin
DELETE from podrazd
WHERE NPODR=:nomer;
end
^
ALTER PROCEDURE DELETEPROVERKA (
NPROVERKI INTEGER)
AS
begin
/* Procedure Text */
delete FROM proverki
where NPROVERKI=:nproverki;
end
^
ALTER PROCEDURE DELETERABOTNIK (
NUM INTEGER)
AS
begin
DELETE FROM RABOTNIK
WHERE NUMBER =:NUM;
/* Procedure Text */
WHEN ANY do exception NODELETE;
end
^
ALTER PROCEDURE EDITPROVERKI (
OPISANIE VARCHAR(1000),
NPROV INTEGER,
VID VARCHAR(15),
NAZVPODR VARCHAR(70),
FIO VARCHAR(20),
DATA DATE)
AS
DECLARE VARIABLE PODR INTEGER;
begin
SELECT NPODR
FROM podrazd WHERE NAZVANIE=:NAZVPODR
INTO PODR ;
UPDATE PROVERKI
SET DATA=:DATA, FIO=:FIO, NPODR=:PODR,VID=:VID,OPISANIE=:OPISANIE
WHERE NPROVERKI =:NPROV ;
/* Procedure Text */
end
^
ALTER PROCEDURE NEW_PROCEDURE(
NAZV VARCHAR(70),
LOGIN VARCHAR(20),
FIO VARCHAR(20))
AS
DECLARE VARIABLE NUM INTEGER;
begin
/* Procedure Text */
select NPODR
FROM PODRAZD продолжение
–PAGE_BREAK–
WHERE NAZVANIE =:nazv
INTO NUM;
insert INTO RABOTNIK(FIO,LOGIN,NPODR)
VALUES (:fio, :login, :NUM );
end
^
ALTER PROCEDURE UPDATEDOCUMENT(
IZMEN VARCHAR(30),
TEMA VARCHAR(30),
NUM INTEGER)
AS
begin
/* Procedure Text */
UPDATE document
set DATAIZMEN = ‘TODAY’, STATUS=’изменен’,TEMATIKA=:TEMA,IZMENENIYA=:izmen
WHERE NDOC=:NUM;
end
^
SET TERM; ^
Клиентскаячасть
unit Unit1;
interface
uses
Windows,RzLabel,RzCommon,Unit3,Unit4, DBCtrls, StdCtrls, Controls, Mask,
Grids, DBGrids, ComCtrls,
Classes, Messages, SysUtils, Variants, Graphics, Forms,
Dialogs,Unit2,Unit5,Unit6,Unit7, ExtCtrls, QuickRpt ;
type
TForm1 = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
TabSheet3: TTabSheet;
TabSheet4: TTabSheet;
TabSheet5: TTabSheet;
TabSheet6: TTabSheet;
TabSheet7: TTabSheet;
DBGrid1: TDBGrid;
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
DBEdit1: TDBEdit;
MaskEdit1: TMaskEdit;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
DBGrid2: TDBGrid;
MaskEdit2: TMaskEdit;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
ComboBox3: TComboBox;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Button3: TButton;
DBEdit3: TDBEdit;
Label18: TLabel;
Button5: TButton;
DBGrid3: TDBGrid;
Edit3: TEdit;
Edit4: TEdit;
Label19: TLabel;
Label20: TLabel;
Label21: TLabel;
Button6: TButton;
DBEdit4: TDBEdit;
Label22: TLabel;
Button7: TButton;
Memo1: TMemo;
DBMemo1: TDBMemo; продолжение
–PAGE_BREAK–
Label23: TLabel;
Label24: TLabel;
Label25: TLabel;
Label26: TLabel;
Edit5: TEdit;
Edit6: TEdit;
ComboBox4: TComboBox;
Label27: TLabel;
Label28: TLabel;
Label29: TLabel;
Label30: TLabel;
Label31: TLabel;
Button4: TButton;
DBEdit2: TDBEdit;
Button8: TButton;
DBGrid4: TDBGrid;
DBGrid5: TDBGrid;
Button9: TButton;
Button10: TButton;
Button11: TButton;
Button12: TButton;
DBMemo2: TDBMemo;
Label32: TLabel;
DBEdit5: TDBEdit;
DBGrid6: TDBGrid;
Label33: TLabel;
Button13: TButton;
TabSheet8: TTabSheet;
DBGrid7: TDBGrid;
Button14: TButton;
Panel1: TPanel;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
Button15: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure MaskEdit2Change(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Edit5Change(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure Button11Click(Sender: TObject);
procedure Button10Click(Sender: TObject);
procedure Button12Click(Sender: TObject);
procedure Button13Click(Sender: TObject);
rocedure Button14Click(Sender: TObject);
procedure Button15Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
s1: String;
s2: String;
s3: TDateTime;
begin
s1:= Edit1.Text;
s2:=AnsiUpperCase(Edit2.Text);
//s3:= StrToDateTime(MaskEdit1.Text);
if((s1=”) or (s2=”) or (s3=NULL))then
begin
ShowMessage(‘Проверьте заполнение всех полей’);
exit;
end ;
s3:= StrToDateTime(MaskEdit1.Text);
try
DM.DobavlenieIBSP.Prepare;
DM.DobavlenieIBSP.ParamByName(‘FAMILY’).AsString:=s1;
DM.DobavlenieIBSP.ParamByName(‘LOGIN’).AsString:=s2; продолжение
–PAGE_BREAK–
DM.DobavlenieIBSP.ParamByName(‘DATA’).AsDateTime:=s3;
DM.DobavlenieIBSP.ExecProc;
DM.IBTransaction1.Commit;
DM.IBQuery1.Active:= true;
except
ShowMessage(‘Ошибка при добавлении !!!’);
DM.IBTransaction1.Rollback;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
MaskEdit1.Text:=’xx.xx.xx’;
Edit1.Text:=”;
Edit2.Text:=”;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
try
DM.UdalenieDirIBSP.Prepare;
DM.UdalenieDirIBSP.ParamByName(‘FIO’).AsString:=DBEdit1.Text;
DM.UdalenieDirIBSP.ExecProc;
DM.IBTransaction1.Commit;
DM.IBQuery1.Active:= true;
except
ShowMessage(‘Ошибка при удалении !!!’);
DM.IBTransaction1.Rollback;
end;
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
if((Edit3.Text=”) or (Edit4.Text=”))then
begin
ShowMessage(‘Проверьте заполнение всех полей’);
exit;
end ;
try
DM.AddPodrIBSP.Prepare;
DM.AddPodrIBSP.ParamByName(‘NAZV’).AsString:=Edit4.Text;
DM.AddPodrIBSP.ParamByName(‘FIO’).AsString:=Edit3.Text;
DM.AddPodrIBSP.ExecProc;
DM.IBTransaction3.Commit;
DM.IBQuery3.Active:= true;
except
ShowMessage(‘Ошибка при добавлении !!!’);
DM.IBTransaction3.Rollback;
end;
end;
procedure TForm1.Button7Click(Sender: TObject);
begin
try
DM.DeletePodrIBSP.Prepare;
DM.DeletePodrIBSP.ParamByName(‘Nomer’).AsInteger:=StrToInt(DBEdit4.Text);
DM.DeletePodrIBSP.ExecProc;
DM.IBTransaction3.Commit;
DM.IBQuery3.Active:= true;
except
ShowMessage(‘Ошибка при добавлении !!!’);
DM.IBTransaction3.Rollback;
end;
end;
procedure TForm1.MaskEdit2Change(Sender: TObject);
begin
//—фамилия проверяющего для таблицы «Проверки»——
Combobox1.Clear;
DM.IBQuery1.Last;
Combobox1.Items.add(DM.IBQuery1.FieldValues[‘FIO’]);
//—————————————————–
//—проверяемое подразделение для таблицы «Проверки»——
Combobox2.Clear;
DM.IBQuery3.first;
while not DM.IBQuery3.Eof do
begin
Combobox2.Items.add(DM.IBQuery3.FieldValues[‘NAZVANIE’]);
DM.IBQuery3.Next;
end;
//—————————————————–
//—————–
Combobox3.Clear;
Combobox3.Items.Add(‘значительное’); продолжение
–PAGE_BREAK–
Combobox3.Items.Add(‘незначительное’);
//—————
//DBRichEdit1.Field.Assign(DBRichEdit1.Lines);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if ((Combobox1.Text=”)or(Combobox2.Text=”)) then
begin
ShowMessage(‘Заполните обязательные для заполнения поля!!!’);
exit;
end;
try
DM.InsertProverIBSP.Prepare;
DM.InsertProverIBSP.ParamByName(‘NAZVPODR’).AsString:=Combobox2.Text;
DM.InsertProverIBSP.ParamByName(‘FIO’).AsString:=Combobox1.Text;
DM.InsertProverIBSP.ParamByName(‘VID’).AsString:=Combobox3.Text;
DM.InsertProverIBSP.ParamByName(‘DATA’).AsDateTime:=StrToDateTime(MaskEdit2.Text);
DM.InsertProverIBSP.ParamByName(‘OPISANIE’).AsString:=Memo1.Text;
DM.InsertProverIBSP.ExecProc;
DM.IBTransaction2.Commit;
DM.IBQuery2.Active:= true;
except
ShowMessage(‘Ошибка при добавлении !!!’);
DM.IBTransaction2.Rollback;
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
try
if (DBEdit3.Text=”) then
begin
ShowMessage(‘В таблице отсутствуют записи!!!’);
exit;
end;
DM.DeleteProvIBSP.Prepare;
DM.DeleteProvIBSP.ParamByName(‘NPROVERKI’).AsInteger:=StrToInt(DBEdit3.Text);
DM.DeleteProvIBSP.ExecProc;
DM.IBTransaction2.Commit;
DM.IBQuery2.Active:= true;
except
ShowMessage(‘Ошибка при удалении !!!’);
DM.IBTransaction2.Rollback;
end;
end;
procedure TForm1.Edit5Change(Sender: TObject);
begin
//–подразделение к которому работник приписан для таблицы «Работники»—
Combobox4.Clear;
DM.IBQuery3.first;
while not DM.IBQuery3.Eof do
begin
Combobox4.Items.add(DM.IBQuery3.FieldValues[‘NAZVANIE’]);
DM.IBQuery3.Next;
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
if ((Edit5.Text=”)or(Edit6.Text=”)or(Combobox4.Text=”)) then
begin
ShowMessage(‘Необходимо заполнить все поля!!!’);
exit;
end;
try
DM.InsertRabotnikIBSP.Prepare;
DM.InsertRabotnikIBSP.ParamByName(‘NAZV’).AsString:=Combobox4.Text;
DM.InsertRabotnikIBSP.ParamByName(‘FIO’).AsString:=Edit5.Text;
DM.InsertRabotnikIBSP.ParamByName(‘LOGIN’).AsString:=Edit6.Text;
DM.InsertRabotnikIBSP.ExecProc;
DM.IBTransaction4.Commit;
DM.RabotnikIBT.Active:= true;
except
ShowMessage(‘Ошибка при добавлении !!!’);
DM.IBTransaction4.Rollback;
end;
end;
procedure TForm1.Button8Click(Sender: TObject);
begin
try продолжение
–PAGE_BREAK–
if (DBEdit2.Text=”) then
begin
ShowMessage(‘В таблице отсутствуют записи!!!’);
exit;
end;
DM.DeleteRabotnikIBSP.Prepare;
DM.DeleteRabotnikIBSP.ParamByName(‘NUM’).AsInteger:=StrToInt(DBEdit2.Text);
DM.DeleteRabotnikIBSP.ExecProc;
DM.IBTransaction4.Commit;
DM.RabotnikIBT.Active:= true;
except
ShowMessage(‘Ошибка при удалении !!!’);
DM.IBTransaction4.Rollback;
end;
end;
procedure TForm1.Button9Click(Sender: TObject);
begin
Form3.Show;
end;
procedure TForm1.Button11Click(Sender: TObject);
begin
Form3.Show;
end;
procedure TForm1.Button10Click(Sender: TObject);
begin
Form4.Show;
end;
procedure TForm1.Button12Click(Sender: TObject);
begin
Form5.Show;
end;
procedure TForm1.Button13Click(Sender: TObject);
begin
try
DM.ClearArhivIBSP.Prepare;
DM.ClearArhivIBSP.ExecProc;
DM.IBTransaction5.Commit;
DM.IBQuery6.Active:= true;
DM.IBQuery5.Active:= true;
DM.IBQuery7.Active:= true;
except
ShowMessage(‘Ошибка при удалении !!!’);
DM.IBTransaction5.Rollback;
end;
end;
procedure TForm1.Button14Click(Sender: TObject);
begin
try
DM.ClearProtocolIBSP.Prepare;
DM.ClearProtocolIBSP.ExecProc;
DM.IBTransaction5.Commit;
DM.IBQuery7.Active:= true;
DM.IBQuery5.Active:= true;
except
ShowMessage(‘Ошибка при удалении !!!’);
DM.IBTransaction5.Rollback;
end;
end;
procedure TForm1.Button15Click(Sender: TObject);
begin
if (RadioButton1.Checked) then Form6.QuickRep1.Preview ;
if (RadioButton2.Checked) then Form7.QuickRep1.Preview ;
end;
end.
procedure TForm3.Button1Click(Sender: TObject);
var
FileViewer: TRzURLLabel;
FileName: String ;
begin
//создаем объект для просмотра файлов
FileViewer:=TRzURLLabel.Create(Form3);
FileName:= DBEdit1.Text ;
FileViewer.URL:= FileName;
if FileExists(FileName) then
begin
FileViewer.Click;
end
else
begin
ShowMessage(‘Такого файла не существует или он не помещен в нужный каталог (см. инструкцию)’);
exit; продолжение
–PAGE_BREAK–
end;
//—— ПРОТОКОЛРАБОТЫ————————————–
try
DM.ProtocolIBSP.Prepare;
DM.ProtocolIBSP.ParamByName(‘NUMDOC’).AsInteger:=StrToInt(DBEdit2.Text);
DM.ProtocolIBSP.ExecProc;
DM.IBTransaction5.Commit;
DM.IBQuery7.Active:= true;
DM.IBQuery6.Active:= true;
DM.IBQuery5.Active:= true;
except
ShowMessage(‘Ошибка!!!’);
DM.IBTransaction5.Rollback;
end;
//——————————————————————
end;
procedure TForm3.Button2Click(Sender: TObject);
begin
if ((Memo1.Text=”)) then
begin
ShowMessage(‘Необходимо заполнить поле «Характер изменений»!!!’);
exit;
end;
try
DM.UpdateDocIBSP.Prepare;
DM.UpdateDocIBSP.ParamByName(‘NUM’).AsInteger:=StrToInt(DBEdit2.Text);
DM.UpdateDocIBSP.ParamByName(‘TEMA’).AsString:=DBEdit5.Text;
DM.UpdateDocIBSP.ParamByName(‘IZMEN’).AsString:=Memo1.Text;
DM.UpdateDocIBSP.ExecProc;
DM.IBTransaction5.Commit;
DM.IBQuery5.Active:= true;
except
ShowMessage(‘Ошибка при обновлении !!!’);
DM.IBTransaction5.Rollback;
end;
end;
end.
procedure TForm4.Button1Click(Sender: TObject);
var
s: String;
begin
SaveDialog1.Execute;
Edit1.Text:= SaveDialog1.FileName;
Combobox1.Clear;
Combobox1.Items.Add(‘внутренний’);
Combobox1.Items.Add(‘нормативный’);
end;
procedure TForm4.Button2Click(Sender: TObject);
begin
if ((Edit1.Text=”)) then
begin
ShowMessage(‘Необходимо выбрать документ!!!’);
exit;
end;
if ((Combobox1.Text=”)or(Edit3.Text=”)) then
begin
ShowMessage(‘Заполните обязательные для заполнения поля!!!’);
exit;
end;
try
DM.InsertDocIBSP.Prepare;
DM.InsertDocIBSP.ParamByName(‘NKLASS’).AsString:=Edit3.Text;
DM.InsertDocIBSP.ParamByName(‘TEMA’).AsString:=Edit2.Text;
DM.InsertDocIBSP.ParamByName(‘VID’).AsString:=Combobox1.Text;
DM.InsertDocIBSP.ParamByName(‘DATA’).AsDateTime:=StrToDateTime(MaskEdit2.Text);
DM.InsertDocIBSP.ParamByName(‘NAME’).AsString:=Edit1.Text;
DM.InsertDocIBSP.ExecProc;
DM.IBTransaction5.Commit;
DM.IBQuery5.Active:= true;
except
ShowMessage(‘Ошибка при добавлении !!!’);
DM.IBTransaction5.Rollback;
end;
end;
procedure TForm5.Button1Click(Sender: TObject);
begin
try
DM.DeleteDocIBSP.Prepare;
DM.DeleteDocIBSP.ParamByName(‘NUM’).AsInteger:=StrToInt(DBEdit2.Text);
DM.DeleteDocIBSP.ExecProc;
DM.IBTransaction5.Commit;
DM.IBQuery5.Active:= true;
DM.IBQuery6.Active:= true;
DM.IBQuery7.Active:= true;
except
ShowMessage(‘Ошибка при добавлении !!!’);
DM.IBTransaction5.Rollback;
end;
end;
Список используемой литературы
Коннолли Т., Бегг К., Страчан А. Базы данных: проектирование, реализация сопровождение. Теория и практика: Уч пос.–М.: Издательский дом «Вильямс», 2000.
Дейт К. Введение в системы баз данных. – СПб: Издательский дом «Вильямс», 1999.
Фаронов В.В. Delphi7 и разработка приложений баз данных.– М.: «НОЛИДЖ», 2003.