AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi TreeView aus DB mit parentIDs generieren
Thema durchsuchen
Ansicht
Themen-Optionen

TreeView aus DB mit parentIDs generieren

Ein Thema von rayj · begonnen am 22. Jan 2008 · letzter Beitrag vom 28. Jan 2008
Antwort Antwort
Seite 1 von 2  1 2      
rayj

Registriert seit: 18. Okt 2005
46 Beiträge
 
#1

TreeView aus DB mit parentIDs generieren

  Alt 22. Jan 2008, 10:49
Datenbank: MSSQL • Version: 2000 • Zugriff über: ADO Components
Guten Tag
Folgendes Problem:

------Tabelle categories--------
cat_id (pkey, aufzählend)
cat_pid (parent id, ID der übergeordneten Kategorie)
cat_name (varchar, Name/Beschreibung der Kategorie)
--------------------------------

Als Testdaten habe ich da jetzt mal:

id | name | pid |
1 IT 0
2 Software 1
3 Hardware 1
4 Delphi 2
5 C# 2
6 Verkauf 0

Soviel zur Datenbank. Daraus soll am Ende eine FAQ DB werden (Der Grund, warum ich es selber machen muss ist, dass später eigene Funktion eingebaut werden müssen).

Mein Problem: Wie bringe ich diese Struktur am saubersten (Hinsichtlich der Performance) in eine TreeView?

Habe jetzt ein DataSet mit allen Kategorien erstellt und nach pid sortiert.

Wie würdet ihr das machen, damit ich möglichst selten den commandtext des DS ändern muss, weil das ja relativ "lange" dauert und irgendwann alles verlangsamen würde.

Vielen Dank
  Mit Zitat antworten Zitat
rayj

Registriert seit: 18. Okt 2005
46 Beiträge
 
#2

Re: TreeView aus DB mit parentIDs generieren

  Alt 22. Jan 2008, 15:07
Vielleicht habe ich mich ein wenig unverständlich ausgedrückt.
Also ich habe jetzt testeshalber einfach mal einen (sehr schlechten) undynamischen Code der 2 Level der oben genannten Struktur in die TreeView schreibt.


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
  aNode, pNode: TTreeNode; //aktuellerNode, parentNode
begin
// TreeView aufbauen
TreeView1.Items.Clear;

dsCate.Close; //ado dataset
dsCate.CommandText := 'select * from cate where cat_pid = 0';
dsCate.Open;


while not dsCate.Eof do begin
  aNode := TreeView1.Items.AddChild(nil, dsCate.FieldByName('cat_name').AsString);

  query.Close;
  query.SQL.Clear;
  query.SQL.Add('select * from cate where cat_pid = ' + IntToStr(dsCate.FieldByName('cat_id').AsInteger));
  query.Open;

  if query.RecordCount > 0 then begin
      pNode := aNode;
      while not query.Eof do begin
        aNode := TreeView1.Items.AddChild(pNode, query.FieldByName('cat_name').AsString);
        query.Next;
      end;
  end;
  dsCate.Next;
end;
Allerdings soll das Programm am Ende beliebig viele "Parent-Level" besitzen und so kann ich das natürlich nicht hart-coden.

Versteht jemand mein Problem?
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#3

Re: TreeView aus DB mit parentIDs generieren

  Alt 22. Jan 2008, 15:26
Du wirst um eine Rekursion nicht rumkommen.

Benutz mal die Suche hier im Forum. marabu hat mal hier eine Stored Procedure reingestellt, die dir die Daten bereits vom server her in der richtigen Reihenfolge liefert.
  Mit Zitat antworten Zitat
rayj

Registriert seit: 18. Okt 2005
46 Beiträge
 
#4

Re: TreeView aus DB mit parentIDs generieren

  Alt 22. Jan 2008, 15:36
Zitat von Jelly:
Du wirst um eine Rekursion nicht rumkommen.

Benutz mal die Suche hier im Forum. marabu hat mal hier eine Stored Procedure reingestellt, die dir die Daten bereits vom server her in der richtigen Reihenfolge liefert.
Hi Jelly
Danke dir. Kannst Du dich evtl. noch an 1-2 Keywords erinnern die in seinem Thread vorkommen könnten?
Bei seinen >8k Posts ist es relativ schwierig, mit "stored procedure" von Author marabu konnte ich leider nichts dergleichen finden.

Grüsse
  Mit Zitat antworten Zitat
raiguen
(Gast)

n/a Beiträge
 
#5

Re: TreeView aus DB mit parentIDs generieren

  Alt 22. Jan 2008, 18:58
hier ein entsprechender Link
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#6

Re: TreeView aus DB mit parentIDs generieren

  Alt 23. Jan 2008, 09:07
Wenn ich mir den Link so anschaue, war der Author doch nicht marabu... Da war wohl ein Pointer in meinem kopf verrutscht
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: TreeView aus DB mit parentIDs generieren

  Alt 23. Jan 2008, 11:05
Ich habe es so gelöst (damit lassen sich auch Strukturen mit 100.000.000 Einträgen *sofort* in einer Treeview darstellen)

1. Treeview zeigt alle Root-Elemente. Jedes Root-Element enthält genau einen Kindknoten. Der ist als 'dummy' gekennzeichnet. Das Dummy-Kind ist nicht sichtbar (collapsed). dafür hat jeder Knoten ein '+', auch wenn er gar keine Kinder hat.
2. Im OnExpand-Ereignis prüfe ich, ob der Kindknoten ein Dummy ist. Wenn ja, wird er entfernt und die nächste Ebene aus der DB mittels 'Select * from TreeStructure where ParentID = <ID-des-expandierten-Knotens>' geladen und in die Treeview gepackt. Jeder Knoten erhält wieder einen 'dummy'-Childknoten.

