Методология проектирования баз данных 2 2

Калужский филиал Государственного образовательного учреждения высшего профессионального образования «Московский государственный технический университет им. Н.Э.Баумана»



Кафедра ЭИУ 3-К "ЭИУК"











Методология проектирования баз данных

Расчётно-пояснительная записка к курсовой работе

по курсу

Проектирование алгоритмов и программного обеспечения





























г. Калуга

2007


Содержание



1. Детальная постановка задачи

2. Концептуальное проектирование

3. Логическое проектирование

4. Физическое проектирование.

5. Физическая реализация

Список используемой литературы




1. Детальная постановка задачи



Существует предприятие, занимающееся производством компонентов для систем кабельного и спутникового телевидения.

Предприятие состоит из нескольких подразделений, каждое из которых имеет свой номер и название и ФИО директора подразделения. Принципиальное значение для данной задачи имеет служба качества. В службе качества выделяется ведущий специалист, который является директором этой службы. Это единственный человек на предприятии, который имеет право формировать электронные документы, вносить в них изменения, удалять их. Все остальные работники (пользователи) независимо от принадлежности к тому или иному подразделению имеют право только просматривать электронные документы в режиме чтения. Все документы делятся на две категории: 

нормативные документы системы менеджмента качества (СМК)

внутренние документы СМК

Перечень документов и форма их составления являются прерогативой директора службы качества.

Каждый документ имеет реквизиты: номер по классификатору, наименование, дату принятия, тематику, статус, дату изменения, характер изменений (если они были). Необходимо иметь ввиду, что каждому номеру документа по классификатору в категории нормативных документов физически может соответствовать несколько документов (формат ****.doc). Удаленные документы должны помещаться на хранение в электронный архив на неопределенный срок. Очищать этот архив может только директор службы качества. 

Ведется протокол работы пользователей с обеими категориями документов, в котором отражается имя документа, к которому осуществлялся доступ, дата доступа, фамилия работника (имя пользователя).

Директор службы качества проводит в подразделениях внутренние проверки системы качества на предмет соответствия работы этих подразделений требованиям нормативной и внутренней документации СМК. Результаты проверок содержат следующие данные:

- проверяемое подразделение 

- номер проверки

- дата проверки

- описание несоответствия

- вид несоответствия (значительное, незначительное)

Типовые операции:

 - добавление документа

- редактирование документа 

- описание внесенных изменений 

- удаление документа (добавление в электронный архив)

- удаление документов из электронного архива

- добавление/удаление результатов внутренних проверок СМК

- подготовка отчета о результатах внутренних проверок СМК по форме:



Дата проверки

Наименование проверяемого подразделения

Описание несоответствия (если оно есть)











	

	- подготовка отчета о работе пользователей с документами СМК по форме:

	

	Дата

	Наименование документа

	Время

	Фамилия 

	

	

	

	

	

	
2. Концептуальное проектирование

 

Определение типов сущности:

- подразделение

- Директор службы качества

- работники

- электронный документ

- нормативный документ СМК

- внутренний документ СМК

- протокол работы

- проверки СМК

Определение типов связи:

- Директор службы качества работает с электронными документами

- Электронные документы включают в себя нормативные документы СМК

- Электронные документы включают в себя внутренние документы СМК

- Документы учитываются в протоколе работы

- Директор службы качества проводит проверки подразделений

- Подразделения участвуют в проверках

- Работники фиксируются в протоколе работы

- Работники приписаны к подразделениям



Таблица №1 Типы сущности

Наименование

Краткое описание

Синонимы

Особенности

Подразделение

Структурная единица предприятия

Отдел 

Каждое подразделение возглавляется директором

Директор службы качества



Директор по качеству

Центральная фигура в данной постановке задачи

Работники

Общее наименование для всех работающих на предприятии



В данной постановке задачи – это все остальные кроме Директора по качеству

Электронный документ

Документ в электронном виде в формате ***.doc

Файл

Делятся на две категории

Нормативный документ СМК





