Support vertec.com

List Controller

List Controller

Standard

|

Expert

CLOUD ABO

|

ON-PREMISES

Leistung & CRM

Budget & Teilprojekt

Fremdkosten

Ressourcenplanung

Business Intelligence

Erzeugt: 16.11.2022
Aktualisiert: 22.11.2022 | Erstpublikation

Ein List Controller ist eine Python Klasse, welche definiert wird, um das Verhalten einer Listenansicht zu beeinflussen.

Die derzeitige Hauptanwendung von List Controllern sind die Ressourcenplanungsansichten. List Controller können aber auch in den Eigenschaften von Ordnern sowie auf Linktypen gesetzt werden, um die angezeigten Listen zu definieren.

Funktionsumfang eines List Controllers:

  • Ein List Controller ist eine Python Klasse, die man (optional) bei einer Liste (Ordner, Linktyp oder Ressourcenplanungsansichten), verwenden kann.
  • Die Angabe des List Controllers erfolgt via <Modulname>.<Klassenname>.
  • Verwendet man keinen List Controller, so verhalten sich die Listen wie bisher.
  • Der List Controller kann Objekte und Daten vorladen, was erhebliche Performance-Vorteile mit sich bringen kann.
  • Ein List Controller kann auch Daten vorberechnen, welche dann von Custom Renderern in den Spalten verwendet werden können. Auch das ist performancerelevant, da gewisse Berechnungen nur einmal gemacht werden müssen statt wie bisher pro Zelle.
  • Ein List Controller kann dynamische Spalten managen. Spalten können als Dynamic definiert werden und werden gegen rechts repetiert. Wie viele Mal und wie die Überschrift heisst, kann via Listcontroller gesteuert werden. Das genaue Vorgehen ist im Abschnitt Dynamische Spalten beschrieben.
  • Der List Controller kann, muss aber nicht, die Objekte berechnen, die in der Liste sind. Das Berechnen der Objekte (via get_row_objects, siehe unten) wird derzeit nur für Ressourcenplanungsansichten unterstützt.

Methoden

Eine List Controller Klasse kann folgende Methoden definieren:

initialize(self, subscriber)
Wird aufgerufen, wenn die Liste berechnet wird. In der initialize Methode können Daten vorberechnet werden, welche für die Zellen Renderer der Liste zur Verfügung stehen müssen.
get_dynamic_column_count(self, subscriber)

Gibt die Anzahl Wiederholungen der als dynamisch markierten Spalten der Liste zurück. Jede Wiederholung wird in der Liste als Gruppe dargestellt mit einem Gruppen-Titel.

Im Falle von Listen, die für jedes anzuzeigende Datumsintervall eine Spalte anzeigen soll, entspricht dieser Wert der Anzahl darzustellender Intervalle (z.B. Monate).

Weitere Informationen zu dynamischen Spalten finden Sie weiter unten.

get_dynamic_column_title(self, column_index, subscriber)

Berechnet den Gruppen-Titel einer dynamischen Spaltengruppe. Der übergebene column_index kann Werte von 0 (erste Gruppe) bis Anzahl Gruppen-1 (letzte Gruppe) annehmen.

Im Falle von Datums Spalten-Gruppen wird hier das Datums-Intervall (z.B. Monats-Name) als String zurückgeliefert.

Weitere Informationen zu dynamischen Spalten und Spaltengruppen finden Sie weiter unten.

Sowie zusätzlich bei Verwendung des List Controllers in Ressourcenplanungsansichten:

initialize_with_period(self, start, end, interval, subscriber)
Spezielle Variante von initialize für die Ressourcenplanung, welche zusätzlich Start und Ende der aktuell angezeigten Periode sowie das konfigurierte Planungsintervall erhält (0 für Tage, 1 für Wochen, 2 für Monate). Im Falle der Ressourcenplanungslisten wird hier der Datenprovider für die Planungsdaten initialisiert. Für Ressourcenplanungsansichten wird initialize_with_period bevorzugt anstelle von initialize aufgerufen, sofern der List Controller diese Methode implementiert.
get_row_objects(self, subscriber)

Berechnet die Zeilenobjekte, die in der Liste dargestellt werden.

Für Ressourcenplanungsansichten werden so alle Zeilen bestimmt, für die ein Planwert eingetragen ist.

get_row_objects_type(self)

Berechnet den Typ der Zeilenobjekte. Falls dieser konstant ist, kann er auch als Attribut row_objects_type angegeben werden.

Nur in Kombination mit get_row_objects sinnvoll. Nur für Ressourcenplanungsansichten unterstützt.

add_row_object(self, obj)

Wird verwendet für die Sternzeilen-Funktionalität, um weitere zu planende Einträge in die Liste einzufügen.

Diese Methode muss vorhanden sein, damit bei Listen mit List Controller und eingeschalteter Option "Hinzufügen-Zeile anzeigen" eine Sternzeile angezeigt wird. Nur für Ressourcenplanungsansichten unterstützt.

Die Objektinstanz (self) eines List Controllers bietet folgende Attribute und Methoden an:

self.evalocl(expression, rootobj=None)
Erlaubt das Evaluieren von OCL auf dem self OCL Evaluator. Bei Aufruf wird automatisch der geeignete Subscriber verwendet. Falls optional rootobj angegeben wird, erfolgt die Evaluierung auf diesem Objekt, sonst global.
self.context

Ist das Context Objekt der Liste. Für Ordner und Linkcontainer ist dies das Container Objekt (Ordner bzw. LinkContainer).

Im Falle von via Ressourcenplanungsansicht definierten Listen für Einzelobjekte ist der Context das einzelne (UserEintrag-) Objekt.

self.get_context_entries()

Gibt beim Aufruf abhängig von self.context eine Liste folgender Objekte zurück:

Ist self.context ein Container Objekt, dann werden die Einträge des Containers zurückgegeben. In diesem Fall wird automatisch auf die Einträge des Containers subscribed.

Andernfalls wird eine Liste zurückgegeben, die nur das Objekt self.context enthält.

self.owner

Gibt den Besitzer (kann vom Typ LinkRolle, ViewType (Ressourcenplanungsansicht) oder AbfrageOrdner sein) des List Controllers zurück.

In einer Liste mit konfiguriertem List Controller hat ein Custom Renderer Zugriff auf die List Controller Instanz über das Attribut self.controller.

Sobald in einem List Controller Feld ein List Controller angegeben wird, erscheint der Button mit den drei Punkten. Mittels Klick darauf öffnet sich der Code zur Ansicht:

Eine Liste der standardmässig mitgelieferten List Controller finden Sie im Artikel Vertec Python Funktionen im Modul vtcplanning.

Dynamische Spalten

Spalten in den Listeneinstellungen können ab Vertec 6.6 die Checkbox Dynamisch gesetzt haben:

Entsprechend markierte Spalten werden so viel Mal wiederholt, wie die Methode get_dynamic_column_count() (siehe oben) zurückgibt.

Mehrere dynamische Spalten müssen hintereinander definiert und dann als Ganzes dupliziert werden. Die erste Gruppe erhält den Index 0, die zweite 1 usw.

Mit der Expression %col% wird auf diesen Index zugegriffen. Darauf kann im Renderer Bezug genommen und die Daten entsprechend ausgegeben werden (siehe Beispiel).

Beispiel

Im Beispiel wird Rechnungsauswertung auf Projekt gemacht. Es ist eine normale Rechnungsliste, bei der aber die Beträge nach Jahr einsortiert werden.

Die Berechnung der Daten erfolgt im List Controller. Die Darstellung in der Liste wird durch Custom Renderer bereitgestellt.

Dafür wird folgendes Script registriert, in unserem Beispiel unter dem Namen Controller.

Es enthält den List Controller sowie den Total-Renderer:

class RechnungsListController:
    def initialize(self, subscriber):
        rechnungen = self.evalocl("varParent.rechnungen->orderby(datum)")
        self.yearlist = []
        if rechnungen:
            fromyear = rechnungen[0].datum.year
            toyear = rechnungen[-1].datum.year
            self.yearlist = list(range(fromyear, toyear+1))
    def get_dynamic_column_count(self, subscriber):
        return len(self.yearlist)
    def get_dynamic_column_title(self, column_index, subscriber):
        return self.yearlist[column_index]

class RendererYearTotal:    
    def get_value(self, rowobj, expression, subscriber):
        year = self.controller.yearlist[int(expression)]
        if rowobj.datum.year == year:
            return rowobj.evalocl("total", subscriber)
        else:
            return 0.0

Für die Liste wurde ein Wrapper-Link-Typ erstellt und der List Controller in der Form <Modulname>.<Klassenname> darin angegeben:

In den Listeneinstellungen wiederum wird eine dynamische Spalte angelegt, als Expression %col% eingetragen und der Renderer, ebenfalls in der Form <Scriptname>.<Klassenname>, angegeben:

Bitte wählen Sie Ihren Standort