Смекни!
smekni.com

База данных Кафедра (стр. 4 из 7)

Затем необходимо автоматизировать уникальные значения таблиц, т.к. при работе с глобальной базой данных указать уникальное значение не всегда возможно. Так как вставкой записей могут заниматься одновременно несколько пользователей. Угадать последнее вставленное значение уникального значения практически невозможно, так что необходимо как-то автоматизировать этот процесс. С этой целью в базе данных предусмотрены специальные объекты – генераторы.

Генератор - это именованная числовая переменная, значение которой можно увеличивать с помощью специальной функции gen_id. Для того, чтобы можно было пользоваться генератором, его необходимо создать и инициализировать. Для создания генератора используется оператор (запрос).

Рисунок 7 - Окно IBConsole после создания таблиц

Рассмотрим установку генератора для таблицы Student(Студент), где уникальным является kod_student (номер студента). Создадим генератор, возвращающий уникальное значение для поля kod_student в таблице STUDENT и установим стартовое значение равное 1. Для этого введите в окно запросов ISQL следующее:

CREATE GENERATOR kod_student_gen

Рисунок 8 - Окно IBConsole после создания генераторов.

Теперь присвоим нашему генератору начальное значение. Так как в таблице STUDENT уже есть записи, то нужно инициализировать генератор наибольшим имеющимся в базе значением поля kod_student. Посмотреть его можно, набрав в окне ISQL запрос

select MAX(kod_student) from STUDENT

В окне результатов появится примерно следующее:

MAX

===

4

Значение поля равно 4 так как мы вручную внесли уже четыре записи. По умолчанию у созданного генератора значение равно 0. Наберите и выполните запрос:

SET GENERATOR kod_student_gen TO 4

Теперь текущее значение генератора равно 4. Функция gen_id() увеличивает значение генератора на заданное число и возвращает полученное значение.

С помощью генератора kod_student_gen автоматизировано получение уникального числового значения для ключевого поля kod_student, однако при каждой вставке новой записи приходится вызывать функцию gen_id(kod_student_gen,1). Сервер позволяет автоматизировать и эту задачу c помощью механизма, который называется триггером.

Триггер - это некоторая процедура, обрабатываемая автоматически SQL-сервером при возникновении определенного события в базе данных - вставки, удаления и изменения записи. Непосредственно из программы к триггерам обратиться нельзя. Нельзя и передавать им входные параметры и получать от них значения выходных параметров. Триггеры всегда реализуют действие. Триггер связан с определенной таблицей базы и никогда не вызывается пользователем напрямую. Вместо этого он срабатывает (еще говорят - «стреляет») при попытке выполнить действие, заданное в его определении.

По событию изменения таблицы БД триггеры различаются на вызываемые при:

¨ добавлении новой записи

¨ изменении существующей записи

¨ удалении записи

По отношению к событию, влекущему их вызов, триггеры различаются на:

· Выполняемые до наступления события

· Выполняемые после наступления события

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

· Изменения в триггерах не влекут необходимости изменения программного кода в клиентских приложениях и не требует распространения новых версий клиентских приложений у пользователей [8].

При операциях вставки, удаления и изменения записи в теле триггера можно обращаться к значениям полей текущей записи при помощи специальных переменных NEW и OLD, например, узнать значение поля first_name при вставке записи можно, воспользовавшись выражением NEW.kod_student. Создадим для таблицы STUDENT триггер, который будет подставлять в поле kod_student очередное уникальное значение. Введите в окне ISQL и выполните следующий запрос:

SET TERM !! ;

CREATE TRIGGER kod_student_gen FOR STUDENT

BEFORE INSERT AS

BEGIN

new.kod_student=gen_id(kod_student_gen,1);

END !!

SET TERM ; !!

Этот триггер будет срабатывать перед вставкой записи в таблицу STUDENT, присваивая полю kod_student уникальное значение, полученное от генератора
kod_student_gen:

new.kod_student=gen_id(kod_student_gen,1);

Затем получим еще два генератора и два триггера для таблиц PREPODAVATEL и DISCIPLINA, чтобы автоматизировать вставку новых записей. Ниже представлены SQL коды для реализации этих задач:

Для таблицы PREPODAVATEL

CREATE GENERATOR kod_PREPOD_gen

select MAX(kod_PREPOD) from prepodavatel

SET GENERATOR kod_prepod_gen TO 1

SET TERM !! ;

CREATE TRIGGER kod_prepod_gen FOR PREPODAVATEL

BEFORE INSERT AS

BEGIN

new.kod_prepod=gen_id(kod_prepod_gen,1);

END !!

SET TERM ; !!

Для таблицы DISCIPLINA

CREATE GENERATOR kod_disciplina_gen

select MAX(kod_disciplina) from disciplina

SET GENERATOR kod_disciplina_gen TO 1

SET TERM !! ;

CREATE TRIGGER kod_disciplina_gen FOR DISCIPLINA

BEFORE INSERT AS

BEGIN

new.kod_disciplina=gen_id(kod_disciplina_gen,1);

END !!

SET TERM ; !!


