0
Datensätze filtern/summieren mit sum() und select
Hallo allerseits, ich krieg's mal wieder nicht hin ... :(
Ich habe folgende Tabellen (und relevante Felder):
DOKUMENTE (Angebot/Auftrag/Rechnung)
- Dokumenttyp (Auswahlfeld)
- POSITIONEN (Untertabelle von DOKUMENTE)
-- Leistung (Verknüpfung mit LEISTUNGEN.Leistung)
-- Betrag (Berechnungsfeld Menge * Preis)
LEISTUNGEN (entspricht quasi Artikeln, heißt nur anders)
- Leistung (Textfeld, z. B. "Broschüre, Konzeption")
- Gesamtumsatz (Summierung von Beträgen aus POSITIONEN)
Die Positionen sind mit den Leistungen verknüpft. Bei neuer Position wähle ich eine Leistung aus und übertrage deren Stammdaten in die Position. Soweit, so gut.
In der Tabelle LEISTUNGEN möchte ich mir nun den kumulierten Umsatz der jeweiligen Leistung anzeigen lassen. Dazu habe ich ein Berechnungsfeld namens 'Gesamtumsatz' erstellt. In der betreffenden Formel müsste ich m. E. dazu die Datensätze der Tabelle POSITIONEN entsprechend filtern und die Werte des Feldes 'Betrag' summieren.
Es gibt zwei Filterkriterien: Den Dokumenttyp (="Rechnung") und die Leistung selbst. Letzteres kriege ich aber nicht gebacken. Das Gesamtkonstrukt sieht folgendermaßen aus:
sum((select Positionen)[text(DokumentNr.Dokumenttyp) = "Rechnung" and ZWEITE BEDINGUNG].Betrag)
Die erste Bedingung funktioniert augenscheinlich, bei der zweiten habe ich verschiedene Varianten durchprobiert, u. a. diese (auch mit number()):
let LNr := Nr;
sum((select Positionen)[text(DokumentNr.Dokumenttyp) = "Rechnung" and Leistung.Nr = LNr].Betrag)
Nix zu machen. Keine Fehlermeldung, aber das Ergebnis ist 0.
Was mache ich wieder falsch? Hat jemand eine Idee? Danke sehr!
Ich habe folgende Tabellen (und relevante Felder):
DOKUMENTE (Angebot/Auftrag/Rechnung)
- Dokumenttyp (Auswahlfeld)
- POSITIONEN (Untertabelle von DOKUMENTE)
-- Leistung (Verknüpfung mit LEISTUNGEN.Leistung)
-- Betrag (Berechnungsfeld Menge * Preis)
LEISTUNGEN (entspricht quasi Artikeln, heißt nur anders)
- Leistung (Textfeld, z. B. "Broschüre, Konzeption")
- Gesamtumsatz (Summierung von Beträgen aus POSITIONEN)
Die Positionen sind mit den Leistungen verknüpft. Bei neuer Position wähle ich eine Leistung aus und übertrage deren Stammdaten in die Position. Soweit, so gut.
In der Tabelle LEISTUNGEN möchte ich mir nun den kumulierten Umsatz der jeweiligen Leistung anzeigen lassen. Dazu habe ich ein Berechnungsfeld namens 'Gesamtumsatz' erstellt. In der betreffenden Formel müsste ich m. E. dazu die Datensätze der Tabelle POSITIONEN entsprechend filtern und die Werte des Feldes 'Betrag' summieren.
Es gibt zwei Filterkriterien: Den Dokumenttyp (="Rechnung") und die Leistung selbst. Letzteres kriege ich aber nicht gebacken. Das Gesamtkonstrukt sieht folgendermaßen aus:
sum((select Positionen)[text(DokumentNr.Dokumenttyp) = "Rechnung" and ZWEITE BEDINGUNG].Betrag)
Die erste Bedingung funktioniert augenscheinlich, bei der zweiten habe ich verschiedene Varianten durchprobiert, u. a. diese (auch mit number()):
let LNr := Nr;
sum((select Positionen)[text(DokumentNr.Dokumenttyp) = "Rechnung" and Leistung.Nr = LNr].Betrag)
Nix zu machen. Keine Fehlermeldung, aber das Ergebnis ist 0.
Was mache ich wieder falsch? Hat jemand eine Idee? Danke sehr!
2 Antworten
-
Wenn Positionen eine Untertabelle von Leistungen ist, dann solltest du select weglassen. In diesem Fall brauchst du auch die zweite Bedingung nicht mehr.
sum((Positionen)[text(DokumentNr.Dokumenttyp) = "Rechnung"].Betrag)
-
Danke, Leo. Und: Entschuldigung. Denn der Fehler lag ganz woanders. Das Ergebnis war auch mit deinem Code = 0. Da du aber selten Fehler machst (und ich etwas zeitlichen Abstand hatte), bin ich noch mal anders an die Fehlersuche gegangen und habe schnell festgestellt, dass die Leistungen, mit denen ich es probiert hatte, zwar mehrfach in Angeboten und Aufträgen vorkamen, nicht jedoch in Rechnungen. Deshalb war das Ergebnis 0 natürlich korrekt. Nun habe ich noch entsprechende Datensätze hinzugefügt, und siehe da: Jetzt funktioniert nicht nur dein, sondern auch mein Code.
Wobei deiner natürlich wieder eleganter und effizienter ist (auch, wenn ich noch nicht verstehe, wie er ohne die zweite Bedingung funktioniert), weshalb ich ihn jetzt auch nutzen werde.
Es ist zwar ein wenig tröstlich (für mich), dass meine ursprüngliche Code-Überlegung nicht ganz verkehrt war, aber es tut mir leid, dass außer mir noch jemand solcher Blödheit wegen Zeit vergeudet hat. Manchmal sieht man echt den Wald vor lauter Bäumen nicht ...
Nochmals vielen Dank!
Axel (der sich gerade mit vollen Händen Asche aufs Haupt streut ;)
Content aside
- vor 6 JahrenZuletzt aktiv
- 2Antworten
- 3230Ansichten