
Hallo,
ich weiss, dass diese Frage schon vielfach diskutiert wurde, trotzdem stelle ich sie nochmals.
In einer DB liegt eine Tabelle mit folgenden Inhalten vor:
+---------+----------------+----------------------------------------+ | firm_id | firm_parent_id | firm_name | +---------+----------------+----------------------------------------+ | 1 | 9 | Auto | | 2 | 9 | Automobil Vertriebs- GmbH | | 3 | 9 | Autohaus GmbH | | 4 | 9 | Autocenter P GmbH | | 5 | 4 | Autocenter O | | 6 | 9 | Autohandel & Service GmbH | | 7 | 9 | Karosserie- u. Lackierereiservice GmbH | | 8 | 9 | Kraftfahrzeuge | | 9 | 0 | XYZ GmbH | +---------+----------------+----------------------------------------+ Nach der Datenbankabfrage habe ich die Ergebnisse als ein Tupel mit 9 Dictionaries vorliegen: ( {'id': 1, 'parent_id': 9, 'name': Auto}, {...}, ... ) Die Struktur der DB kann ich leider nicht ändern. Leider habe ich über Google nicht passendes für mich gefunden (adjazenz, ...)
Das Problem ist der Schritt vom Ergebnistupel zu einer Liste, welche einfach in einem wxTreeCtrl zu verarbeiten ist. Desweiteren ist vorher nie bekannt, wie tief die Hierarchie gestaffelt ist und wieviele Knoten auf dem obersten Level liegen.
Grüße Andreas
_______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Das Problem ist der Schritt vom Ergebnistupel zu einer Liste, welche einfach in einem wxTreeCtrl zu verarbeiten ist. Desweiteren ist vorher nie bekannt, wie tief die Hierarchie gestaffelt ist und wieviele Knoten auf dem obersten Level liegen.
Hi Andreas,
meiner Meinung nach ist deine Fragestellung ungeschickt. Was hast du denn genau vor? Wenn es sich um relativ wenige Daten handelt, kannst du den Baum rekursiv aufbauen da die Performance dann ziemlich egal sein dürfte. Oder du baust die Struktur im Speicher auf und füllst den Baum dann. Hast du aber eine beliebig tiefe Struktur mit sehr vielen Daten, würde ich den Baum garnicht ganz füllen, sondern die Daten on-the-fly einfügen. Wenn's wirklich Performance kritisch ist, wäre der beste Weg warsch. eine Mischlösung. Dazu müßtest du aber die Struktur der Tabelle ändern, und das willst du ja nicht.
Gruß, Achim
_______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Hallo Achim,
Am Dienstag, 6. Mai 2003 20:20 schrieb Achim Domma (ProCoders):
Das Problem ist der Schritt vom Ergebnistupel zu einer Liste, welche einfach in einem wxTreeCtrl zu verarbeiten ist. Desweiteren ist vorher nie bekannt, wie tief die Hierarchie gestaffelt ist und wieviele Knoten auf dem obersten Level liegen.
Hi Andreas,
meiner Meinung nach ist deine Fragestellung ungeschickt. Was hast du denn genau vor? Wenn es sich um relativ wenige Daten handelt, kannst du den Baum rekursiv aufbauen da die Performance dann ziemlich egal sein dürfte.
Die Datenmenge ist gering. Der Ergebnisdatensatz der Abfrage beinhaltet max. 500 Datensätze, normal sind ca. 20. Ich möchte eine rekursive Lösung anwenden. Die Performance sollte dabei im erträglichen Rahmen liegen.
Oder du baust die Struktur im Speicher auf und füllst den Baum dann. Hast du aber eine beliebig tiefe Struktur mit sehr vielen Daten, würde ich den Baum garnicht ganz füllen, sondern die Daten on-the-fly einfügen. Wenn's wirklich Performance kritisch ist, wäre der beste Weg warsch. eine Mischlösung. Dazu müßtest du aber die Struktur der Tabelle ändern, und das willst du ja nicht.
Von wollen kann keine Rede sein, das DB-Layout ist eine Vorgabe, ich kann daran nichts ändern.
Grüße Andreas
_______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Hi Andreas,
Die Datenmenge ist gering. Der Ergebnisdatensatz der Abfrage beinhaltet max. 500 Datensätze, normal sind ca. 20. Ich möchte eine rekursive Lösung anwenden. Die Performance sollte dabei im erträglichen Rahmen liegen.
dann würde ich die Lösung nehmen, die Jürgen Hermann beschrieben hat. Bei der Datenmenge würde ich erwarten, daß sie schnell genug ist. Oder bereitet die Rekursion dir Probleme?
Gruß, Achim
_______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Hallo Achim,
Am Mittwoch, 7. Mai 2003 08:23 schrieb Achim Domma (ProCoders):
Hi Andreas,
Die Datenmenge ist gering. Der Ergebnisdatensatz der Abfrage beinhaltet max. 500 Datensätze, normal sind ca. 20. Ich möchte eine rekursive Lösung anwenden. Die Performance sollte dabei im erträglichen Rahmen liegen.
dann würde ich die Lösung nehmen, die Jürgen Hermann beschrieben hat. Bei der Datenmenge würde ich erwarten, daß sie schnell genug ist. Oder bereitet die Rekursion dir Probleme?
Das Problem liegt bei der Rekursion. Die Lösung von JH habe ich auf den Ergebnisdatensatz angewendet und es funktioniert. Die Arbeit mit Dict., Listen, Tupels ist für mich noch etwas gewöhnungsbedürftig. Für einen Tipp aus der Liste wäre ich sehr dankbar.
Gruß, Achim
Grüße Andreas
_______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Das Problem liegt bei der Rekursion. Die Lösung von JH habe ich auf den Ergebnisdatensatz angewendet und es funktioniert. Die Arbeit mit Dict., Listen, Tupels ist für mich noch etwas gewöhnungsbedürftig. Für einen Tipp aus der Liste wäre ich sehr dankbar.
Einfach aus dem Kopf runtergeschrieben, ganz ohne Garantie. Die Idee sollte so aber stimmen:
d={} for x in a: d.setdefault(x['parent_id'], []).append(x)
rootNode = getRootOfWxControl()
def createChildNodes(node,id,data): for child in data[i]: newNode = node.createChild(item['id'],item['name']) createChildNodes(newNode,item['id'],data)
createChildNodes(rootNode,0,d)
Dabei ist rootNode der Toplevel Knoten deines Baums und node.createChild legt einen neuen Childknoten an. Die passenden 'echten' wxPython Funkionen mußt du dir selbst 'raussuchen. Bei Problemen frag' einfach nochmal.
Gruß, Achim
_______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

On Tue, 6 May 2003 20:04:46 +0200, Andreas Kaiser wrote:
a = ( {'id': 1, 'parent_id': 9, 'name': Auto}, {...}, ... )
d={} for x in a: d.setdefault(x['parent_id'], []).append(x)
d: dict von id auf kinder dieser id!
dann noch ne rekursive funktion über d und du hast es.
Ciao, Jürgen
_______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
participants (3)
-
Achim Domma (ProCoders)
-
Andreas Kaiser
-
Juergen Hermann