Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   [SQL] Wie Gruppensumme bilden? (https://www.delphipraxis.net/207200-%5Bsql%5D-wie-gruppensumme-bilden.html)

BlueStarHH 10. Mär 2021 07:35

AW: [SQL] Wie Gruppensumme bilden?
 
Zitat:

Zitat von mkinzler (Beitrag 1484765)
Es fehlt die Group by


SQL-Code:
execute block
as

begin
  for select
    substring(vp.ArtikelNr from 1 for 5) as Gruppe,
    vp.ArtikelNr as ArtikelNr,
    max(vp.Beschreibung) as Beschreibung,
    max(vp.Farbe) as Farbe,
    sum(vp.Menge) as Menge,
    sum(vp.NettoSumme) as NettoSumme
  from
    VorgangPos vp
  group by
    vp.ArtikelNr
    into :gruppe, :ArtikelNr, :Beschreibung, :Farbe, :Menge, :NettoSumme do
  begin
    for select sum(Menge) from VorgangPos where substring(ArtikelNr from 1 for 5) = Gruppe into :Gruppenmenge do suspend;
  end
end

Super, das läuft im IBExpert in etwas mehr als einer Sekunde durch! Das Ergebnis ist ja nun in einzelnen Variablen im Execute block. Nur wie kann ich das Ergebnis nun als Datenmenge in Delphi nutzen? Sorry für die dumme Frage, aber ich hab noch nie mit dem execute block gearbeitet. Wenn ich das ganze in eine SP packe, habe ich ja das selbe Problem oder nicht? Die SP kann ja keine Datenmenge aus mehreren Records zurückgeben oder doch?

mkinzler 10. Mär 2021 08:07

AW: [SQL] Wie Gruppensumme bilden?
 
Im Header der SP / execution block die Spalten für die Rückgabe deklarieren, diese werden dann durch das suspend zurückgegeben.

SQL-Code:
execute block
  returns(
   gruppe char(5), ...
  )
as
...

IBExpert 10. Mär 2021 10:06

AW: [SQL] Wie Gruppensumme bilden?
 
und ergänzend zu mkinzler, wenn du da alle variablen als return parameter drin hast, kannst du bei naherzu jeder Query Komponente, die du auch für einen select benutzen kannst, die property sql mit dem execute block .... text füllen und mit open dann durch die datenmenge laufen.

und wenn es mal eine summe, aber auch mal keine summe geben könnte , dann geht noch folgende änderung

Code:
   
select sum(Menge) from VorgangPos where substring(ArtikelNr from 1 for 5) = Gruppe into :Gruppenmenge;
suspend;
damit würdest du auch einen record zur äußeren Hauptdatenmenge bekommen, wenn es gar keine details in VorgangPos gibt
(ist in diesem fall wegen dem Sum() nicht so wichtig, weil der immer genau einen record liefert, wen das die einzige spalte ist, aber wichtig ist das der "for select ... into" auf einer datenmenge die immer nur einen record liefert auch wenig sinnvoll.

und als logik: immer wenn dein quelltext in einem execute block oder auch in eine sp beim schlüsselwort suspend landet, wird das was in den return parametern steht als record erzeugt und kann damit in delphi bei der query mit while not eof und next ausgewertet werden

eine execute block muss auch gar noch zwingend auf einer datenmenge entstehen auch so was geht nämlich

Code:
execute block
returns (anz integer)
as
begin
 anz=1;
 suspend;
 anz=2;
 suspend;
end
auf dem weg kann man sehr komplexe ergebnisse zeilenweise und spaltenweise zusammenstellen, bei denen man mit einem sql statement abstruse verschachtelungen oder unions brauchen würde


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:16 Uhr.
Seite 3 von 3     123   

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