Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Materialbestand berechnen (https://www.delphipraxis.net/209880-materialbestand-berechnen.html)

Delphi.Narium 4. Feb 2022 10:58

AW: Materialbestand berechnen
 
Habe es gerade nochmal an 'ner eigene DB ausprobiert.

Es kann sein, dass man die Zeile
Delphi-Quellcode:
Query.SQL.Add('order by b.rollennr, b.materialnr');
bei Access weglassen muss. Das ist aber kein Beinbruch, dann macht man das Order by halt erst bei der Abfrage per
SQL-Code:
select * from v_quadratmeter order by rollennr, materialnr

Luckner 6. Feb 2022 14:41

AW: Materialbestand berechnen
 
Hallo Delphi.Narium

Code:
Query.SQL.Add('left join materialrollen b on (b.rollennr = a.rollennr) and (b.materialnr = a.materialnr)');
Die Zeile kann ich so nicht richtig nachvolziehen, denn in der Tabelle a (Rollenlager) gibt es nicht das Feld materialnr.

In meiner Abfrage (jetzt mit den original Bezeichnungen) habe die die Abfrage so eingetragen.
Code:
SELECT Materialrollen.Rollennummer, Materialrollen.[Mat-Nr], SUM(Materialrollen.[Arb-Breite] *  Materialrollen.lfm) as quadratmeter
FROM Materialrollen LEFT JOIN Rollenlager ON (Materialrollen.Rollennummer = Rollenlager.Rollennummer)
noch ohne GROUP BY usw. und bekomme jetzt einhen Fehler, den ich nicht verstehe:

"Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck 'Rollennummer' nicht als Teil einer Aggregatfunktion einschließt"

Wenn ich jedoch
Code:
, SUM(Materialrollen.[Arb-Breite] *  Materialrollen.lfm) as quadratmeter
weglasse, dann kann ich die Funktion aufrufen. Also ist an der Summen-Funktion etwas faul. Bitte um Hilfe.

Gruß, Luckner

Delphi.Narium 6. Feb 2022 14:56

AW: Materialbestand berechnen
 
Zitat:

"Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck 'Rollennummer' nicht als Teil einer Aggregatfunktion einschließt"
heißt nichts weiter, als dass das Group By fehlt.

Aggregatfunktionen, wie Sum, Count, ..., die zusätzlich zu nicht aggregierten Spalten in einem SQL vorkommen, funktionieren nur dann, wenn alle Spalten, die nicht aggregiert werden, im Group By enthalten sind.
SQL-Code:
SELECT
  Materialrollen.Rollennummer, -- nicht aggregiert
  Materialrollen.[Mat-Nr], -- nicht aggregiert
  SUM(Materialrollen.[Arb-Breite] *  Materialrollen.lfm) as quadratmeter -- aggregiert
FROM Materialrollen
LEFT JOIN Rollenlager
ON (Materialrollen.Rollennummer = Rollenlager.Rollennummer)
group by
  Materialrollen.Rollennummer, -- muss, da nicht aggregiert, ins Group By
  Materialrollen.[Mat-Nr] -- muss, da nicht aggregiert, ins Group By

Luckner 6. Feb 2022 15:19

AW: Materialbestand berechnen
 
Vielen Dank Delphi.Narium,

hatte nicht gedacht, dass am Sonntag irgend Jemand im Forum aktiv ist. Vielen Dank. Werde mir die JOIN-Verbindungen und entsprechende Kriterien unbedingt reinziehen.

Gruß, Luckner

Luckner 6. Feb 2022 15:56

AW: Materialbestand berechnen
 
Code:
  Datamodule1.ADOQueryMaterialGesamt.Active := False;
  Datamodule1.ADOQueryMaterialGesamt.SQL.Clear;
  Datamodule1.ADOQueryMaterialGesamt.SQL.Add('SELECT Materialrollen.Rollennummer, Materialrollen.[Mat-Nr], SUM((Materialrollen.[Arb-Breite]/1000) * Materialrollen.lfm) as quadratmeter');
  Datamodule1.ADOQueryMaterialGesamt.SQL.Add(' from Rollenlager');
  Datamodule1.ADOQueryMaterialGesamt.SQL.Add(' LEFT JOIN Materialrollen ON (Materialrollen.Rollennummer = Rollenlager.Rollennummer)');
  Datamodule1.ADOQueryMaterialGesamt.SQL.Add(' GROUP BY Materialrollen.[Mat-Nr], Materialrollen.Rollennummer');
  Datamodule1.ADOQueryMaterialGesamt.SQL.Add(' ORDER BY Materialrollen.[Mat-Nr]');

  Datamodule1.ADOQueryMaterialGesamt.Open;
Jetzt bekommen ich in der Tabelle jede Rolle mit der berechneten Fläche angezeigt. D.h. für ein Material mit 10 Rollen, wird diese Angabe 10-mal in der Tabelle angezeigt. Kann ich die jetzt pro Materialrollen.[Mat-Nr] addieren zu einer Summe?

Danke, Luckner

Delphi.Narium 6. Feb 2022 17:05

AW: Materialbestand berechnen
 
Ja, indem Du die Spalte Materialrollen.Rollennummer in der Auswahl (hinter dem Select) und im Group By weglässt.
SQL-Code:
SELECT Materialrollen.[Mat-Nr], SUM((Materialrollen.[Arb-Breite]/1000) * Materialrollen.lfm) as quadratmeter
from Rollenlager
LEFT JOIN Materialrollen ON (Materialrollen.Rollennummer = Rollenlager.Rollennummer)
GROUP BY Materialrollen.[Mat-Nr]
ORDER BY Materialrollen.[Mat-Nr]

Luckner 8. Feb 2022 14:21

AW: Materialbestand berechnen
 
Hallo Delphi.Narium,

vielen Dank. Es hat mich wirklich weitergebracht. Jetzt werde ich mich mit den Join's beschäftigen, weil so richtig habe ich die Funktionsweise eines Join's nicht verstanden. Aber es es gibt im Netz so einige Beispiele und die werde ich mir reinziehen.

Gruß, Luckner

Delphi.Narium 8. Feb 2022 16:23

AW: Materialbestand berechnen
 
Wenn ich datenbankunabhängige Hilfe zu SQL benötige, fange ich immer hier an: W3Schools - SQL Tutorial

jobo 8. Feb 2022 21:11

AW: Materialbestand berechnen
 
Zitat:

Zitat von Luckner (Beitrag 1501876)
.. weitergebracht. Jetzt werde ich mich mit den Join's beschäftigen, weil so richtig habe ich die Funktionsweise eines Join's nicht verstanden.

JOIN und seine Varianten, z.B. LEFT JOIN ist eine spezifische Form von WHERE. Sie ist standardisiert und funktioniert so für verschiedene DB Hersteller identisch (nicht alle haben den vollen Standard bzw. dessen Besonderheiten umgesetzt, alle haben aber Eigenheiten jenseits des Standards, klar).

JOIN dient explizit der Verknüpfung von 2 Datenquellen, während WHERE das teilweise auch kann, hauptsächlich aber eine Filterfunktion darstellt. (Mit der Filterfunktion wird auch die Tabellenverknüpfung erreicht)

JOIN ist moderner und hat verschiedene Vorteile. Nicht unbedingt offensichtlich für Leute, die es nicht kennen: JOIN erhöht die Lesbarkeit eines Select Statements. Man kann direkt lesen, welche Tabellen verknüpft sind (und wie) und so auch leichter bemerken, wenn eine Verknüpfung fehlt oder falsch ist. Alles was nicht JOIN ist, kommt ins WHERE und filtert "nur noch" das Gesamtergebnis. Das ist bei komplexen Statements naturgemäß besonders hilfreich.

JOIN ist (oft) mächtiger als WHERE, von FULL JOIN, über LEFT, RIGHT bis FULL OUTER kann man schon sehr viel abbilden. Es gibt weitere ..

JOIN hilft der Abfrage Optimierung (je nach Hersteller). Bedeutet nichts anderes, als das damit auch die DB im SQL Statement besser erkennen kann, wie sie am besten an eine Abfrage rangeht.

Nach der Empfehlung von Delphi.Narium würde ich noch ergänzen, dass es beim SQL lernen sehr hilfreich ist, selbst mit einer DB kleine Beispiele auszuprobieren, die auch optisch / im Kopf leicht nachvollziehbar sind. Geht sogar online mit vielen DB.

https://dbfiddle.uk/?rdbms=sqlserver...86707996fcf359

Luckner 10. Feb 2022 13:26

AW: Materialbestand berechnen
 
Hallo Delphi.Narium, hallo jobo,

danke für die Links. Werde mich mit beiden beschäftigt. Den Link von jobo finde ich genial, weil man dort gleich einige selection's ausprobieren kann. Wird mir richtig helfen.

Vielen Dank.

Gruß, Luckner


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:03 Uhr.
Seite 2 von 4     12 34      

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