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

 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 как показано в строке *, а строку ** наборот закомментируйте.