Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Zeileninhalt direkt aus Parameter erzeugen (https://www.delphipraxis.net/199802-zeileninhalt-direkt-aus-parameter-erzeugen.html)

FediDelPr 22. Feb 2019 01:58

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:
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.

Jasocul 22. Feb 2019 08:05

AW: Zeileninhalt direkt aus Parameter erzeugen
 
Zitat:

Zitat von FediDelPr (Beitrag 1426223)
Die bezeichneten Zeilen (1,2) sind noch ungenügend, es darf nur ein Element erzeugt werden.

Laut deiner Darstellung der Geräteliste muss es unter (1) zwei Ergebniszeilen geben (Gehäuse und Netzteil).
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:

Zitat von FediDelPr (Beitrag 1426223)
Bei ParamInteger1,2,3 wird der gleiche Wert übergeben.

Dann nimm auch nur einen Parameter. Es sei denn, du musst für zukünftige Aufgaben an der Stelle mit unterschiedlichen Paramtern rechnen.

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

p80286 22. Feb 2019 08:25

AW: Zeileninhalt direkt aus Parameter erzeugen
 
Zitat:

Zitat von Jasocul (Beitrag 1426228)
Dann nimm auch nur einen Parameter.

Das könnte in die Hose gehen. Wenn ich mich richtig erinnere darf bei ADO ein Parameter nur einmal genutzt werden.

Gruß
K-H

Jasocul 22. Feb 2019 08:37

AW: Zeileninhalt direkt aus Parameter erzeugen
 
Zitat:

Zitat von p80286 (Beitrag 1426229)
Zitat:

Zitat von Jasocul (Beitrag 1426228)
Dann nimm auch nur einen Parameter.

Das könnte in die Hose gehen. Wenn ich mich richtig erinnere darf bei ADO ein Parameter nur einmal genutzt werden.

OK, das war mir nicht bekannt. Fehlende ADO-Erfahrung :wink:

FediDelPr 22. Feb 2019 09:39

AW: Zeileninhalt direkt aus Parameter erzeugen
 
Vielen Dank für's mitdecken.
Bin voraussichtlich mindestens bis Sonntag abwesend (ohne PC-Zugang).
Bis dann.

Schokohase 22. Feb 2019 10:15

AW: Zeileninhalt direkt aus Parameter erzeugen
 
Zitat:

Zitat von p80286 (Beitrag 1426229)
Zitat:

Zitat von Jasocul (Beitrag 1426228)
Dann nimm auch nur einen Parameter.

Das könnte in die Hose gehen. Wenn ich mich richtig erinnere darf bei ADO ein Parameter nur einmal genutzt werden.

Das Thema haben wir schon beantwortet und deine Erinnerung ist trübe.
https://www.delphipraxis.net/199766-...ml#post1425912

Jasocul 22. Feb 2019 13:05

AW: Zeileninhalt direkt aus Parameter erzeugen
 
Zitat:

Zitat von Schokohase (Beitrag 1426238)
Das Thema haben wir schon beantwortet und deine Erinnerung ist trübe.

Das würde bedeuten, dass ich das Thema gelesen haben müsste. :wink:

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 10:03 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz