Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Problem mit Group by in Access (https://www.delphipraxis.net/200783-problem-mit-group-access.html)

Luckner 25. Mai 2019 11:25

AW: Problem mit Group by in Access
 
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQ L.Add('SELECT Materialrollen.[Mat-Nr], Materialrollen.Rollennummer, Materialrollen.DatumAb, Rollenlager.Lagerplatz, Rollenlager.Rollennummer FROM Materialrollen ');
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQ L.Add('LEFT JOIN Rollenlager ON Rollenlager.Rollennummer = Materialrollen.Rollennummer where ((Materialrollen.[Mat-Nr] = ' + EditMaterialeingangMatNr.Text + ') and (Materialrollen.DatumAb is NULL))');

Delphi.Narium 25. Mai 2019 11:51

AW: Problem mit Group by in Access
 
Das SQL ist dashier ohne den Delphiquelltext:
SQL-Code:
SELECT Materialrollen.[Mat-Nr], Materialrollen.Rollennummer, Materialrollen.DatumAb, Rollenlager.Lagerplatz, Rollenlager.Rollennummer FROM Materialrollen
LEFT JOIN Rollenlager ON Rollenlager.Rollennummer = Materialrollen.Rollennummer where Materialrollen.[Mat-Nr] = :MatNr and Materialrollen.DatumAb is NULL
Die Zahl der Spalten hinter dem Select ist mehr als nur die Spalte Lagerplatz, von daher kann das nicht das SQL sein, welches Dir das Ergebnis
Zitat:

Als Ergebnis bekomme ich:
[Lagerplatz]
P001
P007
P014
P014
P014
P014
P014
P015
geliefert hat.

Wenn Du im Ergebnis nur die Spalte Lagerplatz haben möchtest, dann selektiere im SQL bitte auch nur die Spalte Lagerplatz.

Hast Du dashier schonmal probiert?
SQL-Code:
SELECT Rollenlager.Lagerplatz FROM Materialrollen
LEFT JOIN Rollenlager ON Rollenlager.Rollennummer = Materialrollen.Rollennummer
where (Materialrollen.[Mat-Nr] = :MatNr
   and Materialrollen.DatumAb is NULL)
group by Rollenlager.Lagerplatz
Oder in Delphi, zum Direktkopieren:
Delphi-Quellcode:
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Add('SELECT Rollenlager.Lagerplatz FROM Materialrollen LEFT JOIN Rollenlager ON Rollenlager.Rollennummer = Materialrollen.Rollennummer where ((Materialrollen.[Mat-Nr] = ' + EditMaterialeingangMatNr.Text + ') and (Materialrollen.DatumAb is NULL)) group by Rollenlager.Lagerplatz');

Lesbarer als ein reines SQL?
Nein, natürlich nicht
Verständlicher als ein reines SQL?
Nein natürlich nicht.
Vorab auf der Datenbank testbares SQL?
Nein natürlich nicht.

Auch wenn der Quelltext dadruch länger wird und es etwas mehr Schreibarbeit wird:
Delphi-Quellcode:
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Clear;
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Add('SELECT Rollenlager.Lagerplatz')
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Add('FROM Materialrollen');
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Add('LEFT JOIN Rollenlager');
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Add('ON Rollenlager.Rollennummer = Materialrollen.Rollennummer');
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Add('where Materialrollen.[Mat-Nr] = :MatNr');
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Add('and Materialrollen.DatumAb is NULL');
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Add('group by Rollenlager.Lagerplatz');
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.Parameters.ParamByName('MatNr').Value := EditMaterialeingangMatNr.Text;
Vielleicht mal so in der Art probieren?

Luckner 25. Mai 2019 12:07

AW: Problem mit Group by in Access
 
Hallo Delphi.Narium,

habe hier einen 27"-Monitor. Die meisten SQL-Abfragen passen in eine Zeile. Für mich viel übersichtliger als mehrere Zeilen übereinander. Geschmacksache. Gebe das Ergebnis in einem DBGrid aus, deshalb nur der Lagerplatz. Wenn ich den Select-Vorschlag benutze, dann bekomme ich eine Fehlermeldung, dass "Mat-Nr" fehlt.

Luckner

Delphi.Narium 25. Mai 2019 12:23

AW: Problem mit Group by in Access
 
Der Vorschlag enthält einen Parameter, der muss auch befüllt werden.

Daher in meinem Delphiquelltrextvorschlag auch die Zeile:

Delphi-Quellcode:
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.Parameters.ParamByName('MatNr').Value := EditMaterialeingangMatNr.Text;


Diese Fehlermeldung bekommst Du garantiert nicht:
Zitat:

Wenn ich den Select-Vorschlag benutze, dann bekomme ich eine Fehlermeldung, dass "Mat-Nr" fehlt.
sondern allenfalls eine Fehlermeldung, aus der Du diesen Schluss ziehst. Bitte Fehlermeldung per Copy&Paste aus der Fehlermeldung übernehmen und hier einfügen.

Derweil, die von Dir gepostete Fehlerbeschreibung lässt nicht erkennen, ob nun die Spalte Mat-Nr fehlt oder der Parameter MatNr.

Zugegeben, Accessfehlermeldungen sind nicht immer zwingend aufschlussreich, sondern eher vage. Aber wenn Du uns jeweils einfach die Originalfehlermeldung mitteilst, ist das deutlich einfacher.

Luckner 25. Mai 2019 12:32

AW: Problem mit Group by in Access
 
ok, mache ich.

jobo 25. Mai 2019 12:59

AW: Problem mit Group by in Access
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1433120)

