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:

  • 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.2015','31.12.2015', '', 'EUR')->collect(wertextOffen+wertExtVerrechnet)->sum

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

  • 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.

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 TimSession aufgerufen werden. Die aktuelle TimSession 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.

Member von LeistSum

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

  • 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

Die Darstellung von Leistungssummen in einer Liste erfolgt wie in Vertec üblich durch Angabe von entsprechenden OCL Expressions in den Listeneinstellungen.

Als Beispiel wird die Konfiguration eines Expression-Ordners erklärt, der eine Jahres-Übersicht von Projekten nach Monaten gruppiert angibt.

Der erste Teil der Expression ergibt eine Liste aller Projekte im System. Darauf wird der Operator groupLeistungenP angewendet. Als Datumsperiode wird Januar bis Dezember 2013 angegeben. Wir möchten die Summen gruppiert nach Monaten und Projekten, die angegebene Gruppieranweisung ('MONTH,PROJEKT') macht dies.

Der Expression-Ordner zeigt nun eine Liste von LeistSum Objekten an. Dies ist noch nicht sehr informativ, weshalb wir noch Listenspalten konfigurieren

  • Monat: datum.formatDateTime('mm.yyyy')
  • Projekt: projekt.asstring
  • Aufwand intern: minutenintOffen + minutenIntVerrechnet
    Renderer: dbmTim.MinuteRenderer (Erweiterte Listeneinstellungen)
  • Wert extern: wertExtOffen + wertExtVerrechnet

Die Liste sieht dann so aus:

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

Dies ist deshalb der Fall, weil Leistungssummen Rechnungsrabatte berücksichtigen, die nicht einberechnet werden, wenn nur die Leistungen zusammengezählt werden.

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 die Systemeinstellung Projekt > Summen anzeigen auf Nein gestellt 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 | 21.03.2016: groupLeistungenW beschrieben.
Produktlinien: Standard, Expert
Module: Leistung & CRM, Budget & Teilprojekte