AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Zeileninhalt direkt aus Parameter erzeugen
Thema durchsuchen
Ansicht
Themen-Optionen

Zeileninhalt direkt aus Parameter erzeugen

Ein Thema von FediDelPr · begonnen am 20. Feb 2019 · letzter Beitrag vom 22. Feb 2019
Antwort Antwort
Seite 2 von 2     12   
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
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.355 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Zeileninhalt direkt aus Parameter erzeugen

  Alt 22. Feb 2019, 09:05
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.


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
Peter

Geändert von Jasocul (22. Feb 2019 um 13:53 Uhr) Grund: Hinweis von p80286 und Schokohase berücksichtigt
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#13

AW: Zeileninhalt direkt aus Parameter erzeugen

  Alt 22. Feb 2019, 09:25
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.355 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Zeileninhalt direkt aus Parameter erzeugen

  Alt 22. Feb 2019, 09:37
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
Peter
  Mit Zitat antworten Zitat
FediDelPr

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

AW: Zeileninhalt direkt aus Parameter erzeugen

  Alt 22. Feb 2019, 10:39
Vielen Dank für's mitdecken.
Bin voraussichtlich mindestens bis Sonntag abwesend (ohne PC-Zugang).
Bis dann.
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#16

AW: Zeileninhalt direkt aus Parameter erzeugen

  Alt 22. Feb 2019, 11:15
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

Geändert von Schokohase (22. Feb 2019 um 11:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.355 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Zeileninhalt direkt aus Parameter erzeugen

  Alt 22. Feb 2019, 14:05
Das Thema haben wir schon beantwortet und deine Erinnerung ist trübe.
Das würde bedeuten, dass ich das Thema gelesen haben müsste.

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
...
Peter
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:15 Uhr.
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