AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[SQL] Zwischensummen

Ein Thema von BlueStarHH · begonnen am 3. Apr 2022 · letzter Beitrag vom 5. Apr 2022
Antwort Antwort
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
848 Beiträge
 
Delphi 11 Alexandria
 
#1

[SQL] Zwischensummen

  Alt 3. Apr 2022, 11:30
Datenbank: Firebird • Version: 3.x • Zugriff über: IBDAC
Hallo,
ich habe eine Tabelle mit Rechnungspositionen. Diese wird in einem CxGrid dargestellt. Eine vereinfachte Darstellung, nur mit den für die Fragestellung relevanten Feldern, ist unten zu sehen.
Nun möchte ich die Möglichkeit haben Zwischesummen auszurechnen und anzuzeigen. Und zwar auf zwei verschiedene Arten:

1)
Hier soll die Zwischensumme die Summe aller Positionen vom Anfang der Tabelle bis zur ersten Zwischensumme (A) oder die Summe zwischen zwei Zwischensummen (B) sein:
Code:
Position Artikeltyp   Bezeichnung  Preis
       1 Artikel      Tastatur       50
       2 Artikel      Maus           10
(A)      Zwischesumme Zwischesumme   60 (=50+10)
       3 Artikel      MS Office     100
       4 Artikel      Photoshop     200
(B)      Zwischesumme Zwischensumme 300 (=100+200)
Die Rechnungssume beträgt hier 360 EUR. (Ist nicht Bestandteil der Tabelle.)

2)
Hier soll es eine spezielle Zwischensumme (C) geben: Dabei wird zuerst wieder die Zwischensumme wie gehabt berechnet nun aber mit einem Kommissionssatz multipliziert. Nur das Ergebnis davon geht in die Gesamte Rechnungssume ein. Die Preise Positionen 1 und 2 sind nur für die Rechnung wichtig und dürfen nicht mehr in der Rechnungssume berücksichtig werden.

Code:
Position Artikeltyp        Bezeichnung      Preis
       1 KommisionsArtikel Tastatur          50
       2 KommisionsArtikel Maus              10
(C)      KommisionsSumme   10 % Kommision     6 (=Kommissionssatz 10 % auf Zwischensumme 60 EUR = 6 EUR [weil: (50+10) * 0,1 = 6]
       3 Artikel           MS Office        100
       4 Artikel           Photoshop        200
(D)      Zwischensumme     Zwischensumme    300 (=100+200)
Die Rechnungssume beträgt hier 306 EUR. (Ist nicht Bestandteil der Tabelle.)

Weiterhin möchte ich die Summe aller Rechnungen möglichst einfach bilden können. Z.B. so:
Code:
Select sum(Preis) from RechnungsPositionen where Artikeltyp = 'Artikel' or Artikeltyp ='KommisionsSumme'
Wie mache ich das am besten? Trigger auf die Rechnungspostionen? Immer wenn es eine Änderung gibt, schauen ob die Zwischesummen berechnet werden müssen? Wie würde das SQL für eine Zwischensumme aussehen? Wie wird mein CxGrid dann aktualisiert? Durch den Trigger könnte ja ein anderer Datensatz geändert werden, als der Datensatz in dem ich gerade mit dem Cursor bin. Wie bekommt das cxGrid das mit?
Oder sollten die Zwischensummen gar nicht in der DB gespeichert werden und nur in der GUI angezeigt werden? Bei dem Kommissionssatz müssen sie aber in die DB, da sie dort für die Rechnungssume gebraucht wird.

Wie würde man mit diesen Anforderungen am besten umgehen? Danke!
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
671 Beiträge
 
FreePascal / Lazarus
 
#2

AW: [SQL] Zwischensummen

  Alt 3. Apr 2022, 17:58
ich würde das in etwa so machen

-erzeugen eine sp, die deine positionen zurückliefert mit suspend so wie du die brauchst
-die relevanten datensätze per for select in die return variablen packen und nach jedem record ein suspend
(for select ..... into ..... do begin ...... suspend; ..... end vereinfacht
-ein mal am anfang deine zwischensummen variablen mit 0 belegen
-wenn nach deiner Logik eine Zwischensumme kommen sollte, dann einfach das was gerade in der Zwischensumme zusammengerechnet wurde, in die passende Return Spalte eintrage, den rest ggf leeren und dann aufgrund deiner bedingung damit noch einen extra suspend mit den dann neuen variablen machen und bei bedarf die zwischensumme wieder auf 0 setzen
-die komplette spkannst du dann mit select * from spname (:ggf_Variablen_eingeben) von jedem Client aus aufrufen , also im report design, im grid oder wo auch immer
-wenn das editierbar bleiben soll, machst du noch einen updatable view oben auf die sp drauf

wenn du das alles im client machen willst, dann viel erfolg, datenbankseitig ist das mit firebird bordmitteln simpel zu machen, noch komplexer sogar wenn man dazu gtt global temporary tables benutzt. Mit einem sql ginge das ähnlich wie in der sp mit execute block, aber es ist nicht damit getan, hier und dann mal eben sum und group by befehle einzubauen.

Hilft dir zwar nicht wirklich weiter (es sei denn du bist bei IBExpert Hotline kunde), aber ich geh davon aus, das man für das lauffähige Grundgerüst der Anforderung maximal 10-20 Minuten braucht und so was machen wir im Rahmen der Hotline für Kunden regelmßig. Ist halt eine Frage was einem (oder dem Arbeitgeber) die eigene Arbeitszeit wert ist, so was stunden- oder tagelang auszutüfteln, ohne irgendwelche Fortschritte zu machen.
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: [SQL] Zwischensummen

  Alt 4. Apr 2022, 09:52
Nur mal aus Neugier. Woran erkennt man bei "Aufgabe 1" das nach 1&2 und nach 3&4 jeweils eine Zwischensumme gewünscht ist? Bei "Aufgabe 2" könnte man es ja am Artikeltyp erkennen.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
675 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: [SQL] Zwischensummen

  Alt 4. Apr 2022, 10:13
Das cxGrid an sich ist schon fähig, diese Zwischensummen zu bilden, aber Du musst eine Gruppierung für die Zwischensummen bilden für das Grid. Das baust Du dann GroupLevels und die kriegen einen Footer wo Du die Summen reinschreibst.
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
848 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: [SQL] Zwischensummen

  Alt 5. Apr 2022, 11:49
Nur mal aus Neugier. Woran erkennt man bei "Aufgabe 1" das nach 1&2 und nach 3&4 jeweils eine Zwischensumme gewünscht ist? Bei "Aufgabe 2" könnte man es ja am Artikeltyp erkennen.
Es gibt dann einen Datensatz mit dem Artikeltyp "Zwischesumme". Dieser wird vom Anwender dort eingefügt, wo er die Zwischensumme haben möchte. Datensätze vom Typ "Zwischesumme" gehen dann *nicht* in die Gesamtsumme ein:

Code:
Select sum(Preis) from RechnungsPositionen where Artikeltyp = 'Artikel' or Artikeltyp ='KommisionsSumme'
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
848 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: [SQL] Zwischensummen

  Alt 5. Apr 2022, 11:50
Das cxGrid an sich ist schon fähig, diese Zwischensummen zu bilden, aber Du musst eine Gruppierung für die Zwischensummen bilden für das Grid. Das baust Du dann GroupLevels und die kriegen einen Footer wo Du die Summen reinschreibst.
Da wäre dann nur das Problem, dass ich die Summen nicht im Report hätte. Also wohl doch alles in der DB berechnen...
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
848 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: [SQL] Zwischensummen

  Alt 5. Apr 2022, 11:53
ich würde das in etwa so machen... [alles in der DB]
Danke Holger, das hört sich gut aber auch aufwendig an, wenn man das noch nicht so gemacht hat. Ich komme auf Deine Hotline zurück. Ich bin mir bloss noch nocht sicher, wie man das Grid ohne Seiteneffkete synchron bekommt, wenn die DB-Tabelle durch trigger an meheren Stellen geändert wird. Wenn ich gerade was im Grid bearbeite, soll der Cursor ja nicht wegspringen und solche Sachen.
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
675 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: [SQL] Zwischensummen

  Alt 5. Apr 2022, 11:56
Das cxGrid an sich ist schon fähig, diese Zwischensummen zu bilden, aber Du musst eine Gruppierung für die Zwischensummen bilden für das Grid. Das baust Du dann GroupLevels und die kriegen einen Footer wo Du die Summen reinschreibst.
Da wäre dann nur das Problem, dass ich die Summen nicht im Report hätte. Also wohl doch alles in der DB berechnen...
DevExpress hat ein Reportsystem, wo Du das Grid über den ComponentPrinter ausdruckst, das druckt die Zwischensummen mit.
In FastReport kannst Du diese Zwischensummen auch bilden und so ausdrucken
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:34 Uhr.
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