Затем необходимо автоматизировать уникальные значения таблиц, т.к. при работе с глобальной базой данных указать уникальное значение не всегда возможно. Так как вставкой записей могут заниматься одновременно несколько пользователей. Угадать последнее вставленное значение уникального значения практически невозможно, так что необходимо как-то автоматизировать этот процесс. С этой целью в базе данных предусмотрены специальные объекты – генераторы.
Генератор - это именованная числовая переменная, значение которой можно увеличивать с помощью специальной функции 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('Вы действительно хотите удалить запись?',