Документы , отражающие общепринятые стандарты в СМК

Внутренний документ СМК





Документы, действующие внутри предприятия

Протокол работы

Информация о работе с документами

Статистика работы с документами

Обращение любого работника к любому документу должно отражаться в протоколе работы

Проверки СМК

Действие по выявлению несоответствий

Аудит 

Только директор службы качества проверяет подразделения



Таблица №2 Типы связей

Тип сущности

Тип связи

Тип сущности

Кардинальность

Степень участия

Директор службы качества

Работает

Эл. документ

1:М

Т : Т

Работники 

Приписаны к 

Подразделения 

 М : 1

Т : Т

Работники

Фиксируются 

Протокол работы

 1 : М

Р : Т

Электронные документы

Включают в себя

Нормативные документы СМК

М : N

Р : Т

Электронные документы

Включают в себя

Внутренние документы СМК

М : N

Р : Т

Электронные документы

Учитываются в

Протокол работы

1 : М

P : Т

Директор службы качества

Проводит 

Проверки

1 : М

Т : Т

Подразделения

Участвуют в

Проверки 

 1 : М

 Т : Р





Таблица №3 Атрибуты

Тип сущности

(тип связи)

Атрибут

Описание

Тип данных

Значение по умолчанию

Допустимость NULL

Производные/

множественные

Подразделение 

Название



Символьный

 -

 Нет





Номер

Уникальный №

Целый

 -

 Нет





ФИО директора подразделения

Фамилия директора подразделения

символьный

 - 

 Нет



Директор службы качества

Дата вступления в должность



Date

 - 

Нет 





Ф.И.О.



Фамилия, имя , отчество

Символьный



 Нет





имя пользователя 



Символьный



Нет 



Работники 



имя пользователя 



Символьный



Нет





Ф.И.О.



Фамилия, имя , отчество

Символьный



 Нет



Электронный документ

Номер по классификатору

Номер – это пункт ГОСТ Р ИСО 9001

Символьный 

 -

Нет 





Наименование документа



Символьный

 -

Нет





Дата принятия

Дата вступления документа в действие

Дата

 - 

Нет 





Тематика



Символьный

 -

Да





Статус

Изменен

Удален 

Символьный

 -

Да 





Дата изменения

Дата изменения нормативного или внутреннего документа 

Дата

 -

Да 





Характер изменений

Описание внесенных в документ изменений (если они были)

Символьный 

 - 

Да 



Нормативный документ СМК

 Те же, что и у электронного документа

Внутренний документ СМК

Те же, что и у электронного документа

Протокол работы















Дата-время доступа

Текущая дата

Дата - время



Нет 

















Проверки СМК















Номер проверки

Сквозная нумерация, начиная с 1

Целый 

-

Нет 





Дата проверки



Дата 



Нет 





Описание несоответствия

Текстовое описание нарушений

Символьный 

-

Да 





Вид несоответствия

Значительное, незначительное

Символьный

-

Да 









Таблица №4 Домены атрибутов

Домен

Атрибут 

Тип данных 

Ограничения

Примеры значений

Наименование

Подразделения

Символьный(70)



Служба качества



документа





Управление документацией

Номер 

Подразделения

Целый 







документа

Символьный(7)



4.2.3



проверки

Целый 





ФИО

Директора подразделения

Символьный(20)



Иванов И.И.



Работника







Имя 

пользователь

Символьный(20)



SYSDBA

Дата 

Принятия электронного документа,

нормативного, внутреннего

Date

Не позднее текущей





Проверки



Текущая, или раньше текущей даты









Не раньше текущей















Изменения электронного документа,

нормативного, внутреннего



Текущая, или раньше текущей даты





Доступа в протоколе работы



текущая



Описание 

Характера изменений электронного документа,

нормативного, внутреннего

Символьный(30)



Символьный(1000)



Изменены страницы 2,5,9



Несоответствий в проверках СМК





Описание процессов жизненного цикла продукции не соответствует требованиям нормативной документации, пункт 7.1

Тематика 

электронного документа,

