Zur Problemstellung:
Es geht um die Erzeugung einer bestimmten Abbildung aus einer Baumstruktur bzw. einer (geordneten)
Hierarchie. Für jeden Hierarchie-Level werden Einträge erzeugt. Für den ersten Level
nur einen.
Die zu Grunde liegenden Daten sind in einer einfachen Linktabelle organisiert. (ArtLink und
Parent)
Einziger Eingangsparameter ist ein Link (Referenz) auf das Top-Element.
Delphi-Quellcode:
GerätXY <= Top-Element
Gehäuse
Gehäuse-Boden
Gehäuse-Deckel
Netzteil
Netzteil-Gehäuse
ElektronikBoard zu Netzteil
.... etc.
Zum besseren Verständis sind hier konkrete Assemblies/Komponenten eingetragen.
Die Hierarchie-Tabelle enthält in Wirklichkeit nur die Verlinkungen (und Sortierinfos)
Ich gebe mal den Code wieder der fast richtig arbeitet. Er würde eben wie gewünscht laufen, wenn
der erste Select nach dem UNION nur ein Element (nämlich den Parameter selbst) liefern würde.
Zurzeit entstehen zusätzliche Zeilen.
Der Code ist hier für 3 Hierarchie-Level wiedergegeben und wird schlussendlich auf 10 Level ausgebaut.
Eine rekursive Implementation wäre sicher wünschenswert, aber allenfalls Gegenstand einer späteren
Betrachtung.
Delphi-Quellcode:
SELECT
Parent,
HLevel,
Bezeichnung,
Srt
FROM
(
SELECT DISTINCT Parent, 1 AS HLevel, '000000' AS Srt FROM Hierarchie h1a WHERE (h1a.Parent = :ParamInteger1)
UNION
SELECT
h1.ArtLink AS Level1,
2 AS HLevelx,
'00' & h1.Sort & '00' AS Srt
FROM
(
1 (SELECT ArtLink, Parent, Sort FROM Hierarchie h1a WHERE (h1a.Parent = :ParamInteger2)) h1
LEFT JOIN Hierarchie h2 ON (h1.ArtLink = h2.Parent))
UNION
SELECT
h2.ArtLink AS Level2,
3 AS HLevel,
'00' & h1.Sort & h2.Sort AS Srt
FROM
((
2 (SELECT ArtLink, Parent, Sort FROM Hierarchie h1a WHERE (h1a.Parent = :ParamInteger3)) h1
LEFT JOIN Hierarchie h2 ON (h1.ArtLink = h2.Parent))
LEFT JOIN Hierarchie h3 ON (h2.ArtLink = h3.Parent))
) ha
LEFT JOIN Artikel ar ON (ha.Parent = ar.ArtikelID)
ORDER BY Srt
Die bezeichneten Zeilen (1,2) sind noch ungenügend, es darf nur ein Element erzeugt werden.
Bei ParamInteger1,2,3 wird der gleiche Wert übergeben.
Ich habe schon Lösungen, diese benötigt aber auf jedem Hierarchie-Level einen
zusätzlichen SELECT bzw. Massnahmen für die Elimination von Zeilen mit NULL-Werten.
Bei der Lösung geht es nicht um Laufzeit-Betrachtungen.
Bis anhin(ähnliche Auswertungen) ist alles äusserst schnell.
Es geht mir mehr um kompakten und sauberen Code, leicht verständlich, gut wartbar, nichts Unnötiges/Redundantes.
Und.. ich weiss es gibt bessere DBs als
ACCESS, aber das steht aus bestimmten Gründen zurzeit
nicht zur Diskussion.