Использование преимуществ клиент-серверной архитектуры при проектировании приложений БД в Delphi, страница 2

procedure TDM1.Stud_tableAfterScroll(DataSet: TDataSet);

var

  Shifr_studenta: string;

begin

if  VarIsNull(Stud_Table.FieldByName('ST_BILET').Value)

then

Exit

else

 Begin

   Shifr_Studenta:=Stud_Table.FieldByName('ST_BILET').Value;

   Usp_Table.Close;

   Usp_Table.Params.ParamByName('ST_BILET').Value:=Shifr_Studenta;

   Usp_Table.Open;

 End;

end;

На этом написание программы для просмотра и редактирования существующих записей можно считать законченным.

Дальнейшее наращивание функциональности программы будет направлено удобство внесения новых данных. Для этого в первуюочередь разместим на форме компонент DBNavigator и укажем в его свойстве DataSource значение DataModule1.Stud_Source. Данный компонент позволит нам перемещаться по записям о студентах, добавлять и удалять их.

Как бы мы не старались, автоматизировать процесс ввода данных о новом студенте почти невозможно все данные нужно будет вручную набирать на клавиатуре. (Написание модуля распознавания текста или использование в нашей программе разработок ABBYY в рамках данной курсовой работы не представляется возможным.) Вручную предстоит такжже набирать и информацию о дисциплинах. Автоматизировать ввод новых данных можно лишь в отношении таблицы «Uspevaemost». Автоматизация должна быть реализована с двух сторон:

а) при приходе нового студента и внесении данных о нем в таблицу «Student»  необходимо автоматическое добавление в таблицу успеваемость всех дисциплин, которые изучает и будет изучать группа, которой принадлежит студент.

б) при изменении учебного плана и добавлении в программу дисциплины она должна появиться в таблице «Uspevaemost» у всех студентов той группы, у которой поменялась учебная программа.

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

set term ; ^

create trigger Uch_plan for student

active after insert

as

begin

 insert into uspevaemost

 (st_bilet, dis_shifr, forma_otchetnosti, ozenka, data_sdachi)

 select student.st_bilet, Discipl.Dis_shifr, 'Экзамен', 'НеСдавал', '01.01.2000'

 from student, Discipl

   where ( student.st_bilet = new.st_bilet ) and (Discipl.dis_shifr like '52%');

  end;

Префикс new в строке условия означает, что select должен выполняться для студента со «свежевведенным» шифром.

Триггер, с точки зрения синтаксиса SQL, ‑ рабочий. Главный его недостаток в том, что он будет адекватно работать только для дисциплин, шифры которых начинаются с «52». Т. е. он будет  всем студентам добавлять исключительно дисциплины кафедры «ЭФ2», что разумеется некорректно.

Для выхода из создавшейся ситуации с наименьшими потерями предлагается следующий вариант: в таблицы «Discipl» и «Student» с помощью IBConsole и InterActiveSQL добавляется поле «Kafedra»

Alter table discipl

add Kafedra char(3);

Alter table student

add Kafedra char(3);

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

set term ; ^

create trigger Uch_plan for student

active after insert

as

begin

 insert into uspevaemost

 (st_bilet, dis_shifr, forma_otchetnosti, ozenka, data_sdachi)

 select student.st_bilet, Discipl.Dis_shifr, 'Экзамен', 'Не cдавал', '01.01.2000'