unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Data.SqlExpr,
  Vcl.ComCtrls, Vcl.StdCtrls, Vcl.ExtCtrls, Data.DBXMySQL,
  Datasnap.DBClient, SimpleDS, sSkinManager, sPageControl, sPanel,
  Vcl.Grids, Vcl.DBGrids, Vcl.DBCtrls, Data.FMTBcd, InputUnit,Contnrs, Vcl.Mask;

type
  TMainForm = class(TForm)
    StatusBar1: TStatusBar;
    SQLConnection1: TSQLConnection;
    SimpleDataSet1: TSimpleDataSet;
    sPageControl1: TsPageControl;
    sTabSheet1: TsTabSheet;
    Button1: TButton;
    Button2: TButton;
    LabeledEdit3: TLabeledEdit;
    LabeledEdit4: TLabeledEdit;
    LabeledEdit1: TLabeledEdit;
    LabeledEdit2: TLabeledEdit;
    ComboBox1: TComboBox;
    Label1: TLabel;
    sTabSheet2: TsTabSheet;
    sPanel1: TsPanel;
    sPanel2: TsPanel;
    ComboBox2: TComboBox;
    Label2: TLabel;
    Label3: TLabel;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    BtnShowTable: TButton;
    DBNavigator1: TDBNavigator;
    SQLQuery1: TSQLQuery;
    SQLTable1: TSQLTable;
    Button3: TButton;
    Button4: TButton;
    Add: TButton;
    Edit: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure TablesUpdate(Sender:TObject);
    procedure BtnSQLExamplesClick(Sender: TObject);
    procedure BtnShowTableClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure AddRecordClick(Sender: TObject);
    procedure AddRecordButtonClick(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);


  private
   FfieldType:tstringlist;
   la:array of tlabelededit;
    { Private declarations }
  public

  property FieldType:tstringlist read FfieldType write FfieldType;

    { Public declarations }
  end;

var
  MainForm: TMainForm; Combo1index:integer;

implementation

{$R *.dfm}



function ShowTypeField( const curTField : TFieldType) : string;

begin

 case curTField of

    ftUnknown: Result := 'ftUnknown';

    ftString: Result := 'ftString';

    ftSmallint: Result := 'ftSmallint';

    ftInteger: Result := 'ftInteger';

    ftWord: Result := 'ftWord';

    ftBoolean: Result := 'ftBoolean';

    ftFloat: Result := 'ftFloat';

    ftCurrency: Result := 'ftCurrency';

    ftBCD: Result := 'ftBCD';

    ftDate: Result := 'ftDate';

    ftTime: Result := 'ftTime';

    ftDateTime: Result := 'ftDateTime';

    ftBytes: Result := 'ftBytes';

    ftVarBytes: Result := 'ftVarBytes';

    ftAutoInc: Result := 'ftAutoInc';

    ftBlob: Result := 'ftBlob';

    ftMemo: Result := 'ftMemo';

    ftGraphic: Result := 'ftGraphic';

    ftFmtMemo: Result := 'ftFmtMemo';

    ftParadoxOle: Result := 'ftParadoxOle';

    ftDBaseOle: Result := 'ftDBaseOle';

    ftTypedBinary: Result := 'ftTypedBinary';

    ftCursor: Result := 'ftCursor';

    ftFixedChar: Result := 'ftFixedChar';

    ftWideString: Result := 'ftWideString';

    ftLargeInt: Result := 'ftLargeInt';

    ftADT: Result := 'ftADT';

    ftArray: Result := 'ftArray';

    ftReference: Result := 'ftReference';

    ftDataSet: Result := 'ftDataSet';

    ftOraBlob: Result := 'ftOraBlob';

    ftOraClob: Result := 'ftOraClob';

    ftVariant: Result := 'ftVariant';

    ftInterface: Result := 'ftInterface';

    ftIDispatch: Result := 'ftIDispatch';

    ftGuid: Result := 'ftGuid';

  end;

end;


//Процедура OnClick для кнопки "Добавить запись" на InputForm
procedure TMainForm.AddRecordButtonClick(Sender: TObject);
begin




showmessage('Ok1');
end;

procedure TMainForm.AddRecordClick(Sender: TObject);
var ol:tObjectlist; // здесь надо подключить модуль Contnrs в uses
    sl:tstringlist;

    i:integer;
    InputForm:TForm;
    btnAddRecord:TButton;

