Viele Systeme haben eine Tabellenstruktur ähnlich der folgenden (Tabelle1):
IDName ParentID
-------------------------------------------------- -------
001 Elektronik0
002 Metall 0
003 Kondensatorelektronik001
004 Widerstandselektronik001
005 Nichteisenmetalle002
Und jeder ist es gewohnt, zum Anzeigen einen Baum (TreeView) zu verwenden, damit die Klassifizierung der gesamten Tabelle gut angezeigt werden kann. Wenn jedoch die Datenmenge groß ist, ist die Generierung des Baums langsamer, insbesondere wenn zur Implementierung Rekursion verwendet wird. Die Anzahl der Datenbankzugriffe ist groß (abhängig von der Anzahl der Ebenen) und der Effekt ist größer offensichtlich, wenn es in drei Schichten verwendet wird. Hier ist eine gute Möglichkeit, eine Baumstruktur zu erstellen.
Dieser Algorithmus greift nur einmal auf die Datenbank zu. Die spezifische Implementierung ist wie folgt:
1. Rufen Sie alle Daten gleichzeitig aus der Datenbank ab und sortieren Sie sie nach dem ParentID-Feld, um sicherzustellen, dass sich der übergeordnete Knoten jedes Datenelements davor befindet.
2. Nehmen Sie das erste Datenelement heraus und zeichnen Sie es in den Baum. Suchen Sie beim Hinzufügen zum Baum zunächst den übergeordneten Knoten. Wenn kein übergeordneter Knoten vorhanden ist, verwenden Sie diesen Datensatz direkt als Knoten der ersten Ebene der Baum.
3. Wenn noch Daten vorhanden sind, nehmen Sie diese heraus und führen Sie Schritt 2 durch, bis keine Daten mehr vorhanden sind.
Programmdurchführung:
Dieses Programm verwendet eine TStringList-Variable von stlID, um den ID-Wert jedes Knotens im entsprechenden Baum zu speichern, und verwendet die Funktion FindParent, um den übergeordneten Knoten zu finden.
function FindParent(ID:String):TTreeNode;
var
i:Integer;
beginnen
Ergebnis:=nil;
for i:=TreeView1.Items.Count-1 downto 0 do
wenn stlID.Strings[i]=ID dann
beginnen
result:=TreeView1.Items[i];
brechen;
Ende;
Ende;
// Spannender Baum
PROzedur CreateTree;
var
tmpNode:TTreeNode;
beginnen
Abfrage1.close;
Query1.SQL.Text:='select * from table1 order by ParentID';
Abfrage1.Öffnen;
Abfrage1.Erste;
während Query1.Eof dies nicht tut
beginnen
tmpNode:=TreeView1.Items.AddChild(FindParent(Query1.FieldByName('ParentID').AsString),Query1.FieldByName('Name').AsString);
stlID.Add(Query1.FieldByName('ID').AsString);//Datensatz-ID
Abfrage1.Weiter;
Ende;
Ende;