![]() |
AW: Zeileninhalt direkt aus Parameter erzeugen
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:
Zum besseren Verständis sind hier konkrete Assemblies/Komponenten eingetragen.
GerätXY <= Top-Element
Gehäuse Gehäuse-Boden Gehäuse-Deckel Netzteil Netzteil-Gehäuse ElektronikBoard zu Netzteil .... etc. 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:
Die bezeichneten Zeilen (1,2) sind noch ungenügend, es darf nur ein Element erzeugt werden.
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 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. |
AW: Zeileninhalt direkt aus Parameter erzeugen
Zitat:
Dementsprechend unter (2) vier Zeilen (Gehäuse-Boden, Gehäuse-Deckel, Netzteil-Gehäuse und ElektronikBoard zu Netzteil). Sollte meine Analyse falsch sein, verstehe ich da wohl etwas nicht. Zitat:
Ich habe mal versucht, dein Aufgabe unter den gesetzten Bedingungen auf meine Weise zu lösen. Da ich kein Access zur Verfügung habe, ist das natürlich ins blaue getippt und völlig ungeprüft! Unter MS-SQL, Oracle o.ä. würde ich das vermutlich eher mit einer User-Defined-Function lösen. Wobei das aber sehr von der exakten Aufgabe abhängt. Für eine Visualisierung in einer Anwendung, würde ich sicher andere Wege gehen. Hier mein Ansatz:
Code:
SELECT *
FROM ( SELECT 1 AS HLevel, AR.Bezeichnung, '000000' AS Srt FROM Hierarchie H1 LEFT JOIN Artikel AR ON AR.ArtikelID = H1.Parent WHERE H1.Parent = :ParamInteger1 UNION SELECT 2 AS HLevel, AR.Bezeichnung, '00' & h2.Sort & '00' AS Srt FROM Hierarchie H1 LEFT JOIN Hierarchie H2 ON H2.ArtLink = H1.Parent LEFT JOIN Artikel AR ON AR.ArtikelID = H2.ArtLink WHERE H1.Parent = :ParamInteger2 UNION SELECT 3 AS HLevel, AR.Bezeichnung, '00' & h2.Sort & h3.Sort AS Srt FROM Hierarchie H1 LEFT JOIN Hierarchie H2 ON H2.ArtLink = H1.Parent LEFT JOIN Hierarchie H3 ON H3.ArtLink = H2.ArtLink LEFT JOIN Artikel AR ON AR.ArtikelID = H3.ArtLink WHERE H1.Parent = :ParamInteger3 ) order by Srt |
AW: Zeileninhalt direkt aus Parameter erzeugen
Zitat:
Gruß K-H |
AW: Zeileninhalt direkt aus Parameter erzeugen
Zitat:
|
AW: Zeileninhalt direkt aus Parameter erzeugen
Vielen Dank für's mitdecken.
Bin voraussichtlich mindestens bis Sonntag abwesend (ohne PC-Zugang). Bis dann. |
AW: Zeileninhalt direkt aus Parameter erzeugen
Zitat:
![]() |
AW: Zeileninhalt direkt aus Parameter erzeugen
Zitat:
Aber wenn wir schon dabei sind, geht vielleicht sowas mit ADO / ACCESS:
Code:
Declare @Param1 int = :ParamInteger1
... SELECT 1 AS HLevel, AR.Bezeichnung, '000000' AS Srt FROM Hierarchie H1 LEFT JOIN Artikel AR ON AR.ArtikelID = H1.Parent WHERE H1.Parent = @Param1 UNION SELECT 2 AS HLevel, AR.Bezeichnung, '00' & h2.Sort & '00' AS Srt FROM Hierarchie H1 LEFT JOIN Hierarchie H2 ON H2.ArtLink = H1.Parent LEFT JOIN Artikel AR ON AR.ArtikelID = H2.ArtLink WHERE H1.Parent = @Param1 ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz