AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi DELPHI-Fehler in Master/Detail-Verknüfungem über MasterFields
Thema durchsuchen
Ansicht
Themen-Optionen

DELPHI-Fehler in Master/Detail-Verknüfungem über MasterFields

Ein Thema von daddy · begonnen am 14. Jun 2024 · letzter Beitrag vom 17. Jun 2024
Antwort Antwort
Seite 1 von 2  1 2      
daddy

Registriert seit: 9. Sep 2005
Ort: Köln
126 Beiträge
 
Delphi 7 Enterprise
 
#1

DELPHI-Fehler in Master/Detail-Verknüfungem über MasterFields

  Alt 14. Jun 2024, 13:33
Datenbank: Firebird • Version: 3 • Zugriff über: TClientDataSet
Ich bin dabei ein Projekt von Delphi 7 auf Delphi 11 zu migrieren und habe ein Problem, das ich damals durch einen eigenen Eingriff in die Delphi-Quellcodes gelöst habe, das aber überraschenderweise auch in Delphi 11 immer noch besteht.

Es geht um eine VCL-Anwendung mit Firebird-Anbindung. Der Zugriff auf Firebird erfolgt über TClientDataSets, die über TDataSetProvider mit TSQLDataSets kommunizieren. An vielen Stellen werden Master-Detail-Verknüpfungen benötigt. Diese werden bereitgestellt, indem im TClientDataSet der Detailtabelle die Eigenschaften "MasterSource", "MasterFields" und "IndexFieldNames" gefüllt sind. Bei einfachen SQL-Selects funktioniert das auch:

Beispiel Master:
Select * from Liefeant
Beispiel Detail:
Select * from LieferantKontakt

Die Tabelle Lieferant hat ein Feld "Nummer", die Tabelle Kontakt ein Feld "LNummer", das sich auf das Feld Nummer bezieht. Mein Programm verhält sich genauso wie gewünscht.

Meistens sind die Detailtabellen aber ein wenig komplexer aufgebaut und stellen auch Daten anderer Tabellen bereit. Und dies führt zwangsläufig zu Fehlermeldungen von Delphi, egal ob Version 7 oder 11.
Hier einfache Beispiele für nicht funktionierende Abfragen, bei denen zur Tabelle LieferantKontakt noch ein Bezeichner aus einer Tabelle KontakArt geholt wird:
Detail:
Select L.*, K.Bezeichnung from LieferantKontakt left join KontaktArt K on L.KANummer = K.Nummer
oder
Select L.*, (Select K.Bezeichnung from KontaktArt where Nummer = L.KANummer) as Bezeichnung from LieferantKontakt

Ich habe per Debugging im Delphi-Quellcode die Funktion "AddParamSQLForDetail" in der Unit "Data.DBCommon.Pas" als Ursache für das Problem herausgefunden, die einfach fehlerhaft arbeitet und offensichtlich nur mit einfach gestrickten Anweisungen der Art "Select * from <Table> order by <Column>" zurechtkommt. Weder Joins noch Unterselects werden in irgendeiner Form korrekt erkannt und berücksichtigt. Das in meinem obigen Beispiel von der Funktion eingefügte "where LNummer = ?" landet in diesen Fällen an der falschen Stelle und führt somit zu einer ungültigen Select-Anweisung.
Natürlich könnte ich das Problem irgendwie umschiffen oder wieder - wie damals bei Delphi 7 - den delphieigenen Code korrigieren. Aber das erste macht mir aufgrund des Projektumfangs ziemlich viel Aufwand und das zweite zwingt mich bei jedem Delphi-Update die Korrekturen erneut vorzunehmen.

Kennt irgend jemand von euch (oder von Embarcadero) dieses Problem und hat evtl. eine bessere Lösung?
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
674 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: DELPHI-Fehler in Master/Detail-Verknüfungem über MasterFields

  Alt 14. Jun 2024, 14:02
Ich verwende FireDac zum zugriff auf alle DB und mache alles selber, dann muss sich FD nicht was ausdenken:
Code:
SELECT L.*, K.Bezeichnung
FROM LieferantKontakt L
LEFT JOIN KontaktArt K ON L.KANummer = K.Nummer
WHERE L.Nummer = :MasterField
ORDER BY L.Whatever
Ich hatte mit dieser Methode noch nie Probleme.
Noch MasterFields und DetailFields eintragen um FD noch ein bisschen weiter entgegen zu kommen... aber das muss nicht sein.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.016 Beiträge
 
Delphi 12 Athens
 
#3

AW: DELPHI-Fehler in Master/Detail-Verknüfungem über MasterFields

  Alt 14. Jun 2024, 14:29
Hat devart auch direkt was für Firebird?

Wir nutzen pgDAC für den Zugriff auf PostreSQL.
OK, inzwischen auch an einigen Ecken schonmal FireDAC (das war aber vor allem wegen des LocalSQL)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.431 Beiträge
 
Delphi 12 Athens
 
#4

AW: DELPHI-Fehler in Master/Detail-Verknüfungem über MasterFields

  Alt 14. Jun 2024, 14:48
Hat devart auch direkt was für Firebird?
IBDAC oder UniDAC

Ich verwende aber auch in der Regel nur noch FireDAC, allein schon weil es in meiner Architect Edition dabei ist.

Nur in Ausnahmefällen muss ich mich an abweichende Kundenvorgaben halten.