3. РЕАЛИЗАЦИЯ БД В СРЕДЕ ПРОГРАММИРОВАНИЯ DELPHI

3.1. Формирование справочной системы

База данных включает в себя 7 таблиц: Student, Prepodavatel, Gruppa, Disciplina, Specialnost, Uchebnii_plan и Vedomost. Причем Student, Prepodavatel, Gruppa, Disciplina, Specialnost являются справочными для таблиц Uchebnii_plan и Vedomost. Поэтому первоначально рассмотрим автоматизацию работы данных таблиц. Данные таблицы содержатся на одной форме на компоненте PageControl1, на которой мы создаем 5 страниц, выбрав в контекстном меню PageControl1/New page. В итоге мы получаем TabSheet1.Caption=Список студентов, TabSheet2. Caption =Список групп, TabSheet3. Caption =Список дисциплин, TabSheet4. Caption =Список специальностей, TabSheet5. Caption =Список преподавателей. Для соединения с базой данных поставим на форму DataBase1, установив его свойства AliasName=date_as, DatabaseName=date, Connected=true.

3.1.1. Формирование системы Gruppa

Перейдя на страницу Список групп расположим на ней Table1, Table2, 2 DataSource, 2 DbGrid, 3 кнопки Button, 4 текстовых поля Edit, 4 Label и 1 GroupBox. Затем установим для них свойства (см. рисунок 9):

Рисунок 9 - Страница «Список групп»

Соединяем Table1, Table2 с базой данных устанавливая свойство DatabaseName=date. А также для таблицы Table1 устанавливаем имя таблицы, из которой мы берем записи Tablename=Student, Datasource6 устанавливаем Table1. Для таблицы Table2 устанавливаем имя таблицы, из которой мы берем записи Tablename=Gruppa, Datasource2 устанавливаем Table2. Для того чтобы связать таблицы Table1 и Table2, таким образом чтобы установив в таблице Gruppa курсор на ту или иную группу в таблице Student выводились только те записи, которые соответствуют данной группе. Для этого установим у Table1 Student свойства: Mastersource=Datasource2, MasterFields=gruppa (смотреть рисунок), IndexFieldName=gruppa.

Для того чтобы внести новую группу необходимо внести значения Группу, Год поступления и Эдвайзера в соответствующие Edit4, Edit5, Edit6, затем нажать кнопку «Вставить», ниже представлен обработчик OnClick:

Рисунок 10 - Процесс соединения MasterFields для таблиц

procedure TForm1.Button8Click(Sender: TObject);

begin

table2.Insert;

Table2.Fields[0].AsString := Edit4.Text;

Table2.Fields[1].AsString := edit5.Text;

Table2.Fields[2].AsString := Edit6.Text;

Table2.Post;

edit4.Clear;

edit5.Clear;

edit6.clear;

end;

Для удаления записи из таблицы, воспользуемся кнопкой «Удалить», вставив в обработчик события OnClick следующую строчку:

table2.Delete;, которая удалит сведения о группе, на которой стоит курсор.

Также возможен поиск по группе. Для этого нам необходимо ввести название группы которую необходимо найти и нажать кнопку «Поиск». Код данной процедуры:

procedure TForm1.Button13Click(Sender: TObject);

begin

Table2.SetKey;

Table2.Fields[0].AsString := Edit7.Text;

Table2.GotoKey;

edit7.Clear;

end;

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

3.1.2. Формирование системы Student

Перейдя на страницу Список студентов расположим на ней Query4, DataSource1, DbGrid, 2 кнопки Button,2 текстовых поля Edit, 2 Label и 4 SpeedButton. Затем установим для них свойства (см. рисунок 11).

Соединить Query с базой данных, установив DatabaseName=date и записав в SQL: select fio, gruppa from student. Установить у DataSource1 Dataset=Query4, чтобы он хранил набор данных Query, а для Dbrid установить DataSource1, чтобы в таблице мы могли увидеть результат запроса. 4 SpeedButton необходимы нам для перемещения по записям в таблице переходя: на следующую запись, первую, последнюю и предыдущую. Для этого мы запишем в обработчик событий для каждой из кнопок соответствующую строчку:

query4.Next;//следующая;

query4.First;//первая;

query4.Last;//последняя;

query4.Prior;//предыдущая.

Для того чтобы внести в таблицу соответствующее значение запишем для кнопки «Вставить» соответствующий код:

procedure TForm1.Button1Click(Sender: TObject);

begin

query4.Insert;

query4.FieldByName('FIO').AsString:= Edit2.Text;

query4.FieldByName('GRUPPA').AsString:= Edit3.Text;

query4.Post;

edit2.Clear;

edit3.Clear;

end;

Рисунок 11 - Страница «Список студентов»

Для удаления записи из таблицы, воспользуемся кнопкой «Удалить», вставив в обработчик события OnClick следующую строчку:

query4.Delete;

Т.к. удаление записи является безвозвратной, то необходимо для query4 записать событие:

procedure TForm1.Query4BeforeDelete(DataSet: TDataSet);

begin

if not (MessageDlg('Вы действительно хотите удалить запись?',