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'
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.