begin




{ АЛГОРИТМ
-посчитать число полей в подключенной таблице, узнать их тип, сохранить в ffieldtype:tstringlist;
(можно ft сделать свойством типа формы InputForm)
-динамически вызвать сущность InputForm
-создать столько же сущностей labeled edit сколько полей в таблице и разместить их на scrollbox InputForm
-написать обработчик кнопки - в нем - данные считываются с полей в глобальную переменную
типа stringlist, либо в свойство типа главной формы либо свойство типа InputForm
-из этой переменной, далее сохранение в БД с преобразованием в соответствующий тип
(чтобы узнать какой тип - читаем из переменной ft)
-под всеми Labeled edit создать кнопку "Добавить запись в БД и присвоить обработчик
}


//Проверка, если нет соединения, то выходим из процедуры
if Sqlconnection1.Connected=false then exit;
// Проверка, если не подключена таблица, тогда выход...
if dbgrid1.FieldCount=0 then exit;


//Отображение InputForm по нажатию "Добавить запись"
InputForm:=TInputForm.Create(Self);
InputForm.Show;

//Считаем поля и их типы и заносим в переменную Ffieldtype
Ffieldtype:=tstringlist.Create; // выделяем память...
for i := 0 to dbgrid1.FieldCount-1 do
Ffieldtype.Add(showtypefield(dbgrid1.Fields[i].DataType));




//Создаём labelededit...

for i := 0 to dbgrid1.FieldCount-1 do
  begin
  setlength(la,i+1);
  la[i]:=tlabelededit.Create(Self);
  end;


//Размещаем их на InputForm...

//la[0].SetParentComponent(inputunit.InputForm.sb);
la[0].Parent:=InputForm;
la[0].SetBounds(100,20,200,30);
la[0].Visible:=true;
la[0].EditLabel.caption:=dbgrid1.Fields[0].FieldName+' '+'('+Ffieldtype[0]+')';



for i := 1 to dbgrid1.FieldCount-1 do
begin
//la[0].SetParentComponent(inputunit.InputForm.sb);
la[i].Parent:=InputForm;
la[i].Left:=100;
la[i].Height:=30;
la[i].Width:=200;
la[i].EditLabel.caption:=dbgrid1.Fields[i].FieldName+' '+'('+Ffieldtype[i]+')';


la[i].Top:=la[i-1].top+la[i-1].Height+30;
la[i].Visible:=true;
end;

inputform.VertScrollBar.Visible:=true;


//Добавляем кнопку снизу
btnAddRecord:=TButton.Create(Self);
btnAddRecord.Caption:='Добавить запись';
btnAddRecord.Parent:=InputForm;
btnAddRecord.SetBounds(100,la[high(la)].Top+la[high(la)].Height+30,200,30);
btnAddRecord.OnClick:=AddRecordButtonClick;


// Освобождение памяти
Ffieldtype.free;

//procedure TForm1.AddRecordClick(Sender: TObject);
end;

procedure TMainForm.BtnShowTableClick(Sender: TObject);
var Mystring:string;
begin

with simpledataset1 do
  begin
   // Emptydataset;
    Active:=false;
    Dataset.Active:=false;



    DataSet.CommandType:=ctTable;
    DataSet.CommandText:=combobox2.Items[combobox2.ItemIndex];

    Dataset.Active:=true;
    Active:=true;
  end;




end;

procedure TMainForm.Button1Click(Sender: TObject);
begin


with sqlconnection1 do begin
  if connected=true then connected:=false;

  Drivername:='MySQL';


  with params do begin
    clear;
    add('Hostname='+LabeledEdit1.Text);
    add('port='+LabeledEdit2.Text);
    add('User_name='+LabeledEdit3.Text);
    add('Password='+LabeledEdit4.Text);
    add('database='+combobox1.Items[combobox1.ItemIndex]);
  end;

  try
  Connected:=true;
  if connected=true then statusbar1.Panels[0].Text:='Connected to database '+combobox1.Items[combobox1.ItemIndex];

  combo1index:=combobox1.ItemIndex;

  except
  showmessage('Connection error');
    statusbar1.Panels[0].Text:='Could not connect ';


  end;



end;


Self.TablesUpdate(Self);
combobox1.ItemIndex:=combo1index;

label3.Font.Style:=[fsbold];
label3.Caption:='';
label3.Caption:='База данных '+combobox1.Items[combobox1.ItemIndex];



end;

procedure TMainForm.Button2Click(Sender: TObject);
begin

try
if sqlconnection1.Connected then
sqlconnection1.Connected:=false;

if sqlconnection1.connected=true then statusbar1.Panels[0].Text:='Connected' else
statusbar1.Panels[0].Text:='Disconnected';
except
showmessage('disconnection error');
end;


 //Чистим список таблиц
combobox2.Items.Clear;
combobox2.Items.Add('');
combobox2.ItemIndex:=0;


end;





procedure TMainForm.Button3Click(Sender: TObject);
begin
showmessage('После вставки записи - сохраните её в физической БД, для этого нажмите SAVE');
simpledataset1.Insert;
end;

procedure TMainForm.Button4Click(Sender: TObject);
begin
if simpledataset1.Modified then
begin
  simpledataset1.Post;
  simpledataset1.ApplyUpdates(-1);
  simpledataset1.Refresh;
end;
end;

procedure TMainForm.BtnSQLExamplesClick(Sender: TObject);
begin

// Наличие данных...
if simpledataset1.IsEmpty=true then
begin
showmessage('Данные для запроса не загружены');
 exit;
end;








end;

procedure TMainForm.TablesUpdate(Sender: TObject);
var i:integer; TablesList:Tstringlist; Mystring:string;
begin


TablesList:=Tstringlist.Create;


 SimpleDataSet1.Connection:=sqlconnection1;  // подключаем simpledataset...

  SimpleDataSet1.Active:=false;

  with simpledataset1 do   //Настраиваем Simpledataset...
    begin
      MyString:='''';
      Mystring:=Mystring+combobox1.Items[combobox1.ItemIndex];
      Mystring:=Mystring+'''';

      DataSet.Active:=false;
      DataSet.CommandType:=ctQuery;
      DataSet.CommandText:=
      'SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema ='+MyString;  // ''sql_groupby''
      DataSet.Active:=true;
    end;
   SimpleDataSet1.Active:=true;



   if SimpleDataSet1.Active=false then SimpleDataSet1.Active:=true;
  //    SimpleDataSet1.DataSet.Active:=true;



 combobox2.Items.Clear;
 SimpleDataSet1.DataSet.First; // Ставим курсор в начало

   while not SimpleDataSet1.DataSet.Eof do
   begin
     TablesList.Add(SimpleDataSet1.Dataset.FieldByName('table_name').AsString); // Загрузили в DB одно значение, соответствующее курсору
     SimpleDataSet1.Dataset.Next; // перевели курсор на следующую запись...
   end;


   for i := 0 to TablesList.Count-1 do combobox2.Items.Add(TablesList[i]);
   combobox1.ItemIndex:=0;

   combobox2.ItemIndex:=0;


   TablesList.Free; // Удалили из памяти список
   SimpleDataSet1.EmptyDataSet; // Очистили для следующего использования
   if  SimpleDataSet1.IsEmpty=false then SimpleDataSet1.EmptyDataSet;
   SimpleDataSet1.Close; // Закрыли набор данных




end;


procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
sqlconnection1.ExecuteDirect('dROP DataBase test_db');
end;

procedure TMainForm.FormCreate(Sender: TObject);
var DB:TStringlist;

   sqlstring:string; bufstring:string; f:textfile;
     command:string;


  //  TablesList:Tstringlist;

    i:integer;
begin
       //Инициализируем...
   DB:=Tstringlist.Create; // Создали в памяти список




    //Стартовое подключение к БД
    with sqlconnection1 do begin
  Drivername:='MySQL';
  with params do begin
    clear;
    add('Hostname=localhost');
    add('port=3306');
    add('User_name=root');
    add('Password=masterkey');
    add('database=mysql');
  end;

      try
        connected:=true;
      except
      showmessage('error');
      end;

    //with
    end;


  ////////////////////////////
  /// СОБИРАЕМ ДАННЫЕ О БД ///
  ///////////////////////////

   {Если всё нормально - подключились - начинаем собирать данные о БД}


   with simpledataset1 do   //Настраиваем Simpledataset...
    begin
      DataSet.CommandType:=ctQuery;
      DataSet.CommandText:='SELECT schema_name FROM information_schema.schemata';
    end;




    // подключаем simpledataset...
   SimpleDataSet1.Connection:=sqlconnection1;
   if SimpleDataSet1.Active=false then SimpleDataSet1.Active:=true;
      SimpleDataSet1.DataSet.Active:=true;

   // Ставим курсор в начало
   SimpleDataSet1.First;

   //Читаем множество в Stringlist...
   while not SimpleDataSet1.Eof do
   begin
     DB.Add(SimpleDataSet1.FieldByName('schema_name').AsString); // Загрузили в DB одно значение, соответствующее курсору
     SimpleDataSet1.Next; // перевели курсор на следующую запись...
   end;

  //Чистим множество...
   SimpleDataSet1.EmptyDataSet;
 // Закрыли множество...
   SimpleDataSet1.Close;


 sqlconnection1.Connected:=false; // Расконнектились...


 //Чистим список таблиц на 2 вкладке...
