unit uEtcetra;

//Различные функции и процедуры, не вошедшие в другие модули

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,uTreeView,uSQLQueries,uDBConnectionBPL;

type
  TDMEtcetra = class(TDataModule)
  private
    { Private declarations }
  public
    { Public declarations }

  procedure ClearTree(DBTreeView:TDBTreeView);
class procedure UpdateStateIndexes(Node:TTreeNode);

class procedure ClearAllCheckBoxes(DBTreeView: TDBTreeView);

procedure ClearAllCheckBoxes2(DBTreeView: TDBTreeView);

function FindNodeInTree(ID: Integer;DBTreeView:TDBTreeView): TTreeNode;



  end;

//var
//  DMEtcetra: TDMEtcetra;

implementation

{%CLASSGROUP 'Vcl.Controls.TControl'}

{$R *.dfm}

{ TDMEtcetra }



procedure TDMEtcetra.ClearTree(DBTreeView: TDBTreeView);

var i:integer;
begin

begin

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

    if DBTreeView.Items.Item[i].Data<>nil then
    Dispose(DBTreeView.Items.Item[i].Data);

  end;

    DBTreeView.Items.Clear;
end;

end;


//--------------------------Поиск узла в дереве-----------------------------------------------------

function TDMEtcetra.FindNodeInTree(ID: Integer;DBTreeView:TDBTreeView): TTreeNode;
var i:integer;

begin

 Result:=nil; //Если родитель не будет найден, то это нулевой уровень
//Иначе, это будет какой-то конкретный узел
 for i := 0 to DBTreeView.Items.Count-1 do


 if DBTreeView.Items.Item[i].Data<>nil then

 begin
     if Integer(DBTreeView.Items.Item[i].Data^)=ID then

   begin
     Result:=DBTreeView.Items.Item[i];
     Break;
   end;
 end;




end;


class procedure TDMEtcetra.UpdateStateIndexes(Node: TTreeNode);
var i:integer;
begin

   if Node.StateIndex=2 then

   begin
   Node.StateIndex:=1;
   Node.StateIndex:=2;
   end else

   begin

   Node.StateIndex:=2;
   Node.StateIndex:=1;
   end;

// Далее рекурсивно по всем потомкам
if Node.HasChildren then
 begin

 for i := 0 to Node.Count-1 do
 UpdateStateIndexes(Node[i]);

 end;


end;

//-----------------------Очистка от галочек всего дерева------------------------


class procedure TDMEtcetra.ClearAllCheckBoxes(DBTreeView: TDBTreeView);
var Node:TTreeNode;
    SQLQueries:TSQLQueries;
    qClearAllCheckBoxes:TFDQuery;
    DBConnectionLocal:TDBConnectionBPL;
    ID:integer;

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

begin

if DBTreeView.Items.GetFirstNode=nil then exit;

//Создание
SQLQueries:=TSQLQueries.Create(nil);
qClearAllCheckBoxes:=TFDQuery.Create(nil);
DBConnectionLocal:=TDBConnectionBPL.Create(nil);

qClearAllCheckBoxes.Connection:=DBConnectionLocal.FDConnection;
qClearAllCheckBoxes.SQL.Text:=SQLQueries.ClearAllCheckBoxes.Text;


// Начинаем обход дерева

Node:=DBTreeView.Items.GetFirstNode;

 Repeat

     if Node.StateIndex=2 then

      begin
        ID:=Integer(Node.Data^);

      //Удаление галочки в базе
        with qClearAllCheckBoxes.Params do
        ParamValues['id']:=ID;

        qClearAllCheckBoxes.ExecSQL;


      //Удаление в дереве

      Node.StateIndex:=1;

      end;




 Node:=Node.GetNext;
 Until not Assigned(Node) ;


 FreeAndNil(SQLQueries);
 FreeAndNil(qClearAllCheckBoxes);
 FreeAndNil(DBConnectionLocal);


end;


// 2-я попытка

procedure TDMEtcetra.ClearAllCheckBoxes2(DBTreeView: TDBTreeView);

var Node:TTreeNode;
    SQLQueries:TSQLQueries;
    qSelectAllChecked:TFDQuery;
    qUncheckByID:TFDQuery;
    DBConnectionLocal:TDBConnectionBPL;
    ID:integer;
    idField:string;

begin

//Создание
SQLQueries:=TSQLQueries.Create(Self);
qUncheckByID:=TFDQuery.Create(Self);
qSelectAllChecked:=TFDQuery.Create(Self);
DBConnectionLocal:=TDBConnectionBPL.Create(Self);

if not DBConnectionLocal.FDConnection.Connected then exit;


idField:=DBTreeView.DBTreeViewTable.id;

qUncheckByID.Connection:=DBConnectionLocal.FDConnection;
qSelectAllChecked.Connection:=DBConnectionLocal.FDConnection;

qUncheckByID.SQL.Text:=SQLQueries.ClearAllCheckBoxes.Text;
qSelectAllChecked.SQL.Text:=SQLQueries.SelectAllChecked.Text;


with qSelectAllChecked do
  begin
  Open();

  if qSelectAllChecked.IsEmpty then exit;
  

  while not qSelectAllChecked.Eof do

   begin
       // Чистим базу от галочек
      with qUncheckByID.Params
      do ParamValues['id']:=FieldByName(idField).AsInteger;
      qUncheckByID.ExecSQL;


   Next;
   end;


  Close();
  end;

//-----------------Снятие видимых в дереве


Node:=DBTreeView.Items.GetFirstNode;

 Repeat

     if Node.StateIndex=2 then Node.StateIndex:=1;


 Node:=Node.GetNext;
 Until not Assigned(Node) ;


//в базе сделать выборку по всем чекнутым
//снять Checked в базе
//пройтись по всем видимым в дереве и снять галочки







 FreeAndNil(SQLQueries);
 FreeAndNil(qUncheckByID);
 FreeAndNil(DBConnectionLocal);
 FreeAndNil(qUncheckByID);



end;


end.
