Einzelnen Beitrag anzeigen

FediDelPr

Registriert seit: 16. Feb 2018
112 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#11

AW: Zeileninhalt direkt aus Parameter erzeugen

  Alt 22. Feb 2019, 02:58
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, '000000AS Srt FROM Hierarchie h1a WHERE (h1a.Parent = :ParamInteger1)

   UNION

   SELECT
     h1.ArtLink AS Level1,
     2 AS HLevelx,
     '00' & h1.Sort & '00AS 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.
  Mit Zitat antworten Zitat