from student, Discipl
where ( student.st_bilet = new.st_bilet ) and
((Discipl.kafedra = 'all') or (new.kafedra = Discipl.kafedra));
end;
Разумеется, следует подкорректировать интерфейс нашей программы, чтобы она позволяла указывать кафедру, на которой обучается студент и для повышения адекватности отображаемых данных, по событию AfterInsert компонента Stud_Table следует выполнять ту же функцию что и по событию AfterScroll. Каким образом это настроить предлагается разобраться самостоятельно.
Второе направление автоматизации ввода успеваемости- использование динамически создаваемых запросов. Для выполнения сформированных запросов поместим на форму Datamodule1 компонент SQLQuery, переименуем его в TempSQL и зададим значение свойства
SQLConnectionMyBase
Локика переименования в TempSQL в том, что через этот компонент будут выполняться короткоживущие запросы, текст которых будет постояно меняться.
Формирование запросов на добавление новых дисциплин в учебный график студента (по сути таблицу «Uspevaemost». Будем осуществлять исходя из следующих вариантов работы пользователя:
а) пользователь выделяет дисциплину в списке и добавляет ее для всех студентов данной кафедры.
б) пользователь добавляет дисциплину студентам только одной из групп кафедры.
Переходим на закладку «Успеваемость» главной формы и добавляем на нее следующие компоненты: CheckBox (2 шт.), ComboBox и Button. Переименовываем их в UseGrFilter, Otchetnost, GrName, AddButton, настроим их визуальные свойства как например показано на рисунке. Эстеты по желанию могут заменить обычную кнопку на SpeedButton или BitBtn, сгруппировать компоненты на панели и т.п.
Рисунок 4.1
Мы же ограничимся таким интерфейсом и описанием кода. Для закладки «Учебный график» по событию переключения на нее (OnShow ) целесообразно записать следующий код в обработчике события:
GrName.Items.Clear;
GrName.Items.Assign(Group_select.Items);
Данный код сначала очищает список групп отображаемый внизу экрана, а затем копирует все элементы аналогичного списка с другой закладки.
Основной код будет у нас содержаться в обработчике нажатия на кнопку AddButton и будет выглядеть следующим образом:
procedure TSDIAppForm.AddButtonClick(Sender: TObject);
var s,predmet:string;
begin
with dm1 do
begin
Stud_table.First;
Predmet:=Disc_Table.FieldByName('Dis_shifr').Value;
while not stud_Table.eof do
begin
s:=Stud_table.FieldByName('st_bilet').Value;
if TempSQL.Active then TempSQL.Close;
TempSQL.SQL.Clear; //стирание старого запроса
TempSQL.SQL.Add('Insert into uspevaemost');
TempSQL.SQL.Add('(st_bilet, dis_shifr, forma_otchetnosti, ozenka, data_sdachi)');
TempSQL.SQL.Add(' select student.st_bilet, '+chr($27)+Predmet+chr($27)+',' );
TempSQL.SQL.Add(chr($27)+SDIAppForm.Otchetnost.text+chr($27)+',');
TempSQL.SQL.Add(chr($27)+ 'Не сдавал'+chr($27)+',');
TempSQL.SQL.Add(chr($27)+ '01.01.2000'+chr($27));
TempSQL.SQL.Add(' from student ');
if UseGrFilter.Checked then
begin
TempSQL.SQL.Add(' where ( student.gruppa = ');//
TempSQL.SQL.Add(chr($27)+SdiAppForm.GrName.Text+chr($27)+');');
end;
SdiAppForm.memo1.Lines.Assign(TempSQL.SQL);
TempSql.ExecSQL;
Stud_table.Next;
end;
end;
end;
Довольно часто при недостаточном опыте с приложениями БД может возникнуть ситуация при которой подобный код выполняется с ошибками. В 90% таких случаев причиной является синтаксическая неверность динамического запроса. В этом случае для отладки поместите на главную форму компонент TMemo, и вместо выполнения запроса помещайте его текст поле Memo как показано в строке *, а строку ** наборот закомментируйте.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.