Leistungssummen

Für die Optimierung von kundenspezifischen Auswertungen mit Expressionordnern und Listenspalten oder zur Verwendung in benutzerdefinierten Berichten steht die beschleunigte Summierung und Gruppierung in Form eines OCL Operators zu Verfügung.

Operatoren

Der groupLeistungen Operator existiert in verschiedenen Varianten, die sich vor allem dadurch unterscheiden, dass sie auf verschiedene Typen von Objekten anwendbar sind:

OperatorBeschreibung
groupLeistungen Globaler Leistungssummen-Operator. Bezieht sich auf alle Leistungen im System. Da OCL Operatoren immer auf einem bestimmten Datentyp basieren müssen, ist der Operator auf TimSession registriert. Die Honorar-Werte werden in Leitwährung ausgegeben.
groupLeistungenP Leistungssummen-Operator für Projekte. Kann auf ein einzelnes Projekt oder auf eine Liste von Projekten angewandt werden. Die Honorar-Werte werden in Leitwährung ausgegeben.
groupLeistungenPW Ab Version 5.3.1.19. Leistungssummen-Operator für Projekte. Kann auf einem einzelnen Projekt oder auf einer Liste von Projekten angewandt werden. Die Honorarwerte werden in Projektwährung ausgegeben.
Falls dieser Operator auf einer Liste von Projekten angewandt wird, muss sichergestellt werden, dass alle Projekte in der Liste die gleiche Währung haben. Ansonsten werden einfach die Beträge in den verschiedenen Währungen zusammengezählt, was unsinnige Zahlen ergeben würde.
groupLeistungenPWG Ab Version 5.7. Berechnet alle Zahlen in Projektwährung, also ohne Währungsumrechnung. Es handelt sich um einen globalen Operatoren; das heisst, dass der Operator nicht auf einem einzelnen Objekt, sondern auf TimSession aufgerufen wird.
Es muss darauf geachtet werden, dass nach Projekten gruppiert wird, sonst werden die Zahlen in verschiedenen Währungen summiert. Der Aufruf erfolgt also beispielsweise so: TimSession.allInstances->first->groupLeistungenPWG('01.01.2011', '31.12.2011', 'PROJEKT')
groupLeistungenB Leistungssummen-Operator für Bearbeiter. Kann auf Objekte des Typs Projektbearbeiter oder auf Listen davon angewandt werden. Die Honorar-Werte werden in Leitwährung ausgegeben.
groupLeistungenPh Leistungssummen-Operator für Phasen. Kann auf eine einzelne Projektphase oder auf eine Liste davon angewandt werden. Die Honorar-Werte werden in Leitwährung ausgegeben.
groupLeistungenPhW Ab Version 5.7. Dieser Operator wird auf Projektphasen aufgerufen und berechnet die Zahlen in Projektwährung.
groupLeistungenW

Ab Version 6.0. Kann auf Projekten, Projektphasen und Bearbeitern aufgerufen werden. Liefert die Ergebnisse in einer beliebigen Währung.

groupLeistungenW(von, bis, group, waehrung)

erwartet ein String-Argument für Währung. Ein Leerstring gibt die Resultate in der Leitwährung zurück. Beispiel in der Spalte einer Bearbeiterliste:

self->groupLeistungenW('01.01.2016','31.12.2016', '', 'EUR')->collect(wertextOffen+wertExtVerrechnet)->sum

gibt die Honorarwerte aller Leistungen 2015 des Bearbeiters umgerechnet in EUR aus.

Syntax

Die Syntax für alle diese Operatoren lautet wie folgt:

<obj>->groupLeistungen(<von>, <bis>, <group>)

Die Argumente (in spitzen Klammern) des groupLeistungen Operators haben folgende Bedeutungen:

obj das Basisobjekt, auf das der Operator angewendet wird. Kann vom Typ Projekt, Projektbearbeiter oder Projektphase, sowie Listen derselben sein. Vielfach ist das Basisobjekt das Ergebnis einer Teil-OCL Expression. Bei groupLeistungen muss der Operator auf der Session aufgerufen werden. Die aktuelle Session kann aufgerufen werden über TimSession.allInstances->first:
TimSession.allInstances->first->groupLeistungen(...
von, bis von, bis Datum einer Datumsperiode. Die Leistungen werden nur aus der angebebenen Periode summiert. Die Daten von und bis werden als Zeichenkette im Format dd.mm.yyyy übergeben. Wird ein Leerstring angegeben, werden alle Leistungen verwendet.
group Gruppierungsanweisung. Enthält verschiedene Gruppierbegriffe, durch Kommas getrennt und steuert die Gruppierung und Sortierung der Ergebnissummen. Wird ein Leerstring angegeben, wird die Liste nicht gruppiert.
Folgende Gruppierbegriffe können verwendet werden:
  • PROJEKT: gruppiert die Leistungssummen nach Projekten
  • BEARBEITER: gruppiert nach Bearbeitern
  • PHASE: gruppiert nach Phasen
  • TYP: gruppiert nach Tätigkeiten
  • RECHNUNG: gruppiert die Summen nach Rechnungen
  • YEAR: gruppiert nach Jahren
  • MONTH: gruppiert nach Monaten
  • DAY: gruppiert nach Tagen

Als Ergebnis erhalten Sie eine Liste von Objekten des Typs LeistSum. Diese werden jeweils gemäss der angegebenen Gruppierung sortiert.

LeistSum

Diese Leistungssummen-Objekte besitzen verschiedene Summenattribute sowie einen Wert für jeden Gruppierbegriff. Im Detail sind dies die folgenden Eigenschaften:

MemberBeschreibung
minutenExtOffen Summe der externen, noch nicht verrechneten Minuten.
minutenExtOffenUnprod Summe der externen, noch nicht verrechneten Minuten von Leistungen, die auf Projekten mit unproduktiven Projekttypen erfasst wurden.
minutenExtVerrechnet Summe der externen, verrechneten Minuten.
minutenExtVerrechnetUnprod Summe der externen, verrechneten Minuten von Leistungen, die auf Projekten mit unproduktiven Projekttypen erfasst wurden.
minutenIntOffen Summe der internen, noch nicht verrechneten Minuten.
minutenIntOffenUnprod Summe der internen, noch nicht verrechneten Minuten von Leistungen, die auf Projekten mit unproduktiven Projekttypen erfasst wurden.
minutenIntVerrechnet Summe der internen, verrechneten Minuten.
minutenIntVerrechnetUnprod Summe der internen, verrechneten Minuten von Leistungen, die auf Projekten mit unproduktiven Projekttypen erfasst wurden.
leistungCount Anzahl der Leistungen in dieser Teilsumme.
projekt Projekt dieser Teilsumme, falls nach Projekt gruppiert.
bearbeiter Bearbeiter, falls nach Bearbeiter gruppiert.
phase Phase falls nach Phasen gruppiert.
typ Tätigkeit falls nach Tätigkeiten gruppiert.
rechnung Rechnung falls Gruppierung nach Rechnungen.
datum Anfangsdatum der Datumsgruppe (Jahr, Monat, Tag), falls entsprechende Gruppierung.
wertBearbeiterOffen Summe der Honorarwerte nach Ansatz Bearbeiter, nicht verrechnet.
wertBearbeiterVerrechnet Summe der Honorarwerte nach Ansatz Bearbeiter, verrechnet.
wertExtOffen Summe der externen, noch nicht verrechneten Honorarwerte.
wertExtOffenUnprod Summe der externen, noch nicht verrechneten Honorarwerte von Leistungen, die auf Projekten mit unproduktiven Projekttypen erfasst wurden.
wertExtVerrechnet Summe der externen, verrechneten Honorarwerte.
wertExtVerrechnetUnprod Summe der externen, verrechneten Honorarwerte von Leistungen, die auf Projekten mit unproduktiven Projekttypen erfasst wurden.
wertIntOffen Summe der internen, noch nicht verrechneten Honorarwerte.
wertIntOffenUnprod Summe der internen, noch nicht verrechneten Honorarwerte von Leistungen, die auf Projekten mit unproduktiven Projekttypen erfasst wurden.
wertIntVerrechnet Summe der internen, verrechneten Honorarwerte.
wertIntVerrechnetUnprod Summe der internen, verrechneten Honorarwerte von Leistungen, die auf Projekten mit unproduktiven Projekttypen erfasst wurden.
wertKostenOffen Summe der Honorarwerte nach Kostensatz, nicht verrechnet.
wertKostenVerrechnet Summe der Honorarwerte nach Kostensatz, verrechnet.

Beispiel

Auf einem Projekt (oder einer Liste von Projekten) wird der Operator groupLeistungenP angewendet. Als Datumsperiode wird Januar bis Dezember angegeben. Wir möchten die Summen gruppiert nach Monaten und Projekten, die angegebene Gruppieranweisung ('MONTH,PROJEKT') macht dies.

->groupLeistungenP('01.01.2016','31.12.2016','MONTH,PROJEKT')

Als Resultat erhalten wir eine Liste von LeistSum Objekten. Diese enthalten beispielsweise folgende Attribute:

  • Monat: datum.formatDateTime('mm.yyyy')
  • Projekt: projekt
  • Aufwand intern: minutenintOffen + minutenIntVerrechnet
  • Wert extern: wertExtOffen + wertExtVerrechnet

Leistungssummen <> Summe der Leistungen

Es kann vorkommen, dass die Summe der Leistungen nicht gleich ist wie die Leistungssummen. Zum Beispiel:

offeneleistungen->union(verrechneteleistungen)->select((datum >= encodedate(1990,1,1)) 
and (datum < encodedate(2018,1,1))).wertExt->sum

kann unterschiedlich sein zu:

self->groupleistungenP('01.01.1990','01.01.2018','')->collect(wertExtOffen + wertExtVerrechnet)->sum

Das kann verschiedene Ursachen haben:

  • Weil Leistungssummen Rechnungsrabatte berücksichtigen, die nicht einberechnet werden, wenn nur die Leistungen zusammengezählt werden. In diesem Fall sind die Leistungssummen < der Summe der Leistungen.
  • Weil es in Leistungssummen Rechnungen mit pauschalen Phasen ohne Leistungen haben kann. Bei pauschalen Phasen mit Leistungen werden die Leistungen mit dem Verrechnen ebenfalls angepasst, so dass dies kein Problem ist. Hat es aber pauschale Phasen, welche keine Leistungen haben, können diese auch nicht angepasst werden. In diesem Fall sind die Leistungssummen > der Summe der Leistungen.

Einschränkung bei grossen Datenmengen und Firebird

Wird ein groupLeistungenX Operator auf einer Liste von Projekten, Phasen oder Bearbeiter aufgerufen, gibt es folgende Einschränkung:

Wenn die Liste der aufrufenden Objekte (also nicht die Anzahl Leistungen im Ergebnis, sondern die Projekte, Phasen oder Bearbeiter, auf denen der Operator aufgerufen wird) grösser ist als 1500 Einträge, gibt es einen Fehler vom Firebird-Server wegen unzulässigem SQL:

General SQL Error.
Implementation limit exceeded
too many values (more than 1500) in member list
to match against.

Eine Möglichkeit, dieses Problem zu umgehen, ist die Verwendung des globalen groupLeistungen Operators, der sich auf alle Leistungen bezieht.

Beispiel: Sind mehr als 1500 Projekte vorhanden, und es soll projekt->groupLeistungenP(...) aufgerufen werden, kann das so umgangen werden:

TimSession.allInstances->first->groupLeistungen('', '', 'PROJEKT')

Ergibt eine Liste von LeistSums über alle Leistungen im System, gruppiert nach Projekten.

Performance Verhalten von Leistungssummen

Da die Leistungssummen optimiert via SQL berechnet werden, ist das Verhalten bei Veränderungen von Grundlagendaten geringfügig anders als sonst in Vertec.

Leistungssummen werden grundsätzlich neu berechnet, sobald irgendeine Leistung im System verändert wird. Die Neuberechnung erfolgt jedoch nur, wenn die Zahlen der Leistungssumme auch sichtbar sind. Zum Beispiel ist es nicht empfehlenswert beim Erfassen von neuen Leistungen gleichzeitig eine Liste mir Leistungssummen auf dem Bildschirm zu haben, da diese bei jeder neuen Leistung neu berechnet würde. Die Berechnung von Leistungssummen geht zwar relativ schnell, aber bei unnötig häufigem Neuberechnen ist die Verzögerung trotzdem spürbar.

Insbesondere ist es nicht zu empfehlen, groupLeistungen Operatoren in Spaltenexpressions von Listen zu verwenden, da der Performance Gewinn beim Berechnen der Summe durch die grosse Anzahl einzelner SQL Anfragen in der Regel überkompensiert wird.

Beschleunigte Summierung einstellbar

Die beschleunigte Berechnung von Summierungen über den Datenbankserver kann in gewissen Situationen einen verlangsamenden Effekt haben. Zum Beispiel, wenn während dem Bearbeiten von Rechnungen eine Projektliste mit einem entsprechenden Summenattribut (z.B. SummeOffeneLeistungen) angezeigt wird, führt jede Änderung an der Rechnung zur kompletten Neuberechnung der Summenliste. In solchen Fällen kann der Zeitbedarf für die häufige Neuberechnung den Gewinn durch die beschleunigte Summierung zunichte machen.

Deshalb ist die automatische Verwendung der beschleunigten Summierung standardmässig deaktiviert. Falls die Summenattribute auf Projekt und Projektphase mit grossen Datenmengen verwendet werden, kann die beschleunigte Summierung über die Systemeinstellung Projekt > Fuer Summenattribute beschleunigte Summierung verwenden aktiviert werden.

Auf die Behandlung des OCL Operators groupLeistungen hat die Einstellung keine Auswirkung, dieser verwendet immer die beschleunigte Summierung.

Einfluss der beschleunigten Summierung auf die Anzeige von Budgetwerten

Ist die beschleunigte Summierung ausgeschaltet (Systemeinstellung auf Nein), sollten die Budgetwerte (auf Projekten und Phasen auf dem Reiter Budget) nicht standardmässig angezeigt werden.

Wenn viele Leistungen vorhanden sind, kann das Öffnen eines Projektes bzw. einer Phase sonst sehr lange dauern, weil Vertec ohne die beschleunigte Summierung jede einzelne Leistung reinlädt.

Um dies zu verhindern, kann in den Systemeinstellung Projekt die Option Summen anzeigen deaktiviert werden:

Auf dem einzelnen Projekt / der einzelnen Phase können die Budgetwerte bei Bedarf trotzdem angezeigt werden, indem die Checkbox Werte anzeigen? aktiviert wird. Die Budgetwerte werden dann nur für dieses Projekt / diese Phase angezeigt.

Leistungssummen auf Projekten

Auf dem Projekt verwenden folgende Summen-Attribute diese Zugriffstechnologie:

  • sumMinutenInt
  • sumWertExt
  • sumWertExtRech
  • sumLeistungWertInt
  • sumLeistungWertKosten
  • summeOffeneLeistungen

Leistungssummen auf Phasen

Auch auf der Projektphase werden die verschiedenen Summen-Attribute beschleunigt berechnet. Es sind dies:

  • sumMinutenInt
  • sumMinutenIntOffen
  • sumWertExt
  • sumWertExtRech
  • sumWertExtOffen
  • sumLeistungWertInt
  • sumKostenLeistung

Versionen

Leistungssummen sind in Versionen vor 5.2.1 nur mit lizenziertem Benchmarking Modul verfügbar.


14.11.2003 | 10.01.2017: Leistungssummen <> Summe der Leistungen erweitert. Bilder und Beispiel für die Darstellung auf der Oberfläche entfernt.
Produktlinien: Standard, Expert
Module: Leistung & CRM, Budget & Teilprojekte