combobox2.Items.Clear;
combobox2.Items.Add('');
combobox2.ItemIndex:=0;



{{{{{{{{{{{{{{{{{{{{{{{{ СОЗДАЕМ И ЗАПОЛНЯЕМ ТЕСТОВУЮ БАЗУ }
//Проверяем наличие базы в списке;

for i := 0 to DB.Count-1 do if DB[i]='test_db' then begin
DB.Free; // Удалили из памяти список
exit;end; // Вышли из процедуры...

// Если базы нет - создаём её;
sqlconnection1.Connected:=true;
sqlconnection1.ExecuteDirect('Create DataBase test_db');

//Снова собираем данные о БД


with simpledataset1 do   //Настраиваем Simpledataset...
    begin
      DataSet.CommandType:=ctQuery;
      DataSet.CommandText:='SELECT schema_name FROM information_schema.schemata';
    end;


 SimpleDataSet1.Connection:=sqlconnection1;  // подключаем simpledataset...
   if SimpleDataSet1.Active=false then SimpleDataSet1.Active:=true;
      SimpleDataSet1.DataSet.Active:=true;
    SimpleDataSet1.First; // Ставим курсор в начало

    DB.Clear; combobox1.Clear; // Чистим списки

   //Читаем в Stringlist...
   while not SimpleDataSet1.Eof do
   begin
     DB.Add(SimpleDataSet1.FieldByName('schema_name').AsString); // Загрузили в DB одно значение, соответствующее курсору
     SimpleDataSet1.Next; // перевели курсор на следующую запись...
   end;

// Передаем в комбобокс...
   for i := 0 to DB.Count-1 do combobox1.Items.Add(DB[i]);
   combobox1.ItemIndex:=0;

   //Чистим и закрываем множество...
   Simpledataset1.EmptyDataSet;
   Simpledataset1.Close;
   Simpledataset1.DataSet.Close;
///////////////////////////////////////////Тестовая БД test_bd создана и отображена в списке....



///////Создаем таблицы для тестовой БД...


/////Читаем текстовый файл скрипта в строку...
sqlstring:='';
AssignFile(f,'C:\Users\Stas\YandexDisk\7 DELPHI\MyStudyProjects\53 DBExpress Основные операции\TablesCreation3.txt');
reset(f);
while not EOF(f) do
  begin
    readln(f,bufstring);
    sqlstring:=sqlstring+bufstring;
  end;

//Чистим переменную db:tstringgrid и command:tstring;
db.Clear;  command:='';

//Нарезаем строку sql отдельными инструкциями...
for i := 1 to length(sqlstring) do begin

  if   (sqlstring[i]<>';')  then command:=command+sqlstring[i];
  if sqlstring[i]=';' then begin db.Add(command); command:=''; end;
   end;

//Добавляем украденный разделитель...

for i := 0 to db.Count-1 do
begin
  db[i]:=db[i]+';';
end;

//"Скармливаем инструкции", создаем таблицы...

for i := 0 to db.Count-1 do
begin
  sqlquery1.SQL.Clear;
  sqlquery1.SQL.Add(db[i]);
  sqlquery1.ExecSQL; // ExecSQL, а не Open, так как сервер ничего не должен возвращать в наших запросах
end;



//Чистим память
db.Free;
sqlquery1.SQL.Clear;
Sqlconnection1.Connected:=false;



//Подключаем...
combobox1.ItemIndex:=5;
self.Button1.Click;

combobox2.ItemIndex:=2;
self.BtnShowTable.Click;






 //form create
end;



end.
