
- •Лабораторна робота № 1 Тема: "Створення шаблонів форм і їх використання в нових проектах"
- •Лабораторна робота № 2 Тема: "Прийоми обробки однотипних компонентів "
- •Лабораторна робота № 3 Тема: Створення незалежних модулів для зберігання незалежних процедур
- •Лабораторна робота № 4 Тема: "Створення шаблонів компонентів"
- •Лабораторна робота № 5 Тема: "Створення динамічної бібліотеки процедур"
- •Лабораторна робота № 6 Тема: "Створення програм із зовнішніми компонентами"
- •Лабораторна робота № 7 Тема: "Створення інформаційної системи за технологією файлового сервера"
- •Лабораторна робота № 8 Тема: "Створення інформаційної системи за технологією клієнт/сервер"
- •Лабораторна робота № 9 Тема: "Робота з базами даних серверної субд"
- •Лабораторна робота № 10 Тема: "Обробка таблиці клієнт/серверної субд за допомогою запитів"
- •Лабораторна робота № 11 Тема: «Робота з com сервером Microsoft Word»
- •Лабораторна робота № 12 Тема: «Робота з com сервером Microsoft Excel»
- •Лабораторна робота № 13 Тема роботи: Створення довідкової системи та її інтеграція в програму
Лабораторна робота № 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 треба онови розрахункову інформацію. У кінці події кнопки додайте виклик створеної процедури