unit uUpdateIndexesThread;

//Пересчитывает индексы в базе, чтобы узлы находились в упорядоченном состоянии
//От начального к конечному

interface

uses
  System.SysUtils, System.Classes, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param,
  FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async,
  FireDAC.DApt, FireDAC.UI.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Phys,
  FireDAC.VCLUI.Wait, FireDAC.Phys.MySQLDef, FireDAC.Phys.MySQL, Data.DB, FireDAC.Comp.Client,
  FireDAC.Comp.DataSet,
  Vcl.ComCtrls, // Для TTreeView
  Contnrs,vcl.dialogs,uTreeView,uDBConnectionBPL,uSQLQueries,syncobjs,
  Vcl.Forms, // << Для курсоров
  Vcl.Controls, // << Для курсоров
  Winapi.Windows,Vcl.StdCtrls
  ;

type
  TUpdateIndexesThread = class(TThread)
  private

  FDBTreeView:TDBTreeView;
  FIDList:TStringList;
  FEvent:TEvent;

  FSQLQueries:TSQLQueries;


  procedure GetID; // << Собирает из базы все ID
  procedure UpdateIndexesInDB;

  public
    procedure MyCreate;
    property Event:TEvent read FEvent write FEvent;

  property DBTreeView:TDBTreeView read FDBTreeView write FDBTreeView;

  protected

    procedure Execute; override;
  end;

implementation


//--------------------------------------------------------------------------------------------------

procedure TUpdateIndexesThread.MyCreate;
begin

FIDList:=TStringList.Create;
FSQLQueries:=TSQLQueries.Create(nil);
end;



{ TUpdateIndexesThread }

procedure TUpdateIndexesThread.Execute;
begin
//if FEvent.WaitFor(Infinite)=wrSignaled then
 try
  Screen.Cursor:=crSQLWait;


    begin


    GetID;

    UpdateIndexesInDB;


//    Освобождаем внешний объект
    FreeAndNil(FEvent);


    end;



 finally
 Screen.Cursor:=crDefault;
 FreeAndNil(FIDList);
 FreeAndNil(FSQLQueries);

 end;



end;

//----------------------------Собираем из базы все ID-----------------------------------------------

procedure TUpdateIndexesThread.GetID;
var qSelectID:TFDQuery;
    DBConnectionLocal:TDBConnectionBPL;
    ID:integer;
    idField:string;

begin

idField:=FDBTreeView.DBTreeViewTable.id;

qSelectID:=TFDQuery.Create(nil);
DBConnectionLocal:=TDBConnectionBPL.Create(nil);
qSelectID.Connection:=DBConnectionLocal.FDConnection;


qSelectID.SQL.Text:=FSQLQueries.SelectID.Text;
//'SELECT id FROM treeview_db.tree;';

// Собираем в список все ID
with qSelectID do begin
Open();

       while not EOF do

       begin

       ID:=FieldByName(idField).AsInteger;
       FIDList.Add(ID.ToString);

       Next;
       end;

Close;
end;

FreeAndNil(qSelectID);
FreeAndNil(DBConnectionLocal);
//FreeAndnIl(FSQLQueries);

end;


//--------------------------------------------------------------------------------------------------

                              // Обновление в базе
procedure TUpdateIndexesThread.UpdateIndexesInDB;

var qUpdateIndexes:TFDQuery;
    DBConnectionLocal:TDBConnectionBPL;
    i:integer;
    Node:TTreeNode;
    id:integer;
    Index:integer;
    Name:string;

begin

// Создание
qUpdateIndexes:=TFDQuery.Create(nil);
DBConnectionLocal:=TDBConnectionBPL.Create(nil);
qUpdateIndexes.Connection:=DBConnectionLocal.FDConnection;




qUpdateIndexes.SQL.Text:=FSQLQueries.UpdateIndex.Text;
//'UPDATE `treeview_db`.`tree` SET `Index`=:index WHERE `id`=:id;';


 for i := 0 to FIDList.Count-1 do
   begin

    with qUpdateIndexes.Params do

      begin
       ParamValues['id']:=FIDList[i].ToInteger;
       ParamValues['index']:=i;
      end;

      qUpdateIndexes.ExecSQL;

   end;

//   showmessage('Finished UpdateIndexesInDB ');

//Освобождение
FreeAndNil(qUpdateIndexes);
FreeAndNil(DBConnectionLocal);

end;





end.