Ich habe per Debugging im Delphi-Quellcode die Funktion "AddParamSQLForDetail" in der Unit "Data.DBCommon.Pas" als Ursache für das Problem herausgefunden, die einfach fehlerhaft arbeitet und offensichtlich nur mit einfach gestrickten Anweisungen der Art "Select * from <Table> order by <Column>" zurechtkommt. Weder Joins noch Unterselects werden in irgendeiner Form korrekt erkannt und berücksichtigt. Das in meinem obigen Beispiel von der Funktion eingefügte "where LNummer = ?" landet in diesen Fällen an der falschen Stelle und führt somit zu einer ungültigen Select-Anweisung.
Gibt es dafür einen Bugreport? Falls nicht: https://qp.embarcadero.com/
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.016 Beiträge
 
Delphi 12 Athens
 
#5

AW: DELPHI-Fehler in Master/Detail-Verknüfungem über MasterFields

  Alt 14. Jun 2024, 15:04
privat nur 'ne Pro.
da fehlt leider auch Linux und iProdukte hab'sch net.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
daddy

Registriert seit: 9. Sep 2005
Ort: Köln
126 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: DELPHI-Fehler in Master/Detail-Verknüfungem über MasterFields

  Alt 14. Jun 2024, 17:03
@ Sinspin
Mir ist natürlich klar, dass ich das Problem durch Änderungen in der Programmierung lösen kann. Es handelt sich aber um ein sehr umfangreiches Projekt und ich würde sehr viel Arbeit damit haben, alle Beziehungen dieser Art zu ändern. Ich bin einfach sehr überrascht, dass ein solch grober Fehler auch nach fast 20 Jahren noch in Delphi enthalten ist. Bin ich der Einzige der mit der genannten Konstellation von Komponenten arbeitet und Master/Detail-Beziehungen wie ursprünglich von Delphi vorgesehen nutzt?

@ Uwe Raabe
Ja, ich werde das mal an Embarcadero weitergeben. Das wird vermutlich nur keine schnelle Lösung für mein aktuelles Problem bringen.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.431 Beiträge
 
Delphi 12 Athens
 
#7

AW: DELPHI-Fehler in Master/Detail-Verknüfungem über MasterFields

  Alt 14. Jun 2024, 17:25
Ich bin einfach sehr überrascht, dass ein solch grober Fehler auch nach fast 20 Jahren noch in Delphi enthalten ist.
Wenn das niemand gemeldet hat...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
589 Beiträge
 
Delphi XE6 Enterprise
 
#8

AW: DELPHI-Fehler in Master/Detail-Verknüfungem über MasterFields

  Alt 14. Jun 2024, 18:01
Mittels Views könntest Du komplexe Selektionen vereinfachen.
Code:
Create Or Alter View Name1 As Select L.*, K.Bezeichnung from LieferantKontakt left join KontaktArt K on L.KANummer = K.Nummer
und
Code:
Create Or Alter View Name2 As Select L.*, (Select K.Bezeichnung from KontaktArt where Nummer = L.KANummer) as Bezeichnung from LieferantKontakt
und dann hast Du wieder die ganz einfachen Anweisungen
Code:
Select * From Name1
und
Code:
Select * from Name2
.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.431 Beiträge
 
Delphi 12 Athens
 
#9

AW: DELPHI-Fehler in Master/Detail-Verknüfungem über MasterFields

  Alt 14. Jun 2024, 18:56
Ich kenne jetzt zwar das genaue Problem nicht, aber bei Master-/Detail-Beziehungen geht es ja darum, ein Master-Dataset und ein Detail-DataSet zu haben, wobei letzteres alle Detail-Records zu dem jeweils aktuellen Master-Record enthält. Ich kann im Moment noch nicht sehen, wie da die Select-Anweisungen reinspielen.

Andererseits liegt der Fehler ja offenbar innerhalb der Funktion AddParamSQLForDetail, in der eine SQL-Anweisung geparst und ergänzt wird. Da der Parser relativ simpel gestrickt ist (wobei das schon eine Wissenschaft für sich ist), kann ich mir schon vorstellen, dass der nicht für komplexe SQLs funktioniert. Umso wichtiger ist eben, die entsprechenden Fehlerfälle zu melden. Andernfalls wird das nämlich nie behoben.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.016 Beiträge
 
Delphi 12 Athens
 
#10

AW: DELPHI-Fehler in Master/Detail-Verknüfungem über MasterFields

  Alt 14. Jun 2024, 19:02
Vielleicht bei automatischer Verknubbelung der DataSets?

Weiß jetzt nicht wie FireDAC arbeitet, aber bei pgDAC gibt es mehrere Modi.

* man gibt das/die Field(s) des Masters an und das/die Field(s) des Details ... das WHERE wird automatisch gebaut und angehängt
* man gibt das/die Field(s) des Masters an und das/die Param(s) des Details ... das WHERE ist manuell ins SELECT eingebaut

und noch etwas für Grids (DevExpress oder so) mit eingebettetem SubGrid (je Datenzeile)
* man gibt das/die Field(s) des Masters an und das/die Field(s) des Details ... die Details sind ALLE geladen und werden per Filter zur Laufzeit gesucht
so ist es möglich bei allen/mehreren Masterzeilen je ein SubGrid einzublenden (gleichzeitig)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 00:42 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