Розробка стандартного вікна для автоматизації обробітку основних функцій маніпуляцій даними в РСКБД 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

 

 

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

  1. Ім’я таблиці String
  2. Посилання на форму яка викликала процедуру TControl
  3. Посилання на "сітку", яка відображає дані таблиці і міститься на формі, яка викликала процедуру 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.