Die Zahl der Spalten hinter dem Select ist mehr als nur die Spalte Lagerplatz, von daher kann das nicht das SQL sein...


Hast Du dashier schonmal probiert?
SQL-Code:
SELECT Rollenlager.Lagerplatz FROM Materialrollen
LEFT JOIN Rollenlager ON Rollenlager.Rollennummer = Materialrollen.Rollennummer
where (Materialrollen.[Mat-Nr] = :MatNr
   and Materialrollen.DatumAb is NULL)
group by Rollenlager.Lagerplatz

Das war wohl das nächstes Missverständnis. Die Darstellung des Sollergebnis hat nichts mit dem vorhandenen, falschen SQL Code zu tun.

Also mit der Angabe aus #29 ist die Anforderung recht übersichtlich. Und wie Du vermutet hast, müsste die Lösung so aussehen wie von Dir zitiert.

Es würde tatsächlich ein Distinct ohne group by reichen.

@Lucker: Egal wie groß der Monitor ist und welche Gewohnheiten Du hast. Die Mehrheit hat andere. Wenn Du es den Helfern also erleichtern möchtest, ist eine übersichtliche Formatierung besonders entgegenkommend.
Vermutlich würde so eine simple Aufteilung eines Statements in mehrere Zeilen für
Select Clause
From Clause / Join
Where Clause
[Group by ..]
[Order ..]
auch Deinem eigenen Verständnis dienen.

P.S.: Es gibt nette IDE, die SQL Text auf Knopfdruck formatieren, es gibt sogar einige, die Copy/Paste von/nach Delphi anbieten. Ist beides nicht zur Hand, tut's auch ein online Formatierer.

Delphi.Narium 25. Mai 2019 13:17

AW: Problem mit Group by in Access
 
Zitat:

Zitat von jobo (Beitrag 1433125)
Vermutlich würde so eine simple Aufteilung eines Statements in mehrere Zeilen für
Select Clause
From Clause / Join
Where Clause
[Group by ..]
[Order ..]
auch Deinem eigenen Verständnis dienen.

Und hat den Vorteil, man kann mal einzelne Zeilen mit -- davor eben auskommentieren, um zu prüfen, ob das Ergebnis besser wird, eine Fehlermeldung verschwindet ...

In Delphi kann ich in einer Quelltextzeile auch mehrere Befehle hintereinanderschreiben, beim 27" wohl sogar ziemlich viele. Aber ob das der Les- und Wartbarkeit des Quelltextes dienlich ist, wage ich zu bezweifeln.

