Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторні роботи КПЗ.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.24 Mб
Скачать

Лабораторна робота № 10 Тема: "Обробка таблиці клієнт/серверної субд за допомогою запитів"

Ціль роботи: отримати практичні навички по використанню запитів різних типів при  роботі з БД

 

Хід роботи

 

1. На сервері MySQL розмістіть базу даних "baza", яка містить таблиці grupy та students, зв'язані по полю id_grup.

Таблиця grupy має структуру:

Ім'я поля

Тип

Розмір

id_grup

integer

ключове, лічильник

grup_sokr

varchar

3

grup

varchar

20

klruk

varchar

50

kurs

integer

 

Таблиця students має структуру:

 

Ім'я поля

Тип

Розмір

inn

integer

ключове

fam

varchar

15

imya

varchar

15

otch

varchar

15

datar

date

 

srbal

decimal

2 знака після коми

id_grup

integer

для зв'язування

 

Вказівки: Розархівуйте архів і скопіюйте його вміст (теку БД) в загальну теку для зберігання БД MySQL (за замовченням ця тека має ім’я "C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.1\data").

Для перевірки доступу до БД запустіть утиліту "SQL Manager for MySQL", клацніть на кнопці “Зареєструвати базу даних". У вікні реєстрації введіть параметри підключення до сервера: Хост=localhost, Порт=3306, Користувач=root, Пароль=111 і клацніть на кнопці Далі.

У наступному вікні у списку "Ім’я бази даних" оберіть БД "baza", у списку "Кодування клієнта" оберіть кодування "utf8". Після задавання всіх параметрів клацніть на кнопці Готово.

У лівій частині вікна відобразиться підключена БД, яку можна відкрити подвійним клацанням миші. У теці "Таблиці" подвійним клацанням відкрийте таблицю "grupy"  або таблицю "students" і у правій частині вікна на закладці “Дані" можете проглянути її вміст.

Якщо БД підключена вірно можна її відключити за допомогою кнопки "Відмінити реєстрацію бази даних" і закрити утиліту "SQL Manager for MySQL".

 

2. У середовищі Delphi створіть програму для роботи з даними таблиць. При цьому форма повинна мати вигляд:

 

 

Усі поля таблиць повинні мати назву зрозумілою мовою, підходящу ширину стовпців.

 

Вказівки: Для форми задайте властивості: Caption=Робота іззапитами, Position=DesktopCenter, Borderstyle=bsSingle, BorderIcons-biMaximized=false (приховує кнопку розгортання на весь екран).

Для підключення БД до програми необхідно у теку з проектом скопіювати файл бібліотеки СУБД MySQL. Для цього відкрийте теку c:\

program files\mysql\bin і в теку із проектом скопіюйте файл «libmysql.dll».

У вікні Delphi перейдіть на закладку Zeos Access, на форму додайте компонент ZConnection. Для настроювання параметрів з'єднання для компонента задайте властивості: HostName=localhost, LoginPrompt=true (відображати вікно реєстрації користувача) Properties=codepage=cp1251(встановити кодування символів - кирилиця), Protocol=mysql5 (встановити тип СУБД), User=root, Password=111, Connected=true, Catalog=ім'я_БД,DatabaseName=ім'я_БД(введіть із клавіатури).

 

Підключення головної таблиці

 

За замовченням головна таблиця буде переглядатися за допомгою запиту по 10 записів.

На форму нанесіть компонент ZQuery (ZeosAccess). Для компонента задайте властивості: Connection=ZConnection1, sql=select * from grupy

Клацніть два рази на компоненті ZQuery1, викличте у вікні, що з'явилося, контекстне меню й виконайте команду Add All Fields. Для кожного поля у властивості DisplayLabel уведіть російську назву для сітки, у властивості DisplayWidth введіть потрібну ширину поля в символах. Поле id_grup є лічильником (заповнюється автоматично), тому його можна не відображати (Visible=false).

Нанесіть на форму компонент DataSource (DataAccess). Установите його властивість DataSet =ZQuery1.

Нанесіть на форму компонент DBGrid (DataControls). У властивості DataSource укажіть ім'я компонента DataSource1.

 

Для відображення даних у сітці за допомогою запиту, в події форми OnCreate уведіть код:

 

procedure Tform1.Formcreate(Sender: Tobject);

begin

    //формуємо запит на відбір записів, кількість яких за замовченням

    //дорівнює 10, і сортуємо записи по полю grup  

    zquery1.active:=false;         zquery1.SQL.Clear;         zquery1.sql.add('select grupy.* from baza.grupy order by grupy.grup limit 0,10');         //активуємо запит для відображення даних

    //у сітці головної таблиці           

    zquery1.Active:=true;

end;  

 

Для того, щоб програма коректно відключалася від БД , в події форми OnDestroy уведіть код:

 

procedure Tform1.FormDestroy(Sender: Tobject);

begin

    //відключаємося від БД

    zquery1.Active:=false;

end;

 

Підключення підлеглої таблиці

 

За замовченням підлегла таблиця відображає тільки ті записи, які відповідають групі, обраній в головній таблиці.

На форму нанесіть компонент ZQuery (ZeosAccess). Для компонента задайте властивості: Connection=ZConnection1, sql=select * from students

Клацніть два рази на компоненті ZQuery2, викличте у вікні, що з'явилося, контекстне меню й виконайте команду Add All Fields. Для кожного поля у властивості DisplayLabel уведіть російську назву для сітки, у властивості DisplayWidth введіть потрібну ширину поля в символах. Поле id_grupзв'язане в полем головної таблиці (заповнюється автоматично), тому його можна не відображати (Visible=false).

Нанесіть на форму компонент DataSource (DataAccess). Установите його властивість DataSet =ZQuery2.

Нанесіть на форму компонент DBGrid (DataControls). У властивості DataSource укажіть ім'я компонента DataSource2.

У подію OnCreate форми додайте команду:

 

//активуємо запит для відображення даних

//у сітці підлеглої таблиці           

zquery2.Active:=true;

 

Для коректного відображення зв'язаних даниз з обоз запитів виділіть компонент ZQuery2 (підлегла таблиця) і задайте властивості:MasterSource=DataSource1 (головна таблиця), MasterFields=id_grup, LinkedFields=id_grup.

 

Для того, щоб програма коректно відключалася від БД , в події форми OnDestroy додайте код:

 

zquery2.Active:=false;

 

3. Кожна сітка DBGrid за замовченням підтримує спеціальні клавіші: Insert - додати новий запис над поточним, Ctrl+Delete - видалити поточний запис (можете перевірити ці можливості). Необхідно заблокувати ці спеціальні клавіші.

 

Вказівки: Для того, щоб форма могла реагувати і обробляти натискання на клавіші встановіть для форми властивість KeyPreview=true.

Для форми у події OnKeyDown напишемо код:

 

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);     begin         //якщо в момент натискання клавіш активним компонентом на формі є

    //сітка dbgrid1 або сітка dbgrid2   

    if (dbgrid1.focused=true) or (dbgrid2.focused=true) then             //якщо натиснута клавіша insert

        //або клавіші ctrl+insert

        if (key=vk_insert) or (key=vk_delete) and (ssctrl in shift) then                 //то це натискання відміняється           

            abort;     end;

 

4. За замовченням сітки DBGrid не підтримують перегляд записів за допомогою коліщати миші (можете перевірити це твердження). Треба виправити цей недолік.

 

Вказівки: Нанесіть на форму компонент ApplicationEvents (Additional)   і у його події OnMessage введіть код:

 

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;var Handled: Boolean);     var     i: SmallInt;     begin         //якщо активний компонент на формі dbgrid1 або dbgrid2

    if (dbgrid1.Focused = true) or (dbgrid2.Focused = true) then             //якщо відбувається подія прокручування коліщати миші

        if Msg.message = WM_MOUSEWHEEL then             begin                 //то ця подія заміняється на подію прокручування

            //за допомогою клавіш "уверх" і "униз"

            Msg.message := WM_KEYDOWN;                 Msg.lParam := 0;                 i := HiWord(Msg.wParam) ;                 if i > 0 then                     Msg.wParam := VK_UP                 else                     Msg.wParam := VK_DOWN;                 Handled := False;             end;     end;

 

5. Під кожною із сіток створимо кнопки для додавання та видалення даних із таблиць.

 

Вказівки: Під головною сіткою розмістіть два компонента Button (Standard) і у властивості Caption введіть текст напису на кнопках.

Для кнопки Додати введіть код:

 

procedure TForm1.Button1Click(Sender: TObject);

begin

    //додаємо новий запис у кінець таблиці   

    zquery1.Append;

    //ставимо курсор у поле grup_sokr (перше поле у сітці)   

    zquery1.FieldByName('grup_sokr').FocusControl;

end;

 

Для кнопки Видалити напишемо код:

 

procedure TForm1.Button2Click(Sender: TObject);

begin

    //якщо поле id_grup не порожнє (є записи для видалення)

    if zquery1.FieldByName('id_grup').asstring<>'' then

        //видаємо запит на видалення

        if application.MessageBox(pchar('Видалити групу '''+zquery1.FieldByName('grup').AsString+'''?'),'Підтвердьте',mb_yesno+mb_iconquestion)=idyes then

        //якщо користувач відповів ствердно, то видаляємо запис

        zquery1.Delete;

end;

 

Під підлеглою сіткою розмістіть два компонента Button (Standard) і у властивості Caption введіть текст напису на кнопках.

Для кнопки Додати введіть код:

 

procedure TForm1.Button3Click(Sender: TObject);     begin         //додаємо новий запис у кінець таблиці   

    zquery2.Append;

    //ставимо курсор у поле inn (перше поле у сітці)             zquery2.FieldByName('inn').FocusControl;     end;

 

Для кнопки Видалити напишемо код:

 

procedure TForm1.Button4Click(Sender: TObject);     begin

    //якщо поле inn не порожнє (є записи для видалення)

    if zquery2.FieldByName('inn').asstring<>'' then

        //видаємо запит на видалення             if application.MessageBox(pchar('Видалити студента '''+             zquery2.FieldByName('fam').AsString+' '+             zquery2.FieldByName('imya').AsString+' '+             zquery2.FieldByName('otch').AsString+             '''?'),'Підтвердьте',mb_yesno+mb_iconquestion)=idyes then

             //якщо користувач відповів ствердно, то видаляємо запис                 zquery2.Delete;     end;

 

6. Реалізуємо перегляд даних по групах або цілим списком. На формі створіть групу перемикачів:

 

 

Перший перемикач обрано за замовченням і перегляд у підлеглій сітці відбувається по групам. Якщо обрати другий перемикач, то перегляд у підлеглій сітці відбувається загальним списком незалежно від того, яка група обрана сітці головної таблиці.

 

Вказівки: Нанесіть на форму компонент RadioGroup (Standard) і задайте властивості: Caption=Режим перегляду, Columns=2 (кількість колонок), Items - назви перемикачів, ItemIndex=0 (перший перемикач увімкнений за замовченням).

В події OnClick компонента напишемо код:

 

procedure TForm1.RadioGroup1Click(Sender: TObject);     begin                

    case radiogroup1.ItemIndex of             //якщо обраний перший перемикач, то

        //для  підлеглої таблиці задаємо зв'язок із головною таблицею

        0: zquery2.mastersource:=datasource1;             //якщо обраний другий перемикач, то

        //для  підлеглої таблиці видаляємо зв'язок із головною таблицею

        1: zquery2.mastersource:=nil;         end;     end;

 

7. Реалізуємо перегляд даних із головної таблиці порціями, розмір яких введений у текстове поле edit1.

Для цього треба створити конструкцію виду:

 

 

У полі можна ввести розмір порції. Перша кнопка показує попередню порцію і блокується, коли відображається перша порція (назад йти нікуди). Друга кнопка показує наступну порцію і блокується коли показана остання порція (далі йти нікуди).

 

 

Вказівки: На форму нанесіть компонент Label і у властивості Caption введіть текст напису біля текстового поля.

На форму нанесіть компонент Edit (Standard) і задайте властивість Text=10 (за замовченням на формі відображаються дані порціями по 10 записів).

На форму нанесіть дві кнопки Button (Standard) і у властивості Caption введіть потрібні написи. Перша кнопка за замовченням виключена (назад іти поки нема куди). Встановіть для неї властивість Enabled=false.

 

Для роботи функції перегляду порціями нам знадобляться глобальні змінні, які треба описати наверху в коді модуля форми:

 

//змінна для зберігання загальної кількості записів у головній таблиці

kol:integer=0;     //змінна для зберігання номера поточної порції, яка відображається у сітці

n:integer=1;

 

При запуску програми треба визначити кількість записів у головній таблиці. Для цього будемо використовувати запити і компонент ZQuery. Існуючи компоненти ZQuery зайняті відображенням даних у сітках, тому нанесемо на форму новий компонент ZQuery (Zeos Access і задамо властивість Connection=ZConnection1.

У подію OnCreate форми додайте код:

 

//формуємо запит на підрахунок кількості записів у таблиці grupy

zquery3.sql.clear;     zquery3.sql.add('select count(*) as kolvo from grupy');     //активуємо запит

zquery3.Active:=true;     //у змінну kol записуємо знайдену кількість записів

kol:=zquery3.fieldbyname('kolvo').asinteger;     //відключаємося від БД

zquery3.active:=false;  

Для кнопки "<=" напишемо код:

 

procedure TForm1.Button5Click(Sender: TObject);     begin         //вимикаємо запит для оновлення його тексту

    zquery1.active:=false;         zquery1.SQL.Clear;         //зменшуємо номер поточної порції на 1

    n:=n-1;

        //якщо поточна порція перша

    if n=1 then         begin             //блокуємо кнопку переходу назад

        button5.enabled:=false;             //формуємо запит на відбір

        //першої порції даних (починаємо з 0)

        zquery1.sql.add('select * from grupy order by grup limit 0,'+edit1.text);         end         //інакше, якщо поточний запит на перший

    else

        //формуємо запит на відбір

        //поточної порції даних (починаэмо з n-1)

        zquery1.sql.add('select * from grupy order by grup limit '+inttostr((n-1)*strtoint(edit1.text))+','+edit1.text);

  

    //активуємо запит для відображення у сітці         zquery1.Active:=true;        

    //розблоковуємо кнопку для переходу на наступну порцію         button6.enabled:=true;

 

    //ставимо курсор в поле grup_sokr (перше поле в сітці)         zquery1.FieldByName('grup_sokr').FocusControl;     end;

 

Для кнопки "=>" напишемо код:

 

procedure TForm1.Button6Click(Sender: TObject);     begin         //вимикаємо запит для оновлення його тексту

    zquery1.active:=false;         zquery1.SQL.Clear;

 

    //збільшуємо номер порції на 1         n:=n+1;

 

    //формуємо запит на відбір поточної порції

    zquery1.sql.add('select * from grupy order by grup limit '+inttostr((n-1)*strtoint(edit1.text))+','+edit1.text);

 

    //активуємо запит для відображення у сітці

    zquery1.Active:=true;

 

    //аналізуємо, чи є поточна порція останньою

    if (kol mod strtoint(edit1.Text) =0) and (n=kol div strtoint(edit1.text)) or (kol mod strtoint(edit1.Text) <>0) and (n>kol div strtoint(edit1.Text)) then

        //якщо так, то блокуємо кнопку переходу уперед

        button6.enabled:=false;

 

    //розблоковуємо кнопку для переходу на попередню порцію

    button5.enabled:=true;

 

     //ставимо курсор в поле grup_sokr (перше поле в сітці)

    zquery1.FieldByName('grup_sokr').FocusControl;     end;

 

8. Реалізуємо функції збільшення або зменшення середнього балу студентів за допомогою запиту на оновлення даних. При цьому на формі треба створити конструкцію виду:

 

 

Користувач у поле може ввести потрібний процент (якщо число позитивне, то бал збільшується; якщо негативне - зменшується). За допомогою кнопки виконується зміна середнього балу і дані у підлеглій сітці оновлюються.

 

Вказівки: Нанесіть на форму Label (Standard) і к властивості Caption введіть текст напису біля поля.

Нанесіть на форму компонент Edit (Standard) і задайте властивість Text=10 (значення за замовченням).

Нанесіть на форму компонент Button (Standard) і у властивості Caption введіть текст напису на кнопці.

 

Для оновлення даних будемо використовувати запит на оновлення, який виконаємо за допомогою створеного раніше компонента ZQuery3.

Для кнопки введіть код:

 

procedure TForm1.Button7Click(Sender: TObject);

begin

    //видаємо запит на оновлення

    if application.MessageBox('Ви підтвержуєте оновлення даних?','Підтвердьте',mb_yesno+mb_iconquestion)=idyes then

    //якщо користувач відповів ствердно

    begin

        //вимикаємо запит для зміни його тексту

        zquery3.Active:=false;

        zquery3.sql.clear;

        //формуємо запит на оновлення поля srbal

        zquery3.sql.add('update students set srbal=srbal+srbal*'+edit2.Text+'/100');

        //виконуємо запит

        zquery3.execsql;

        //оновлюємо запит для підлеглої сітки для відображення змін на формі

        zquery2.refresh;

    end;

end;

 

9. Реалізувати на формі інформаційну панель для відображення загальних показників як по всіх студентах (синій колір, так і по студентах поточної групи (червоний колір).

 

 

Вказівки: Нанесіть на форму компонент Groupbox (Standard) і у властивості Caption введіть назву панелі.

На панель нанесіть чотири компоненти Label3 - Label6 (Standard), розмістіть їх ліворуч на панелі і у властивості Font задайте синій колір тексту.

На панель нанесіть чотири компоненти Label7 - Label10 (Standard), розмістіть їх праворуч на панелі і у властивості Font задайте червоний колір тексту.

Для виконання розрахунку показників будемо використовувати запит, який можна запустити за допомогою раніше створеного компонента ZQuery3.

Розрахунок або оновлення розрахункової інформації потрібно виконувати у декількох подіях, тому оформимо код розрахунку окремою процедурою.

У верхній частині коду форми знайдіть блок опису заголовків процедур і додайте заголовок своєї процедури:

 

 procedure schet;

 

Після ключового слова Implementation введіть код процедури:

 

procedure tform1.schet;

begin

 

    //розраховуємо значення по всій таблиці students

    //виключаємо запит для оновлення його тексту

    zquery3.Active:=false;;

    zquery3.sql.clear;

 

    /формуємо запит на розрахунок показників

    //зверніть увагу, що кожна функція округляється

    //за допомогою стандартної функції round

zquery3.sql.add('select count(inn) as kolvo, round(max(srbal),2) as maxbal, round(min(srbal),2) as minbal, round(avg(srbal),2) as sredbal from students');

 

    //активуємо запис і відбираємо дані

    zquery3.Active:=true;

 

    //у написах на панелі відображаємо знайдені значення

    label3.Caption:='Общее число студентов: '+vartostr(zquery3.fieldbyname('kolvo').Value);

    label4.Caption:='Общий максимальный балл: '+vartostr(zquery3.fieldbyname('maxbal').Value);

    label5.Caption:='Общий минимальный балл: '+vartostr(zquery3.fieldbyname('minbal').Value);

    label6.Caption:='Общий средний балл: '+vartostr(zquery3.fieldbyname('sredbal').Value);

 

    //================================================   

    //розраховуємо значення по студентах поточної групи

    //виключаємо запит для оновлення його тексту

    zquery3.Active:=false;

    zquery3.sql.clear;

 

    //якщо номер активної групи не порожній (група не нова)

    if zquery1.fieldbyname('id_grup').asstring<>'' then

        //формуємо запит на розрахунок показників поточної групи

        //зверніть увагу, що кожна функція округляється

        //за допомогою стандартної функції round

        zquery3.sql.add('select count(inn) as kolvo, round(max(srbal),2) as maxbal, round(min(srbal),2) as minbal, round(avg(srbal),2) as sredbal from students whereid_grup='+zquery1.fieldbyname('id_grup').asstring)

    //якщо номер групи поржній (група нова)

    else

        //формуємо запит на розрахунок показників по групі, якої немає

        //для цього в умову підставлений номер групи 1234578

        zquery3.sql.add('select count(students.inn) as kolvo, round(max(students.srbal),2) as maxbal, round(min(students.srbal),2) as minbal, round(avg(students.srbal),2) as sredbal from baza.students where students.id_grup=124578');

 

    //активуємо запис і відбираємо дані

    zquery3.Active:=true;

 

    //у написах на панелі відображаємо знайдені значення

    label7.Caption:='Общее число студентов в группе: '+vartostr(zquery3.fieldbyname('kolvo').Value);

    label8.Caption:='Общий максимальный балл в группе: '+vartostr(zquery3.fieldbyname('maxbal').Value);

    label9.Caption:='Общий минимальный балл в группе: '+vartostr(zquery3.fieldbyname('minbal').Value);

    label10.Caption:='Общий средний балл в группе: '+vartostr(zquery3.fieldbyname('sredbal').Value);

end;

 

Для виклику створеної процедури використовують команду:

 

schet;

 

Створену процедуру треба визвати в наступних подіях:

- для форми: OnShow (при відкритті форми);

- для компонента ZQuery1: AfterPost (після внесення змін), AfterDelete (після видалення), AfterScroll (після переходу по записах);

- для компонента ZQuery2: AfterPost (після внесення змін), AfterDelete (після видалення);

- для кнопки "Змінити" після оновлення поля srbal треба онови розрахункову інформацію. У кінці події кнопки додайте виклик створеної процедури