TreeView aus DB-Daten
Horst Reinelt
- programmiertechnik
Hallo Forumler!
Ich habe eine knifflige Aufgabe für alle Programmier-Freaks unter euch.
In einer SQL-DB liegen wie folgt Daten (sortiert nach id):
tabelle1
+-------+-------+
| id | parent|
+-------+-------+
| 1 | 5 |
| 2 | 8 |
| 3 | 1 |
| 4 | 8 |
| 5 | 0 |
| 6 | 8 |
| 7 | 2 |
| 8 | 5 |
| 9 | 2 |
| 10 | 1 |
+-------+-------+
Die rechte Spalte zeigt jeweils eine id als Elternobjekt, wobei '0' der Ursprung ist.
Das heißt z. B., 1 und 8 sind Kinder von 5.
Oder z. B. 2, 4 und 6 sind Kinder von 8.
Die Daten sollten jetzt mit Perl so umstrukturiert werden, dass das Ergebnis wie folgt lautet:
tabelle2
+-------+-------+
| level | id |
+-------+-------+
| 0 | 5 |
| 1 | 1 |
| 2 | 3 |
| 2 | 10 |
| 1 | 8 |
| 2 | 2 |
| 3 | 7 |
| 3 | 9 |
| 2 | 4 |
| 2 | 6 |
+-------+-------+
Daraus kann ich z. B. folgenden TreeView basteln (was dann nicht das Problem sein sollte):
0 1 2 3
----------
5
|
+- 1
| |
| +- 3
| |
| +- 10
|
+- 8
|
+- 2
| |
| +- 7
| |
| +- 9
|
+- 4
|
+- 6
Die Frage ist nun, wie komme ich von tabelle1 zu tabelle2?
Ich habe zwar schon diverse Lösungsansätze, aber der Groschen ist noch nicht richtig gefallen.
Im Forum habe ich natürlich auch schon gesucht :-) aber auch http://forum.de.selfhtml.org/archiv/2004/3/75206/#m433175, was ein ähnliches Problem beschreibt, hat den Groschen nicht in Bewegung versetzt.
Hat jemand von euch einen Lösungsansatz?
Danke für jeden Tipp und
viele Grüße
Horst
Hallo Horst Reinelt,
ich glaube, die Umformung ist unnötig, da du das mit einer einzigen (rekursiv aufgerufenen) Funktion lösen kannst.
Pseudo-Code, da ich kein Perl kann:
Funktion(parent)
"SELECT id FROM <tabelle> WHERE parent = " & parent
Schlaufe für jeden Datensatz
id ausgeben
Funktion mit id als Parameter aufrufen: Funktion(id)
Loop
Ende Funktion
Funktion erstmals aufrufen: Funktion(0)
Hoffe, das war jetzt einigermassen verständlich...
Gruss,
Daniel
Hi,
Funktion(parent)
"SELECT id FROM <tabelle> WHERE parent = " & parent
Schlaufe für jeden Datensatz
id ausgeben
Funktion mit id als Parameter aufrufen: Funktion(id)
Loop
Ende Funktion
es ist performanter die gesamte Datensatzmenge erst einmal in ein Array zu holen und erst dann darauf eine Funktion loszulassen, die die angeforderte Umformung durchfuehrt.
Die Umformungsfunktion durchlaeuft dabei die o.g. Datensatzmenge und baut sich Datensatz fuer Datensatz die neue Struktur. Dabei ist in die neue Strukur jeweils an bestimmten zu ermittelnden Stellen ein Datensatz einzufuegen. Beide Strukturen habe dieselbe Anzahl Datensaetze. Die Reihenfolge ist bei der zweiten Struktur wichtig, d.h. diese transportiert Information.
Gruss,
Ludger
Hallo Daniel!
ich glaube, die Umformung ist unnötig, da du das mit einer einzigen (rekursiv aufgerufenen) Funktion lösen kannst.
Das erste Ergebnis sieht recht vielversprechend aus - und das mit sechs Zeilen Code!
Vielen Dank
Ciao Horst