+1 800 256 3608 (toll-free in North America) or +49 7531 90 60 10| service@combit.com

Tabelle rekursiv verschachteln


(Patrick Müller) #1

Hallo,

ich möchte eine Liste für Artikel erzeugen, welche ineinander verschachtelt sind.

Beispielhaft soll die Liste folgendermaßen aussehen:

Artikel Nr. 1
…Unterartikel zu 1 Nr. 2
…Unterartikel zu 1 Nr. 3
…Unterartikel zu 1 Nr. 4
…Unterartikel zu 4 Nr. 5
…Unterartikel zu 4 Nr. 6
…Unterartikel zu 4 Nr. 7
…Unterartikel zu 1 Nr. 8
…Unterartikel zu 1 Nr. 9
…Unterartikel zu 9 Nr. 10
…Unterartikel zu 9 Nr. 11
…Unterartikel zu 9 Nr. 12

Ich habe dazu die Daten in einem Dataset an LL übergeben. Enthalten ist eine Tabelle und eine Relation. Die Relation verknüpft die Tabelle mit sich selbst über eine ID und eine ParentID.

LL stellt diese Relation in der Feldliste auch richtig dar. Ich kann dort meine Tabelle aufklappen, darunter wird wieder die Tabelle angezeigt usw.

Ich finde nur keine Lösung, wie ich diese Daten darstellen kann.

Vielleicht hat jemand eine Idee, ich wäre dankbar für jeden Denkanstoß.

Gruß
Patrick


(combit Support - Patrick Preuschoff) #2

Hallo Patrick,

vielen Dank für Ihren Beitrag.

Für eine korrekte Darstellung würden Sie die maximal denkbare Tiefe als Ebene in der Datenstruktur wählen. Für Ihr oben genanntes Beispiel wäre dies wie folgt möglich:

(Schematische Darstellung der Objektliste im LL Designer)

[Berichtscontainer]
Tabelle 1 - Ebene 1
Tabelle 1 - Ebene 2
Tabelle 1 - Ebene 3

Wenn für eine Tabelle auf einer tieferen Ebene keine Daten mehr existieren, dann wird diese Tabelle auch nicht gedruckt, sodass die von Ihnen gewünschte Darstellung damit erreicht werden sollte.

Mit freundlichen Grüßen

Patrick Preuschoff
Technischer Support
combit GmbH


(Patrick Müller) #3

Hallo Herr Preuschoff,

vielen Dank für Ihre Antwort. Ich entnehme Ihren Zeilen, das mein Vorhaben eigentlich nicht lösbar ist, wenn nicht bekannt ist, wie groß die maximale Ebenentiefe sein wird. Bei einer größeren Anzahl an Ebenen wird auch das Handling, Formatierung usw. sehr umständlich, weil jede Änderung für jedene Ebenentiefe mitgezogen werden muß.

Ich habe mir jetzt folgendermaßen geholfen:

Backend ist bei mir eine Microsoft SQL DB.
Es gibt eine Tabelle, deren Zeilen auf andere Zeilen in der gleichen Tabelle verweisen. (1:n Relation)
Die Ebenentiefe ist unbekannt und unterschiedlich.

Zur Abfrage der Daten nutze ich CTE um die Rekursion abzubilden. Ich erhalte dann alle Zeilen ab einem Knoten für alle darunterliegenden Ebenen.
Dann nutze ich die PARTITION BY-Funktion und ROW_NUMBER() um eine virtuelle Gruppierung über die ParentID zu erhalten und die Zeilennummer innerhalb der Gruppierung.
Damit lässt sich dann Datensatzweise einen String zusammenbauen der die Ebene enthält. ( 1. , 1.1 , 1.2 , 1.2.1 , 1.2.1.1 , 1.2.1.2 usw.)
Nach dieser Ebene lässt sich dann in LL sortieren und ebenfalls gruppieren.
Ich muß dafür nur eine einzige Tabelle in LL pflegen, kann trotzdem Gruppensumme abbilden etc…

Ich hoffe es ist einigermaßen verständlich. Für jemanden der die gleiche Funktionalität benötigt hilft Google mit den Begriffen SQL CTE PARTITION ROW_NUMBER. Damit lassen sich einige verständliche Beispiele finden.

Ich bin damit vorerst zufrieden.

Grüße
Patrick Müller