нормативного, внутреннего

Символьный (30)



Дирекция.

Планово – экономический отдел.

Статус 

электронного документа,

нормативного, внутреннего

Символьный(10)



Изменен.

Удален.

На коррекцию.

Вид несоответствия

В проверках СМК

Символьный (15)

Значительное.

Незначительное. 





Таблица №5 Ключи

Сущность

ПК

Альтернативный ключ







Подразделение

Номер

Название 







Директор службы качества

Имя пользователя 

Ф.И.О.

Работники 

Имя пользователя 

Ф.И.О.







Электронный документ



Наименование документа +

Номер по классификатору



Нормативный документ СМК





Внутренний документ СМК 











Протокол работы 

Дата-время 

Проверки СМК

Номер проверки





Специализация / генерализация

Преобразуем сущность «электронный документ» в суперкласс. Подклассами будут являться «нормативный документ СМК», «внутренний документ СМК». Подклассы не пересекаются, участие суперкласса полное.

ER – модель




подразделения

номер

участвуют в

 проверки

№ проверки

электронные док-ты

наименование

№ по клас сификатору

внутренний док-т СМК

нормативный док-т СМК

d

Директор службы

качества

работники

имя пользователя



приписаны 

 к

проводит

учитываются в

1

1

M

M

M

1

фиксируются в

M

M

1

1

Протокол работы

Дата-время

работает

M

1

имя пользователя




3. Логическое проектирование



Предполагается использование реляционной модели данных. Необходимо избавиться от структур концептуальной модели, не реализуемых в рамках реляционной модели.

Удаляем связь «Директор службы качества работает с электронными документами», т.к. эта связь является транзакцией. 

Скорректированная ER-модель





подразделения

номер

участвуют в

 проверки

№ проверки

электронные док-ты

наименование

№ по клас сификатору

внутренний док-т СМК

нормативный док-т СМК

d

Директор службы

качества

работники

имя пользователя



приписаны 

 к

проводит

учитываются в



1

1

M

M

M

1

фиксируются в

M

M

1

1

Протокол работы

Дата-время

имя пользователя




Определение набора отношений

Объединим подклассы «нормативный документ СМК» и «внутренний документ СМК» в одно отношение «Электронный документ», т.к. все экземпляры сущностей обоих подклассов имеют одинаковые атрибуты. Также для этого отношения необходимо определить новый атрибут «вид документа» для того, чтобы идентифицировать, к какому подклассу относится документ.

1. Директор службы качества (Ф.И.О., имя пользователя, дата вступления в должность) ПК : имя пользователя

2. Проверки (№ проверки, дата, описание несоответствия, вид несоответствия, Ф.И.О. , № подразделения)

ПК: № проверки

ВК: имя пользователя директора службы качества  Директор службы качества 

ВК: номер подразделения  Подразделения

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. Физическое проектирование



Директор службы качества

ФИО(*)

Имя пользователя

Дата вступления в должность









Проверки

№ проверки(*)

Дата



Описание несоответствия

Вид несоответствия

ФИО

№ подразделения















Подразделения



Номер(*)

Названия

ФИО директора подразделения









Работники

Номер(*)



ФИО

Имя пользователя

№ подразделения











Протокол работы

Номер(*)

Дата-время доступа

№ работника

№ документа











Электронные документы

Вид документа

№ по классификатору

Наименование документа

Дата принятия

Дата изменения

Статус

Тематика

Характер изменения

№ документа






















Архив удаленных документов

№ по классификатору

Наименование документа

Дата принятия

Дата удаления

Тематика

Характер изменения

Вид документа

Номер (*)



















Создание вторичных индексов:

Таблица «Работники»: поле «Имя пользователя»

Таблица «Электронные документы»: поле («Наименование» + «№ по классификатору»)

Доступ: 

Директор службы качества и администратор – полный доступ, а все остальные – просмотр документов в режиме чтения. 




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;

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;

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,

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

^

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

^

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

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;

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;

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('значительное');

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

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;

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. 





1