Zugriff auf eine n:m Verknüpfung

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5185
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Zugriff auf eine n:m Verknüpfung

Beitrag von af0815 »

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

Sieben
Beiträge: 174
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

Beitrag von Sieben »

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.

Benutzeravatar
six1
Beiträge: 643
Registriert: Do 1. Jul 2010, 19:01

Re: Zugriff auf eine n:m Verknüpfung

Beitrag von six1 »

ü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...
Gruß, Michael

Luckner
Beiträge: 34
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

Beitrag von Luckner »

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

Luckner
Beiträge: 34
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

Beitrag von Luckner »

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

charlytango
Beiträge: 487
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz 2.0 fixes FPC 3.2 fixes
CPU-Target: Win 32Bit, 64bit
Wohnort: Wien

Re: Zugriff auf eine n:m Verknüpfung

Beitrag von charlytango »

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

Benutzeravatar
six1
Beiträge: 643
Registriert: Do 1. Jul 2010, 19:01

Re: Zugriff auf eine n:m Verknüpfung

Beitrag von six1 »

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;
Gruß, Michael

charlytango
Beiträge: 487
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz 2.0 fixes FPC 3.2 fixes
CPU-Target: Win 32Bit, 64bit
Wohnort: Wien

Re: Zugriff auf eine n:m Verknüpfung

Beitrag von charlytango »

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.
Yeahhh !!!

charlytango
Beiträge: 487
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz 2.0 fixes FPC 3.2 fixes
CPU-Target: Win 32Bit, 64bit
Wohnort: Wien

Re: Zugriff auf eine n:m Verknüpfung

Beitrag von charlytango »

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);
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?
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;
oder auch andersrum, je nachdem wie der jeweilige Statement-Optimizer drauf ist

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;
wobei ich das mit dem direkt integrierten Adressenstamm immer noch für bedenklich halte (auch aus beleghistorischer Sicht)

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5185
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Zugriff auf eine n:m Verknüpfung

Beitrag von af0815 »

Params +1

"select *" für mich ein nogo
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten