Алгоритм перетворення
У його побудові беруть участь:
- • збережені процедури;
- • види серверної частини;
- • форми, пов'язані з клієнтською частиною.
Збережені процедури дозволяють значною мірою знизити обсяги інформації, що передаються по мережі (трафік). До них у БД відноситься 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.
На цьому закінчимо опис розподіленої БД "Навчальний процес".