Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Rave - Kalkulation mit mehreren Detailbändern (https://www.delphipraxis.net/73825-rave-kalkulation-mit-mehreren-detailbaendern.html)

lowmax_5 24. Jul 2006 15:22


Rave - Kalkulation mit mehreren Detailbändern
 
Hallo,

ich bin am verzweifeln! Eine einfache Berechnungsaufgabe bekomme ich mit Rave-Report einfach nicht gelöst. Wie läßt sich folgender Report am besten umsetzen? Über jeden Tipp oder ein Beispiel bin ich sehr dankbar - vermutlich liegt meinerseits ein Denkfehler vor, da ich einfach nicht weiterkomme!

Spätenstens ab der zweiten Query werden irgendweche Werte angezeigt, oder das Vorgängerergebnis wird ausgegeben. Leider finde ich in den Demos auch kein Beipiel wo ein Wert über mehrere Detailbänder berechnet werden soll. Oder kann es sein, dass dieses mit Rave technisch gar nicht machbar ist?

Vielen Dank,
lowmax


Report Information zum Kunden

Neben dem Kundennamen soll nun folgendes angezeigt werden:

Summe aller Angebote,
Summe aller Aufträge
Summe aller Rechnungen
------------------------
Summe aller Angebote, Aufträge und Rechnungen (Obriges einfach addiert)

Die Queries sind folgende:
SELECT Kundennummer,Kundenname from KUNDEN


SELECT Angebotsnummer, Sum(Angebotsbetrag)
from angebote where Kundennummer=:Kundennummer

SELECT Auftragsnummer, Sum(Auftragsbetrag)
from Auftraege where Kundennummer=:Kundennummer

SELECT Rechnungsnummer, Sum(Rechnungsbetrag)
from Rechnungen where Kundennummer=:Kundennummer


Als QueryParams wird jeweils die DriverDataView des Kundenqueries referenziert:
kundennummer=DDV1.kundennummer

StefanG 24. Jul 2006 15:44

Re: Rave - Kalkulation mit mehreren Detailbändern
 
Hi,

mal rein aus logischer Sicht betrachtet :

Ihr habt eine Tabelle Angebote, wo eben die Angebote drinstehen. Dieses verknüpfst du mit der Kundennr....logisch soweit.
Jedes Angebot hat jetzt einen Betrag (Angebotsbetrag) und auch nur eine Angebotsnummer oder?

Wie kann es dann funktionieren dass du eine (von evtl mehreren vorhandenen Angeboten eines Kunden, und dazu die EINE Summe aller angebote über ein Query bekommst?

Entweder müsstest du doch dann
Code:
Select Angebotsnummer, SUM(Angebotsbetrag)
From angebote where Kundennummer=:Kundennummer [b]GROUP BY[/b] Angebotsnummer
machen, um eben für den Kunden eine Summe pro Angebot zu bekommen (falls ihr, warum auch immer, dort mehrere Datensätze habt mit gleicher Angebotsnummer)
oder du machst
Code:
Select SUM(Angebotsbetrag)
From angebote where Kundennummer=:Kundennummer
um eben eine Summe über alle Angebote des Kunden zu bekommen.

Oder versteh ich das falsch?

Dann könntest du die Summen doch direkt aus den Queries nehmen und dort andrucken.
Für die Summenzeile müsstest du dann entweder 2 CalcOps nehmen und die 3 Werte zusammenaddieren, oder du machst dir eine Query, die das alles alleine Zusammenrechnet oder du rechnest die Werte innerhalb eines Events (mit der Rave Scriptsprache) zusammen.

Ansonsten müsstest du nochmal beschreiben, wie das genau bei dir aussehen sollte.

lowmax_5 24. Jul 2006 16:00

Re: Rave - Kalkulation mit mehreren Detailbändern
 
Hi,

vielen Dank für Deine schnelle Antwort.
Mit dem 'Group by' hast Du natürlich recht - das ist nicht logisch. Ich habe das Beipiel da wohl schlecht gewählt.

Das Grundproblem der Berechnung bleibt jedoch. Wie kann eine Anzeige und Summierung dieser von Werten aus meheren Detailbändern in Rave realisiert werden? Ist dieses grundsätzlich mit Rave möglich?

lowmax

StefanG 25. Jul 2006 07:43

Re: Rave - Kalkulation mit mehreren Detailbändern
 
Natürlich ist das Möglich...Grundsätzlich gilt beim Rave aber, dass man versuchen sollte seinem Ergebnis schon durch die SQL Query so weit wie möglich zu bekommen.

Zum Ausführen von Berechnungen hast du verschiedene Komponenten zur Auswahl :

CalcOp :
Diese Komponente ist eine "Unsichtbare" Kompontente. Sie führt Rechen Vorgänge aus. Allerdings kann sie immer nur einen Vorgang auf einmal machen. Dafür können mehrere CalcOps aber hintereinander gehängt werden.

CalcTotal :

Die CalcTotal Komponente summiert Werte die ihm angegeben werden. (Sie muss sich immer auf dem Band befinden in welchem auch später der Wert gedruckt werden soll)

Bei beiden Komponenten kann man das Ergebnis in einem Parameter oder einer PIVar speichern.

Wenn du die Summen der Angebote, Aufträge, Rechnungen schon durch die Query ermittelt hast, dann kannst du im Summenband 2 CalcOps nehmen.

In der ersten CalcOp summierst du die Summe der Angebot und der Aufträge, und im zweiten dann dieses Ergebnis addiert mit der Summe der Rechnungen. Bei der zweiten CalcOp kannst du als anfangswert die erste CalcOp angeben.

Solltest du aber in den darüberliegenden Detailbändern die einzelnen Angebote etc anzeigen und die Summen noch nicht hast, dann machst du vorher noch folgendes :

- Du legst im Report 3 Parameter an (SummeAngebot, SummeAuftrag, SummeRechnung oder so)
- In je ein Datenband kommt entweder eine CalcTotal oder eine CalcOp Komponente

Bei CalcTotal :
- Die Eigenschaft CalcType muss auf ctSum stehen
- DataView ist Kunden, Aufträge, Rechnungen (wie du sie auch immer genannt hast)
- DataField .. (müsstest du ja auch selber wissen)
- DestParam ist SummeAngebot/SummeAuftrag/SummeRechnung

Bei CalcOp :
Das Gleiche, nur musst du bei SourceParam SummeAngebot etc eintragen, weil die Rechenoperation bei jedem Datensatz ausgeführt wird.
Es wird quasi immer der neue Wert einfach hinzugerechnet.


Wenn du die 3 Summen hast, kannst du die im Summenband als SourceValue angeben und dir so das Ergebnis errechnen lassen.

Alternative :

Du kannst auch im Summenband eine Textkomponente hinzufügen und dort ein OnGetText Ereignis erstellen :

Code:
function Text1_OnGetText(Self: TRaveText; var Value: string);
begin
  Value := IntToStr(StrToInt(RaveProject.GetParam('SummeAngebot')) + 
                    StrToInt(RaveProject.GetParam('SummeAuftrag')) + 
                    StrToInt(RaveProject.GetParam('SummeRechnung')));
end OnGetText;
Das macht natürlich nur Sinn, wenn du den Wert nur anzeigen und nicht weiterverwenden willst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:36 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