AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Problem mit Group by in Access

Problem mit Group by in Access

Ein Thema von Luckner · begonnen am 24. Mai 2019 · letzter Beitrag vom 5. Jun 2019
Antwort Antwort
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#1

AW: Problem mit Group by in Access

  Alt 25. Mai 2019, 09:52
Wie wär es wenn Du mal eine Beispielliste mit den Daten machst, die Du ohne group by hast und wie es mit group by aussehen soll?!
Ich habe immernochnicht verstanden, was Du genau willst, bzw. wenn ich es doch verstanden haben sollte, sind passende Abfragen hier im Thread bereits vorhanden.

Um den Test und die Entwicklung des passenden SQLs zu vereinfachen, solltest Du diese zuerst mal in Access testen und dann später in den Delphiquelltext übernehmen. Fehler sind so deutlich einfacher zu finden und statt "ellenlange" SQLs per + Edit.text + zusammenzubauen, eventuell Parameter verwenden, auch das macht die SQLs deutlich übersichtlicher und leichter les- und testbar.

Group by gruppiert Datensätze so, das sie eindeutig werden.
Distinct (Accress DistinctRow?) gruppiert Datensätze so, das sie eindeutig werden.

Das ist doppeltgemoppelt und zeigt, wenn es tatsächlich erforderlich sein sollte, dass die Abfrage fehlerhaft ist.

Wenn ich mit Group By etwas eindeutig mache und das Eindeutige anschließend per Distinct eindeutig machen muss, dann passt da was nicht.
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
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Problem mit Group by in Access

  Alt 25. Mai 2019, 10:40
Irgendwie geht's nicht weiter.
@Luckner: Deine Beschreibungen sind sicher gut gemeint, aber es gibt tatsächlich einige Varianten, die man mit den gegebenen Feldern und Group By und Aggregaten produzieren könnte.

Das Ganze in Delphi Code eingekleidet macht es nicht übersichtlicher. Dieser Hinweis von Delphi.Narium ist auch wertvoll. Das pure SQL kannst Du direkt life in Access ausprobieren. Access bietet für die Abfragen den Klickermodus und den SQL Editor. (Zumindest ging das früher in Access, ich geh davon aus, es wurde nicht weg"optimiert")


Vorschlag:
Mach eine Access Abfrage der ungruppierten Daten und kopier ein paar Sätze hier ins Forum als Ausgangsdaten.
Diese Sätze editierst Du dann so um, dass sie deiner Zielvorstellung entsprechen und postest sie auch.

Distinct:
Schlimmstenfalls ist das tatsächlich doppelt gemoppelt, tut aber allermeistens nicht weh, auch wenn es praktisch möglich ist, dass ein Distinct das Ergebnis eines Group by verändert(zerstört).
Gruß, Jo

Geändert von jobo (25. Mai 2019 um 10:43 Uhr)
  Mit Zitat antworten Zitat
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Problem mit Group by in Access

  Alt 25. Mai 2019, 10:45
Hallo jobo,
DistinctRow habe ich rausgenommen. Fehler identisch. Ich glaube, ich muss mit einem Access-Programmierer reden. Habe schnell unter Firebird diese 2 Tabellen nachgebildet und da gibt es keine Fehlermeldung. Aber ich werde das Ergebnis der Abfrage ohne Group By und dann meine Vorstellung hier posten.

Gruß, Luckner
  Mit Zitat antworten Zitat
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Problem mit Group by in Access

  Alt 25. Mai 2019, 10:52
Als Ergebnis bekomme ich:
[Lagerplatz]
P001
P007
P014
P014
P014
P014
P014
P015

Haben möchte ich:
[Lagerplatz]
P001
P007
P014
P015

Luckner
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#5

AW: Problem mit Group by in Access

  Alt 25. Mai 2019, 11:17
Bitte noch das reine SQL zu dem "Als Ergebnis bekomme ich: "

Eigentlich sollte da ein reines Group by Lagerplatz am Ende reichen.
  Mit Zitat antworten Zitat
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Problem mit Group by in Access

  Alt 25. Mai 2019, 11:25
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))');
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#7

AW: Problem mit Group by in Access

  Alt 25. Mai 2019, 11:51
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: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?
  Mit Zitat antworten Zitat
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: Problem mit Group by in Access

  Alt 25. Mai 2019, 12:07
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
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Problem mit Group by in Access

  Alt 25. Mai 2019, 19:22

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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 23:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz