Zugriff auf eine n:m Verknüpfung
- af0815
- Lazarusforum e. V.
- Beiträge: 6791
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Zugriff auf eine n:m Verknüpfung
Ich mache seit Jahren so und es funktioniert immer. Auch weiße ich oft das Update, Insert oder Delete SQL zu, da ich den internen SQL Parser nicht die Deutungshoheit überlasse. Damit kann ich auch Views updaten. Damit brauche ich auch kein ParseSQL.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 289
- Registriert: Mo 24. Aug 2020, 14:16
- OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
- CPU-Target: i386
Re: Zugriff auf eine n:m Verknüpfung
Dito, nur habe ich wie gesagt noch nie ein Param händisch erstellt oder erstellen müssen. Zuweisung von SQL mit entsprechender Syntax reicht aus, um gleich anschließend ParamByName() aufrufen zu können.
Re: Zugriff auf eine n:m Verknüpfung
übrigens:
SQL entwickle ich zuerst auf HeidiSQL und übernehme das dann einfach in den Programmcode.
Da kann man schön erkennen, was zurück kommt und wo man einen Bock drin hat...
SQL entwickle ich zuerst auf HeidiSQL und übernehme das dann einfach in den Programmcode.
Da kann man schön erkennen, was zurück kommt und wo man einen Bock drin hat...
Gruß, Michael
-
- Beiträge: 88
- Registriert: Sa 18. Jan 2020, 09:56
- OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
- CPU-Target: Windows 64-Bit
Re: Zugriff auf eine n:m Verknüpfung
Hallo,
richtig, ich glaube es fehlt eine Where-Klausel. Stimmt auch, ich benutze FlameRobin und da kann man es auch schon ausprobieren. Hatte diese vergessen.
Gruß, Luckner
richtig, ich glaube es fehlt eine Where-Klausel. Stimmt auch, ich benutze FlameRobin und da kann man es auch schon ausprobieren. Hatte diese vergessen.
Gruß, Luckner
-
- Beiträge: 88
- Registriert: Sa 18. Jan 2020, 09:56
- OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
- CPU-Target: Windows 64-Bit
Re: Zugriff auf eine n:m Verknüpfung
Habe es folgendermassen gelöst:
('SELECT * FROM KUNDENSTAMM k ');
('join KUNDENLIEFERADRESSEN kl on k.ID=kl.IDKUNDEN ');
('join ADRESSENSTAMM a on a.ID = kl.IDADRESSEN ');
('where k.ID = ' + IntToStr(KundenID);
Jetzt sieht es gut aus.
Danke, Luckner
('SELECT * FROM KUNDENSTAMM k ');
('join KUNDENLIEFERADRESSEN kl on k.ID=kl.IDKUNDEN ');
('join ADRESSENSTAMM a on a.ID = kl.IDADRESSEN ');
('where k.ID = ' + IntToStr(KundenID);
Jetzt sieht es gut aus.
Danke, Luckner
-
- Beiträge: 1064
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: Zugriff auf eine n:m Verknüpfung
Sorry, aber ich bin auch nach allen Hilfeversuchen immer noch verwirrt.
@Luckner Um qualifizierte Hilfe bei Datenbanken geben zu können fehlt für mich einerseits die betroffene Struktur der Datenbank (also die Tabellen die du abfragen willst). hier fragst du nach einer Abfrage von Lieferadressen und hier bringst du plötzlich eine neue Tabelle ADRESSENSTAMM ins Spiel.
Andererseits ist eine Abfrage völlig sinnfrei (wenns jetzt nicht gerade ein akademisches Beispiel für SQL ist) ohne erkennen zu können was und vor allem wie du etwas anzeigen willst.
Anders gesagt, eine kleine Skizze oder ein Screenshot deines Formulars wäre hilfreich - zumindest für mich.
Nur als Beispiel:
Bist du in einem Formular mit einer Kundenliste und willst irgendwie die Lieferadresse des jeweilig ausgewählten Kunden anzeigen oder bist du in einer Editiermaske eines Kunden bzw Rechnung und brauchst dort irgendwie eine Auswahl von Lieferadressen. Die gewünschte Darstellung bedingt die Art der Abfrage.
zudem bekommst du vielleicht auch nebenbei Tips wie man etwas idealerweise angeht, weil etliche Forumsteilnehmer schon viele Stunden mit der Optimierung solcher Systeme verbracht haben. Allein zum Thema "gemeinsamer Adressenstamm" hätte ich einiges beizutragen
...und ist die Frage (außer meinem Post) ausreichend beantwortet oder nicht?
Extempore:
In meinen DB-Applikationen versuche ich die abzufragenden Daten immer möglichst gering zu halten. Statt einer Gesamtliste aller Kunden zum Blättern (ist auch schon bei kleinen Datenmengen unhandlich) gibt es als Einstieg immer eine Möglichkeit das gewünschte Objekt (in deinem Fall den einen Kunden den du bearbeiten willst) mit harten (zB Kundennummer, Name, Kurzname) und weichen (Soundex, Teile von Ort, PLZ oder anderen Parametern) zu finden. Die eigentliche Bearbeitung des Kunden erfolgt dann in einem weiteren Formular. mehrere Kunden können immer auch gleichzeitig bearbeitet werden (was dann noch andere Probleme macht, aber das ginge hier zu weit). Ebenfalls versuche ich die SQL-Statements so zu schreiben dass sie unabhängig vom jeweiligen Dialekt der Datenbank sind. Damit kann man die dahinter liegende DB immer gegen eine andere (ggfs größere) austauschen. Sollte mal etwas vorkommen was nur durch Datenbank-Spezifika lösbar ist landet das idealerweise als View oder stored procedure in der DB, deren Ergebnis auch wieder nur eine Tabelle ist.
hope that helps anyway
@Luckner Um qualifizierte Hilfe bei Datenbanken geben zu können fehlt für mich einerseits die betroffene Struktur der Datenbank (also die Tabellen die du abfragen willst). hier fragst du nach einer Abfrage von Lieferadressen und hier bringst du plötzlich eine neue Tabelle ADRESSENSTAMM ins Spiel.
Andererseits ist eine Abfrage völlig sinnfrei (wenns jetzt nicht gerade ein akademisches Beispiel für SQL ist) ohne erkennen zu können was und vor allem wie du etwas anzeigen willst.
Anders gesagt, eine kleine Skizze oder ein Screenshot deines Formulars wäre hilfreich - zumindest für mich.
Nur als Beispiel:
Bist du in einem Formular mit einer Kundenliste und willst irgendwie die Lieferadresse des jeweilig ausgewählten Kunden anzeigen oder bist du in einer Editiermaske eines Kunden bzw Rechnung und brauchst dort irgendwie eine Auswahl von Lieferadressen. Die gewünschte Darstellung bedingt die Art der Abfrage.
zudem bekommst du vielleicht auch nebenbei Tips wie man etwas idealerweise angeht, weil etliche Forumsteilnehmer schon viele Stunden mit der Optimierung solcher Systeme verbracht haben. Allein zum Thema "gemeinsamer Adressenstamm" hätte ich einiges beizutragen

...und ist die Frage (außer meinem Post) ausreichend beantwortet oder nicht?
Extempore:
In meinen DB-Applikationen versuche ich die abzufragenden Daten immer möglichst gering zu halten. Statt einer Gesamtliste aller Kunden zum Blättern (ist auch schon bei kleinen Datenmengen unhandlich) gibt es als Einstieg immer eine Möglichkeit das gewünschte Objekt (in deinem Fall den einen Kunden den du bearbeiten willst) mit harten (zB Kundennummer, Name, Kurzname) und weichen (Soundex, Teile von Ort, PLZ oder anderen Parametern) zu finden. Die eigentliche Bearbeitung des Kunden erfolgt dann in einem weiteren Formular. mehrere Kunden können immer auch gleichzeitig bearbeitet werden (was dann noch andere Probleme macht, aber das ginge hier zu weit). Ebenfalls versuche ich die SQL-Statements so zu schreiben dass sie unabhängig vom jeweiligen Dialekt der Datenbank sind. Damit kann man die dahinter liegende DB immer gegen eine andere (ggfs größere) austauschen. Sollte mal etwas vorkommen was nur durch Datenbank-Spezifika lösbar ist landet das idealerweise als View oder stored procedure in der DB, deren Ergebnis auch wieder nur eine Tabelle ist.
hope that helps anyway
Re: Zugriff auf eine n:m Verknüpfung
das "select *" würde ich so nicht machen. Besser du beschreibst, was du benötigst.
Ansonsten würde ich Params einsetzen. Der Vorteil ist, dass z.B. immer richtig maskiert wird.
('where k.ID = ' + IntToStr(KundenID);
zu
('where k.ID = :KID;' );
ParamByName('KID').asinteger:=KundenID;
Ansonsten würde ich Params einsetzen. Der Vorteil ist, dass z.B. immer richtig maskiert wird.
('where k.ID = ' + IntToStr(KundenID);
zu
('where k.ID = :KID;' );
ParamByName('KID').asinteger:=KundenID;
Gruß, Michael
-
- Beiträge: 1064
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: Zugriff auf eine n:m Verknüpfung
Yeahhh !!!six1 hat geschrieben: Fr 1. Apr 2022, 10:58 das "select *" würde ich so nicht machen. Besser du beschreibst, was du benötigst.
Ansonsten würde ich Params einsetzen. Der Vorteil ist, dass z.B. immer richtig maskiert wird.
-
- Beiträge: 1064
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: Zugriff auf eine n:m Verknüpfung
Kann immer noch nicht verstehen wieso zum Abfragen der Lieferadressen bei bekannter KundenID der Kundenstamm als Junk mit abgefragt wird. Traust du der SQL Datenbank nicht?Luckner hat geschrieben: Fr 1. Apr 2022, 10:35 ('SELECT * FROM KUNDENSTAMM k ');
('join KUNDENLIEFERADRESSEN kl on k.ID=kl.IDKUNDEN ');
('join ADRESSENSTAMM a on a.ID = kl.IDADRESSEN ');
('where k.ID = ' + IntToStr(KundenID);
Wenn ich ein komplexeres SQL-Statment entwickle hab ich auch immer Prüfspalten mit dabei um zu sehen ob ICH keinen Mist gebaut hab. Die fliegen im endgültigen Statement aber wieder raus.
So mal aus der Hüfte, unter Schätzung der Spaltennamen
Code: Alles auswählen
SELECT
k.PLZ
, k.Ort
, k.Strasse
, k.Hausnummer
, k.DerGanzeRest
FROM ADRESSENSTAMM k
JOIN KUNDENLIEFERADRESSEN kl ON kl.IDADRESSEN = k.IDADRESSEN
WHERE kl.ID = :KundenID;
Code: Alles auswählen
SELECT
k.PLZ
, k.Ort
, k.Strasse
, k.Hausnummer
, k.DerGanzeRest
FROM KUNDENLIEFERADRESSEN kl
JOIN ADRESSENSTAMM k ON kl.IDADRESSEN = k.IDADRESSEN
WHERE kl.ID = :KundenID;
- af0815
- Lazarusforum e. V.
- Beiträge: 6791
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Zugriff auf eine n:m Verknüpfung
Params +1
"select *" für mich ein nogo
"select *" für mich ein nogo
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).