unit uUpdateAllTree;

interface

uses
  System.SysUtils, System.Classes,vcl.dialogs, FireDAC.Stan.Intf, FireDAC.Stan.Option,
  FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool,
  FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Phys.MySQLDef, FireDAC.VCLUI.Wait, FireDAC.Comp.UI,
  FireDAC.Phys.MySQL, Data.DB, FireDAC.Comp.Client,uTreeView,Vcl.ComCtrls,uDBConnectionBPL,uSQLQueries,uEtcetra;



  type TUpdateAllTree=class(TComponent)

  private

    FNoParentList:TStringList;
    FChildrenList:TstringList;

    FDBTreeView:TDBTreeView;


    FSelectParent:TFDQuery;
    FSelectAll:TFDQuery;

    FDBConnectionBPL:TDBConnectionBPL;
    FSQLQueries:TSQLQueries;

    FDMEtcetra:TDMEtcetra;

  constructor Create(AOwner:TComponent); override;
  destructor  Destroy; override;

  public

  procedure MyCreate;

  procedure UpdateAllTree(DBTreeView:TDBTreeView);




  procedure FindYourParentAndGo(ChildrenNode:TTreeNode);
  procedure GoAllToParents;

  property DBTreeView:TDBTreeView read FDBTreeView write FDBTreeView;

  end;


implementation

{ TUpdateAllTree }

//--------------Конструктор, деструктор----------------------------



constructor TUpdateAllTree.Create(AOwner: TComponent);
begin
  inherited;


end;



procedure TUpdateAllTree.MyCreate;
begin


    FNoParentList:=TStringList.Create;



    FChildrenList:=TstringList.Create;

    FSelectParent:=TFDQuery.Create(Self);
    FDBConnectionBPL:=TDBConnectionBPL.Create(Self);
    FSQLQueries:=TSQLQueries.Create(Self);

    FSelectParent.Connection:=FDBConnectionBPL.FDConnection;


    FSelectAll:=TFDQuery.Create(Self);



    FDMEtcetra:=TDMEtcetra.Create(Self);



end;

destructor TUpdateAllTree.Destroy;
begin
FreeAndNil(FNoParentList);

FreeAndNil(FSelectParent);
FreeAndNIl(FDBConnectionBPL);
FreeAndNil(FSQLQueries);
FreeAndNil(FDMEtcetra);
FreeAndNil(FChildrenList);

  inherited;
end;

//------------------FindYourParent

procedure TUpdateAllTree.FindYourParentAndGo(ChildrenNode:TTreeNode);
var i:integer; DMEtcetraLocal:TDMEtcetra;
    id:integer;
    idParentField:string;

    idParentInTree:integer;
    ParentNode:TTreeNode;

begin

   id:=integer(ChildrenNode.Data^);
   idParentField:=FDBTreeView.DBTreeViewTable.idParent;




  //Спросить у базы
   FSelectParent.SQL.Text:=FSQLQueries.SelectParent.Text+id.ToString;


   with FSelectParent do begin
     Open();
     if IsEmpty then exit;

     if FieldByName(idParentField).AsInteger<>-1 then
     idParentInTree:=FieldByName(idParentField).AsInteger;

     Close();
   end;


  //Искать в дереве
   ParentNode:=FDMEtcetra.FindNodeInTree(idParentInTree,FDBTreeView);

  if  ParentNode<>nil
  then ChildrenNode.MoveTo(ParentNode,naAddChild);

  //Если есть там и здесь - менять родителя






FreeAndNil(DMEtcetraLocal);

end;


//---------------Распределение по родителям

procedure TUpdateAllTree.GoAllToParents;
var i:integer; ChildNode:TTreeNode;
    id:integer;
begin


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

      id:=FNoParentList[i].ToInteger;

      ChildNode:=FDMEtcetra.FindNodeInTree(id,FDBTreeView);

      if ChildNode<>nil then


           begin

            FindYourParentAndGo(ChildNode);

           end;




      end;



end;



//--------------------Собственно полное обновление дерева

procedure TUpdateAllTree.UpdateAllTree(DBTreeView:TDBTreeView);

var

    id:^integer;
    idField:string;
    idParentField:string;
    NameField:string;
    ParentNode:TTreeNode;
    AddedNode:TTreeNode;

begin


  //Очистили дерево
  FDMEtcetra.ClearTree(DBTreeViewGlobal);


  idField:=FDBTreeView.DBTreeViewTable.id;
  idParentField:=FDBTreeView.DBTreeViewTable.idParent;
  NameField:=FDBTreeView.DBTreeViewTable.NodeName;

  new(id);



with FSelectParent do begin

Open();

 while eof<>true do
  begin

  id^:=FieldByName(idField).AsInteger;

  //Здесь
  ParentNode:=DMEtcetra.FindNodeInTree(FieldByName(idParentField).AsInteger,FDBTreeView);

  //Нужно искать в базе, а не в дереве, так как в базе ребенок может оказаться выше родителя

  AddedNode:=DBTreeView.Items.AddChildObject(ParentNode,FieldByName(NameField).AsString,id);

  if AddedNode.Parent=nil then
   begin
     FNoParentList.Add('123');
//   if Assigned(FNoParentList) then showmessage('Yes') else showmessage('No');
   


    //FNoParentList.Add('123');

   end;

  AddedNode.StateIndex:=1;
//   FNoParentList.Add(id^.ToString());

  Next;

  end;


Close();
end;

  dispose(id);


  //    FNoParentList.Add(id^.ToString());

      //FChildrenList.Add(id^.ToString());

      GoAllToParents;

  //Освобождение
  FreeAndNil(DBConnectionBPL);
  FreeAndNil(qSelect);
  FreeAndNil(SQLQueries);
  FreeAndNil(DMEtcetra);

end;

end.
