Розробка стандартного вікна для автоматизації обробітку основних функцій маніпуляцій даними в РСКБД mySQL.
Розробка стандартного вікна для автоматизації обробітку основних функцій маніпуляцій даними в РСКБД mySQL.
Для полегшення процесу вставки, модифікування та вилучення записів з простих незв’язаних таблиць доцільніше всього створити окрему форму яка буде контролювати ці процеси.
Цей метод має такі особливості:
- Таблиця проста не зв’язана (Наприклад: персонал, відділи, клієнти. Тобто таблиці які слугують комірками для зберігання даних про об’єкти, а не їх зв’язки)
- Полегшення процесу розробки інформаційної системи, так як процеси вставки, вилучення, видалення на незв’язаних таблицях є одноманітними, і зазвичай змінюється тільки назва таблиці, та імена стовпців.
- Полегшення при надзвичайних ситуаціях, так як якщо помилка має місце, то шукати її прийдеться лише на одній формі і модулі, а не в коді усієї інформаційної системи.
Буде розглядатися програмний код наприкладі таблиці table1 бази даних test, яка має таку структуру:
CREATE TABLE `table1` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(45) NOT NULL,
`price` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4
DEFAULT CHARSET=cp1251;
Візуально її можна зобразити так:
|
id |
name |
price |
|
… |
… |
… |
Для універсальності процедур використаемо три параметри:
- Ім’я таблиці String
- Посилання на форму яка викликала процедуру TControl
- Посилання на "сітку", яка відображає дані таблиці і міститься на формі, яка викликала процедуру TControl
Посилання на форму нам потрібне для того щоб при роботі процедур викликаюча форма стала неактивна, а після закінчення процесу стала активною.
Посилання на "сітку" нам потрібне для того, щоб після завершення процедур оновити відображення даних на формі яка викликала.
Одже форму, "сітку" та ім’я таблиці ми маємо, але ще потрібно знати кількість стовпців та їх типи. Взяти з посиляння на "сітку" можна тільки імена стовпців, а не їх типи, тому для визначення типів стовпців скористаємось запитом опису таблиці РСКБД. Запит має таку структуру:
DESCRIBE [Ім’я таблиці];
Який поверне дані в таблиці з шести полів, у вигляді:
|
Field |
Type |
NULL |
Key |
Default |
Extra |
|
… |
… |
… |
… |
… |
… |
Для таблиці table1 запит поверне такий результат:
|
Field |
Type |
NULL |
Key |
Default |
Extra |
|
id |
int(10) unsigned |
NO |
PRI |
NULL |
auto_increment |
|
name |
varchar(45) |
NO |
|
NULL |
|
|
price |
int(11) |
NO |
|
NULL |
|
де
- Field – назва стовпця;
- Type – тип стовпця;
- NULL – чи може стовпець бути порожнім;
- Key – чи стовпець є ключем;
- Default – значення стовпця по замовченню;
- Extra – додаткові відомості про стовпець
Отже тепер можемо переходити до створення форми обробки в Delphi.
Приклад буде містити дві форми – перша просто буде з’єднуватись з середовищем РСКБД і відображати на ній вміст таблиці table1.

На ній три кнопки, які слугують для виклику універсальних процедур другої форми, та DBGrid, Database, DataSource, Query для відображення даних таблиці table1 на формі.
Та другу

Яка містить компонент StringGrid для забезпечення вводу нових, або зміни існуючих даних рядків таблиці. Дві кнопки для завершення процесу редагування таблиці. Компоненти DBGrid, DataSource, Query для виконання запиту опису таблиці, і, в подальшому, після підтвердження користувача виконання запиту на додання, вилучення, чи редагування.
Коди обробітку кнопок першої форми
Перша форма буде містити тільки виклики процедур другої форми, так як відобразити дані на "сітці", ввести SQL запит, та підключитися до СКБД можна в Object Inspector-i. Одже:
uses Unit2; // Link to Form2
procedure TForm1.Button1Click(Sender: TObject); // Insert click
begin
Form2.dbinsert('table1',form1,dbgrid1);
end;
procedure TForm1.Button2Click(Sender: TObject); // Update click
begin
Form2.dbupdate('table1',form1,dbgrid1);
end;
procedure TForm1.Button3Click(Sender: TObject); // Delete click
begin
Form2.dbdelete('table1',form1,dbgrid1);
end;
Коди обробітку процедур та кнопок другої форми
type
TForm2 = class(TForm)
…
procedure dbinsert(tbl:String;frm,dbg:TControl); // Додаємо до класу свої
procedure dbupdate(tbl:String;frm,dbg:TControl); // процедури додання, редагуван-
procedure dbdelete(tbl:String;frm,dbg:TControl); // ня, вилучення
…
private
{ Private declarations }
public
{ Public declarations }
end;
var
…
fc:TControl; //Call form handle
d:TControl; //source dbgrid
f:string; //directive value 'i'- insert 'u'-update
t:string; //table name
…
implementation
…
procedure TForm2.dbdelete; // Процедура вилучення запису
var
r:string; // Для збереження ідентифікатора
Begin
fc:=frm;t:=tbl;d:=dbg; // Передаємо в глобальні змінні вхідні параметри
r:=TDBGrid(dbg).Fields[0].AsString; // Зчитуємо ідентифікатор
if MessageBox(TForm(fc).Handle,'Вы действительно желаете удалить запись?','Вопрос',MB_YESNO or MB_ICONQUESTION)=ID_YES then
// Виводимо питання, і якщо ТАК тоді
Begin
query1.Active:=false; //Вимикаємо
query1.SQL.Clear; //Очищуємо
query1.SQL.Add('delete from `'+tbl+'` where `'
+TDBGrid(dbg).Fields[0].DisplayLabel+'`='+r+';'); // Додаємо запит
query1.ExecSQL; //Виконуємо запит
TDBGrid(dbg).DataSource.DataSet.Active:=false; //Оновлюємо "сітку" викликаю-
TDBGrid(dbg).DataSource.DataSet.Active:=true; //чої форми
End;
end;
procedure TForm2.dbupdate;
Var
i:integer; // Лічильник
Begin
fc:=frm;t:=tbl;d:=dbg;
query1.SQL.Clear;
query1.SQL.Add('describe `'+tbl+'`;');
query1.Active:=true; // Виконуємо запит опису таблиці
stringgrid1.ColCount:=2;
i:=0;
while not query1.Eof do // Налаштовуємо StringGrid
Begin
stringgrid1.RowCount:=i+1;
stringgrid1.Cells[0,i]:=DBGrid1.Fields[0].AsString;
stringgrid1.Cells[1,i]:=TDBGrid(dbg).Fields[i].AsString;
query1.Next;
i:=i+1;
end;
query1.First;
stringGrid1.FixedRows:=1;
f:='u';
show;
End;
procedure TForm2.dbinsert;
var
i:integer;
Begin
fc:=frm;t:=tbl;d:=dbg;
query1.SQL.Clear;
query1.SQL.Add('describe `'+tbl+'`;');
query1.Active:=true;
stringgrid1.ColCount:=2;
stringGrid1.FixedRows:=0;
i:=0;
while not query1.Eof do
Begin
stringgrid1.RowCount:=i+1;
stringgrid1.Cells[0,i]:=DBGrid1.Fields[0].AsString;
if DBGrid1.Fields[5].AsString='auto_increment' then
stringgrid1.Cells[1,i]:='NULL';
query1.Next;
i:=i+1;
end;
query1.First;
f:='i';
show;
End;
procedure TForm2.Button2Click(Sender: TObject);
begin
hide;
end;
procedure TForm2.FormHide(Sender: TObject);
begin
TForm(fc).Enabled:=True;
end;
procedure TForm2.FormShow(Sender: TObject);
begin
TForm(fc).Enabled:=False;
end;
procedure TForm2.Button1Click(Sender: TObject);
Var
q:String;
i:integer;
begin
if f='i' then
Begin
q:='insert into `'+t+'` values (';
i:=0;
while not query1.Eof do
Begin
if Pos('int',DBGrid1.Fields[1].AsString)=0 then
q:=q+''''+stringgrid1.Cells[1,i]+'''' else
q:=q+stringgrid1.Cells[1,i];
i:=i+1;q:=q+',';
query1.Next;
end;
SetLength(q,Length(q)-1);
q:=q+');';
query1.Active:=False;
query1.SQL.Clear;
query1.SQL.Add(q);
query1.ExecSQL;
TDBGrid(d).DataSource.DataSet.Active:=false;
TDBGrid(d).DataSource.DataSet.Active:=true;
hide;
End;
if f='u' then
Begin
q:='update `'+t+'` set ';
i:=1;
query1.Next;
while not query1.Eof do
Begin
q:=q+'`'+stringgrid1.Cells[0,i]+'`=';
if Pos('int',DBGrid1.Fields[1].AsString)=0 then
q:=q+''''+stringgrid1.Cells[1,i]+'''' else
q:=q+stringgrid1.Cells[1,i];
i:=i+1;q:=q+', ';
query1.Next;
end;
SetLength(q,Length(q)-2);
q:=q+' where `'+stringgrid1.Cells[0,0]+'`='+stringgrid1.Cells[1,0]+';';
query1.Active:=False;
query1.SQL.Clear;
query1.SQL.Add(q);
query1.ExecSQL;
TDBGrid(d).DataSource.DataSet.Active:=false;
TDBGrid(d).DataSource.DataSet.Active:=true;
hide;
End;
end;
end.