So wie man in Delphi logisch zusammgehörige Quelltextzeilen zusammenfasst, kann man das auch in SQL machen, auch wenn die Syntax das nicht zwingend erfordert oder man 50 Meter Quelltext in eine Zeile schreiben kann ;-)

Logische Strukturen im Quelltext (und dazu gehören auch SQL-Statements) haben für mich was mit Softwarequalität zu tuen. "Kilometerlange" Einzeiler gehören für mich nicht dazu.

haentschman 25. Mai 2019 13:30

AW: Problem mit Group by in Access
 
Hallo...8-)
Zitat:

Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQ L.Add('SELECT Rollenlager.Lagerplatz FROM Materialrollen LEFT JOIN Rollenlager ON Rollenlager.Rollennummer = Materialrollen.Rollennummer where ((Materialrollen.[Mat-Nr] = ' + EditMaterialeingangMatNr.Text + ') and (Materialrollen.DatumAb is NULL)) group by Rollenlager.Lagerplatz');
Das markierte geht gar nicht. :? In den Beispielen ist immer wieder von Parametern die Rede. Die brauchst du auch!
Grund: https://de.wikipedia.org/wiki/SQL-Injection

Zitat:

LEFT JOIN Rollenlager ON
Hier kannst du auch Aliase verwenden:
Zitat:

SELECT R.Lagerplatz FROM Materialrollen LEFT JOIN Rollenlager R ON R.Rollennumme...
...das macht das Ganze übersichtlicher. :thumb:

jobo 25. Mai 2019 18:40

AW: Problem mit Group by in Access
 
Zitat:

Zitat von haentschman (Beitrag 1433127)
Zitat:

Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQ L.Add('SELECT Rollenlager.Lagerplatz FROM Materialrollen LEFT JOIN Rollenlager ON Rollenlager.Rollennummer = Materialrollen.Rollennummer where ((Materialrollen.[Mat-Nr] = ' + EditMaterialeingangMatNr.Text + ') and (Materialrollen.DatumAb is NULL)) group by Rollenlager.Lagerplatz');
Das markierte geht gar nicht. :? In den Beispielen ist immer wieder von Parametern die Rede. Die brauchst du auch!

Ahh, das hab ich in den 10 Varianten aus den Augen verloren, die Materialnummer als Filter. Natürlich soll das ein Parameter sein!
Ein beliebiger Filter (where clause) auf irgendwelche Felder wirkt sich aber nicht auf Funktionsweise oder Syntax für Group by aus.

p80286 25. Mai 2019 19:22

AW: Problem mit Group by in Access
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1433120)

Auch wenn der Quelltext dadruch länger wird und es etwas mehr Schreibarbeit wird:
Delphi-Quellcode:
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Clear;
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Add('SELECT Rollenlager.Lagerplatz')
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Add('FROM Materialrollen');
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Add('LEFT JOIN Rollenlager');
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Add('ON Rollenlager.Rollennummer = Materialrollen.Rollennummer');
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Add('where Materialrollen.[Mat-Nr] = :MatNr');
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Add('and Materialrollen.DatumAb is NULL');
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Add('group by Rollenlager.Lagerplatz');
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.Parameters.ParamByName('MatNr').Value := EditMaterialeingangMatNr.Text;
Vielleicht mal so in der Art probieren?

oder so:
Delphi-Quellcode:
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.SQL.Text:='SELECT Rollenlager.Lagerplatz'+
   'FROM Materialrollen '+
   'LEFT JOIN Rollenlager '+
   'ON Rollenlager.Rollennummer = Materialrollen.Rollennummer '+
   'where Materialrollen.[Mat-Nr] = :MatNr ' +
   'and Materialrollen.DatumAb is NULL '+
   'group by Rollenlager.Lagerplatz');
Datamodule1.ADOQueryRollenJoinLagerplatzTabelle.Parameters.ParamByName('MatNr').Value := EditMaterialeingangMatNr.Text;
Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr.
Seite 4 von 5   « Erste     234 5      

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