![]() |
Re: Tree aus Datenbank füllen - wie vorgehen?
Hallo Grolle,
unter diesem ![]() |
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: ![]() Delphi-Beispiel zum Laden (hier als Beispiel DBExpress)...
Delphi-Quellcode:
In diesem Beispiel wird genau eine einzige Datenbankabfrage abgeschicht, egal wie groß und tief der Baum ist.
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; |
Re: Tree aus Datenbank füllen - wie vorgehen?
Liste der Anhänge anzeigen (Anzahl: 1)
Hier nochmal ein Beispiel mit Firebird + DBExpress...
|
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 ? |
Re: Tree aus Datenbank füllen - wie vorgehen?
Klar, warum sollte das nicht gehen?
|
Re: Tree aus Datenbank füllen - wie vorgehen?
Zitat:
|
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 ... |
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.
|
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:
Viele Grüße ...
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz