![]() |
Datenbank: Firebird • Version: 3.x • Zugriff über: IBDAC
[SQL] Zwischensummen
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:
Die Rechnungssume beträgt hier 360 EUR. (Ist nicht Bestandteil der Tabelle.)
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) 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:
Die Rechnungssume beträgt hier 306 EUR. (Ist nicht Bestandteil der Tabelle.)
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) Weiterhin möchte ich die Summe aller Rechnungen möglichst einfach bilden können. Z.B. so:
Code:
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?
Select sum(Preis) from RechnungsPositionen where Artikeltyp = 'Artikel' or Artikeltyp ='KommisionsSumme'
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! |
AW: [SQL] Zwischensummen
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. |
AW: [SQL] Zwischensummen
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.
|
AW: [SQL] Zwischensummen
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.
|
AW: [SQL] Zwischensummen
Zitat:
Code:
Select sum(Preis) from RechnungsPositionen where Artikeltyp = 'Artikel' or Artikeltyp ='KommisionsSumme'
|
AW: [SQL] Zwischensummen
Zitat:
|
AW: [SQL] Zwischensummen
Zitat:
|
AW: [SQL] Zwischensummen
Zitat:
In FastReport kannst Du diese Zwischensummen auch bilden und so ausdrucken |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:16 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