Der Vorteil ist eben, das die Treeview unmittelbar zur Verfügung steht, egal wie groß die TreeStructure-Tabelle auf der DB-Seite ist. Ich habe damit alle Verwaltungsbezirk-Unterbezirk-Straßen-Hausnummern Berlins (ca. 2 Mio) dargestellt. Wer will schon in seiner Treeview ALLES sehen?

Vielleicht mach ich mal ein Demo-Projekt daraus und stelle es hier rein. Es scheint eine Standard-Anforderung zu sein.

Ansonsten sortierst Du die Knoten nach Parent-ID und fügst jeden Knoten an die entsprechende Stelle. Dabei suchst Du nicht *jedesmal* nach dem Parent-Node der Treeview, sondern nur dann, wenn sich die Parent-ID zwischen dem einzufügenden und dem vorherigen Eintrag geändert hat. Das geht auch recht flott.

Experimentier doch einfach mal damit und zeig uns Deine Ergebnisse. Es ist bestimmt interessant, ab wieviel Einträgen so ein statischen Laden aller Knoten zu langsam wird.

Ach ja, die TVirtualTreeView von Mike Lischke ist 1000x (mindestens) schneller als die Windows-Treeview und dürfte so bis zu einigen tausend statisch einzufügenden Knoten die richtige Wahl sein.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
raiguen
(Gast)

n/a Beiträge
 
#8

Re: TreeView aus DB mit parentIDs generieren

  Alt 23. Jan 2008, 16:35
@ alzaimar: In der Art habe ich das für die Maschinen-/Bauteile-Struktur innerhalb meines InstandhaltungsProgrammes realisiert; allerdings habe ich den RootKnoten gezielt nur dann ein '+' zugeordnet, wenn auch definitiv weitere Kinder(=Ebenen) vorhanden sind. Hierzu habe ich intern ein entsprechendes Flag gesetzt, dh. sobald einem Knoten ein weiterer Kindknoten hinzugefügt wird, erhält der Elternknoten das entsprechende Flag (HasKids = true). Warum? Anwenderwunsch - weil: ein '+' zeigt halt eben an, dass weitere 'Unter'Struktur(en) vorhanden sind...
Im OnExpandEreignis wird die Anzahl der Kinder geprüft-> wenn 0 dann aus der DB nachladen... alles zusammen in Verbindung mit dem VirtualTree recht flott
  Mit Zitat antworten Zitat
rayj

Registriert seit: 18. Okt 2005
46 Beiträge
 
#9

Re: TreeView aus DB mit parentIDs generieren

  Alt 24. Jan 2008, 20:45
Zitat von alzaimar:
Ich habe es so gelöst (damit lassen sich auch Strukturen mit 100.000.000 Einträgen *sofort* in einer Treeview darstellen)

1. Treeview zeigt alle Root-Elemente. Jedes Root-Element enthält genau einen Kindknoten. Der ist als 'dummy' gekennzeichnet. Das Dummy-Kind ist nicht sichtbar (collapsed). dafür hat jeder Knoten ein '+', auch wenn er gar keine Kinder hat.
2. Im OnExpand-Ereignis prüfe ich, ob der Kindknoten ein Dummy ist. Wenn ja, wird er entfernt und die nächste Ebene aus der DB mittels 'Select * from TreeStructure where ParentID = <ID-des-expandierten-Knotens>' geladen und in die Treeview gepackt. Jeder Knoten erhält wieder einen 'dummy'-Childknoten.

Der Vorteil ist eben, das die Treeview unmittelbar zur Verfügung steht, egal wie groß die TreeStructure-Tabelle auf der DB-Seite ist. Ich habe damit alle Verwaltungsbezirk-Unterbezirk-Straßen-Hausnummern Berlins (ca. 2 Mio) dargestellt. Wer will schon in seiner Treeview ALLES sehen?

Vielleicht mach ich mal ein Demo-Projekt daraus und stelle es hier rein. Es scheint eine Standard-Anforderung zu sein.

Ansonsten sortierst Du die Knoten nach Parent-ID und fügst jeden Knoten an die entsprechende Stelle. Dabei suchst Du nicht *jedesmal* nach dem Parent-Node der Treeview, sondern nur dann, wenn sich die Parent-ID zwischen dem einzufügenden und dem vorherigen Eintrag geändert hat. Das geht auch recht flott.

Experimentier doch einfach mal damit und zeig uns Deine Ergebnisse. Es ist bestimmt interessant, ab wieviel Einträgen so ein statischen Laden aller Knoten zu langsam wird.

Ach ja, die TVirtualTreeView von Mike Lischke ist 1000x (mindestens) schneller als die Windows-Treeview und dürfte so bis zu einigen tausend statisch einzufügenden Knoten die richtige Wahl sein.
Grüss dich.
Also diese Idee finde ich wirklich klasse. Daran habe ich noch gar nicht gedacht.

Die VirtualTreeView habe ich auch schon gedownloaded, bisher allerdings noch nie benutzt weil sie ein bisschen komplizierter ist als die standard Delphi TV und mein Programm gleich um 400KB vergrösserte.

Ich weiss zwar noch nicht genau wieviele Einträge da maximal - jemals drin sein werden, vlt so 300-500.
Würdest du dafür schon die Virtual TreeView benutzen?

Danke auf jedenfall!
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
946 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: TreeView aus DB mit parentIDs generieren

  Alt 24. Jan 2008, 21:20
Hi,

warum benutzt du nicht DB-TreeView, es verlangt genau diese Art von Struktur.

Gruß
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:44 Uhr.
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