Алгоритм преобразования

В его построении участвуют:

• хранимые процедуры;

• виды серверной части;

• формы, связанные с клиентской частью.

Хранимые процедуры позволяют в значительной мере снизить объемы информации, передаваемые по сети (трафик). К ним в БД относится Grup_Sum, которая осуществляет подсчет числа "платных", "частично платных" и "бесплатных" студентов, обучающихся в каждой конкретной группе, а также осуществляет подсчет числа юношей и девушек в группе.

Создание видов (View) таблиц служит для повышения быстродействия системы запросов. Приведем команды по созданию вида EKZAMVIEW из РБД "Учебный процесс":

Г View: EKZAMVIEW, Owner: SYSDBA */

CREATE VIEW EKZAMVIEW (NZK, OTCHET, SEMESTR, SH_SPEC, POSL_SES, FIO, KURS) AS

SELECT

uspevaem.nzk,otchet,uspevaem.semestr,gruppa.sh_spec, posl_ses,student.fio,

gruppa.kurs

from uspevaem, gruppa, student

where uspevaem.ng=gruppa.ng and

uspevaem.nzk=student.nzk and semestr <>12

group uspevaem.nzk,otchet,uspevaem.semestr,sh_spec,posl_ses, student.fio,gruppa.kurs by having otchet-'экз';

Как видно из примера, выборку данных можно осуществлять одновременно из неограниченного числа связанных таблиц. Так, данный вид осуществляет выборку записей из трех связанных таблиц, после чего группирует полученную информацию по полям nzk, otchet, semestr, sh spec, posl_ses, fio, kurs. Этот вид используется при генерации отчета по успеваемости студентов в текущем семестре. Информация, полученная из этого вида, в дальнейшем перерабатывается интерфейсной частью и используется для генерации отчетов типа:

• студенты, не сдавшие .сессию;

• студенты, сдавшие сессию на все пятерки;

• студенты, сдавшие сессию на пятерки и одну четверку;

• студенты, сдавшие сессию на пятерки и две четверки.

В программе имеются следующие виды, которые используются:

• EkzamView – для генерации отчетов о сдаче студентами сессии;

• GruppaView – для ускорения доступа к связанным полям;

• StudentView – для ускорения доступа к связанным полям;

• ZadolgView – для генерации отчетов о сдаче студентами сессии.

Программа содержит большое количество алгоритмов, необходимых для обработки тех или иных действий пользователя, генерации сложных отчетов, взаимодействия с РБД и переработки информации. Многие из этих алгоритмов было практически невозможно реализовать, используя лишь стандартные конструкции Object Pascal, поэтому в них наряду с Pascal использовался также и язык SQL. Такой симбиоз языков позволяет в значительной мере ускорить выполнение данных алгоритмов. В качестве примера программного кода, содержащего как Pascal, так и SQL, приведем фрагмент процедуры генерирующей "зачетную (экзаменационную) ведомость".

procedure TForml 1 .Button5Click(Sender: TObject);

var

t1 :string[10];

begin

t1:=datamodule2.izuchenie.fieldbyname('otchet').asstring;

Загрузка в переменную tl текущего значения колонки otchet таблицы izuchenie

if t1 ='зач' then form) 2.QRLabel1 .сарбоп:='Зачетная ведомость';

Если tl=зач, то вывести в отчет 'Зачетная ведомость'

if t1='аттес' then form12.QRLabel1.caption:='Аттестационная ведомость';

if t1='экз' then form12.QRLabel1.caption:='Экзаменационная ведомость';

if t1='K/np' then form12.QRLabel1 ,сарбоп:='Курсовой проект';

if t1=" then exit;

datamodule2.queryrep1 .sql.clear;

Сброс текущих SQL-команд, загруженных в запрос Qucryrep1

datamodule2.queryrep1 .sql.add('select * from predmet');

Добавление SQL команды 'select * from predmet' r запрос Qucryrep1

datamodule2.queryrep1 ,sql.add('where kpred='+

datamodule2.izuchenie.fieldbyname('kpred').asstring);

datamodule2.queryrep1 .open;

Осуществление запроса

form12.QRLabel11 .caption:=

datamodule2.queryrep1.fieldbyname('predm').value;

Выводит в отчет название предмета

datamodule2.queryrep1 .close;

Закрытие запроса queryrep)

datamodule2.queryrep1.sql.clear;

datamodute2.queryrep1.sql.add('select * from prepod');

datamodule2.queryrep1 ,sql.add('where kprep='+

datamodule2.izuchenie.fieldbyname('kprep').asstring);

datamodule2.queryrep1 .open;

form12.QRLabel13.caption =

datamodule2.queryrep1.fieldbyname('fioprep').value;

Выводит в отчет ФИО преподавателя

datamodule2.queryrep1 .close;

datamodule2.queryrep1 .sql.clear;

datamodule2.queryrep1 ,sql.add('select ng,sh_specfrom gruppa');

datamodule2.queryrep1 ,sql.add('where ng='+""+

datamodule2.izuchenie.fieldbyname('ng').asstring+"");

datamodule2.queryrep1 .open;

form12.QRLabel5.caption:=

datamodule2.queryrep1.fieldbyname('sh_spec').va!ue;

Выводит в отчет шифр специальности.

datamodule2.queryrep1 .close;

datamodule2.queryrep1 .sql.clear;

datamodule2.queryrep1 .sql.addf'select * from student');

datamodule2.queryrep1 .sql.addfwhere student. ng='+""+

datamodule2.izuchenie.fieldbyname('ng').asstring+"");

datamodule2.queryrep 1 ,sql.add('order by nomer_stud');

datamodule2.queryrep1 .open;

Выводит в отчет список студентов выбранной группы . form12.QRLabel7.caption:=

datamodule2.izuchenie.fieldbyname('semestr').asstring;

Выводит в отчет номер семестра

Рис. 14.20. Блок-схема процедуры, генерирующей "зачетную (экзаменационную) ведомость"

form12.QRLabel9.caption:=

datamodule2.izuchenie.fieldbyname('ng').asstring;

Выводит в отчет номер группы

form12.quickrep1 .Preview;

Выводит отчет на предварительный просмотр

datamodule2.queryrep1 .close;

end;

Данную процедуру можно представить в виде блок-схемы, изображенной на рис. 14.20.

На этом закончим описание распределенной БД "Учебный процесс".