Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Tree aus Datenbank füllen - wie vorgehen? (https://www.delphipraxis.net/143783-tree-aus-datenbank-fuellen-wie-vorgehen.html)

RWarnecke 23. Nov 2009 20:46

Re: Tree aus Datenbank füllen - wie vorgehen?
 
Hallo Grolle,

unter diesem Link findest Du ein Beispiel, wie die TTreeView Komponente dynamisch mit Daten befüllt wird aus zwei Tabellen.

omata 23. Nov 2009 21:40

Re: Tree aus Datenbank füllen - wie vorgehen?
 
Der angegebene Link ist echt erbärmlich, da werden ja Unmengen an SQL-Abfragen an die Datenbank gerichtet, dass kann ja nur langsam sein.


Besser: klick

Delphi-Beispiel zum Laden (hier als Beispiel DBExpress)...
Delphi-Quellcode:
procedure fillTreeview(Tree:TTreeview; SQLConnection:TSQLConnection);

  procedure fill(Depth:integer; ANode:TTreeNode; SDS:TSimpleDataSet);
  var abbruch:boolean;
      Node:TTreeNode;
  begin
    abbruch:=false;
    while not SDS.Eof and not abbruch do begin
      Node:=Tree.Items.AddChild(
        ANode,
        SDS.FieldByName('bez').AsString
      );
      SDS.Next;
      if SDS.FieldByName('depth').AsInteger > Depth then
        fill(Depth+1, Node, SDS);
      if SDS.FieldByName('depth').AsInteger < Depth then
        abbruch:=true;
    end;
  end;

var SDS:TSimpleDataSet;
begin
  SDS:=TSimpleDataSet.Create(nil);
  try
    Tree.Items.BeginUpdate;
    Tree.Items.Clear;
    SDS.Connection:=SQLConnection;
    SDS.DataSet.CommandType:=ctStoredProc;
    SDS.DataSet.CommandText:=
      'proc_GetNodes';
    SDS.DataSet.ParamByName('id').AsInteger:=1;
    SDS.Open;
    fill(SDS.FieldByName('depth').AsInteger, nil, SDS);
    SDS.Close;
  finally
    SDS.free;
    Tree.Items.EndUpdate;
  end;
end;

procedure TForm.BtnStartClick(Sender: TObject);
begin
  fillTreeview(TreeView, SQLConnection);
end;
In diesem Beispiel wird genau eine einzige Datenbankabfrage abgeschicht, egal wie groß und tief der Baum ist.

omata 24. Nov 2009 00:30

Re: Tree aus Datenbank füllen - wie vorgehen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier nochmal ein Beispiel mit Firebird + DBExpress...

RWarnecke 24. Nov 2009 04:43

Re: Tree aus Datenbank füllen - wie vorgehen?
 
Hi omata,

funktioniert Dein Beispiel hier auch mit einer Join-Abfrage über zwei Tabellen, so wie in meinem Beispiel ?

omata 24. Nov 2009 21:38

Re: Tree aus Datenbank füllen - wie vorgehen?
 
Klar, warum sollte das nicht gehen?

RWarnecke 25. Nov 2009 04:46

Re: Tree aus Datenbank füllen - wie vorgehen?
 
Zitat:

Zitat von omata
Klar, warum sollte das nicht gehen?

Ok, dann werde ich mir das nochmal genauer anschauen müssen. Denn so richtig klar ist mir das noch nicht, wie das mit einer Abfrage an die Datenbank funktionieren soll. Ich melde mich wieder, wenn ich noch Fragen haben sollte.

Grolle 25. Nov 2009 08:42

Re: Tree aus Datenbank füllen - wie vorgehen?
 
Hallo,

im Moment verfolge ich die Idee von alzaimar aus #8 (level und rank in die Tabelle hinzufügen ist für mein Anliegen sinnvoll). Jetzt stellt sich die Frage, wie ich die Knoten auf einer bestimmten Ebene durchsuchen kann? Muss ich mich dann bei jedem Knoten von Ebene 0 bis Ebene X durchhangeln und diese dann durchsuchen, oder gibts da eine einfachere Lösung?

Viele Grüße ...

Medium 25. Nov 2009 09:46

Re: Tree aus Datenbank füllen - wie vorgehen?
 
Entweder das, oder du fragst sie neu aus der DB ab, mit "WHERE level == X". Alternativ, um nicht nochmals die DB zu bemühen, könntest du noch eine zusätzliche Liste pro Level machen, und in diese Verweise auf die Knoten der entprechenden Level packen.

Grolle 27. Nov 2009 08:48

Re: Tree aus Datenbank füllen - wie vorgehen?
 
Hallo,

hier erstmal meine vorläufige Lösung (Rank ist da jetzt noch nicht drin):
Delphi-Quellcode:
procedure TData.FillICSTree();



  function FindParent(inParent : integer) : TTreenode;
  var
    searchNode : TTreenode;
  begin
    result := nil;
    if main.icstree.Items.Count = 0 then Exit;
    searchNode := main.icstree.Items[0];
    while searchNode <> nil do
    begin
      if integer(searchNode.Data) = inParent then
      begin
        result := searchNode;
        Break;
      end;
      searchNode := searchNode.GetNext;
    end;
  end;


var
  tmpNode,node: TTreeNode;
  pid: Integer;
begin
  main.icstree.Items.Clear;
  with searchQuery do
  begin
    SQL.Clear;
    SQL.Text := 'SELECT * FROM icstree ORDER BY level ASC;';
    Open;
    while not eof do
    begin
      tmpNode := FindParent(searchQuery.FieldByName('parent').AsInteger);
      if tmpNode = nil then
        main.icstree.Items.AddObject(nil,FieldByName('name').AsString,Pointer(FieldByName('id').AsInteger))
      else
        main.icstree.Items.AddChildObject(tmpNode,FieldByName('name').AsString,Pointer(FieldByName('id').AsInteger));
      next;
    end;
  end;
end;
Viele Grüße ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:53 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz