List Controller

List Controller

Produktlinie

Standard

|

Expert

Betriebsart

CLOUD ABO

|

ON-PREMISES

Module

Leistung & CRM

Budget & Teilprojekt

Fremdkosten

Ressourcenplanung

Business Intelligence

Erstellt: 16.11.2022
Aktualisiert: 08.09.2024 | Controllernamen geändert

Ein List Controller dient dazu, Daten für Listen zu berechnen und vorzuladen.

Ordnern (inkl. Abfrage-OrdnerSQL-Ordner und Expression-Ordner ), Linktypen und Ressourcenplanungsansichten kann ein List Controller zugewiesen werden.

Aus den Listen kann dann via Custom Renderer darauf zugegriffen werden. So können Listenansichten erweitert und Daten vorgeladen werden, um die Listen performanter zu gestalten.

Die Anwendung von List Controllern in der Ressourcenplanung ist aufgrund des erweiterten Handlings sowie der Voraussetzung des Moduls Ressourcenplanung im Artikel OCL, Python, Custom Renderer und List Controller rund um die Ressourcenplanung beschrieben.

Funktionsumfang eines List Controllers

  • Ein List Controller ist ein Python Script (eigentlich eine Python Klasse), in welchem beliebige Berechnungen gemacht und Daten vorgeladen werden können, siehe Einen List Controller erstellen .
  • Ein List Controller wird einer Liste zugewiesen, siehe Einen List Controller zuweisen .
  • Das Verhalten der Liste verändert sich dadurch nicht, der List Controller berechnet keine Objekte in der Liste.
  • Will man in gewissen Spalten Daten des List Controllers verwenden, braucht es dafür Custom Renderer .
  • Ein List Controller kann dynamische Spalten managen. Spalten können als Dynamisch definiert werden und werden gegen rechts repetiert. Anzahl Repetitionen und Überschriften können via List Controller gesteuert werden, siehe Abschnitt Dynamische Spalten.

Einen List Controller erstellen

Ein List Controller ist eine Python Klasse. Um einen List Controller zu erstellen, erzeugen Sie im Ordner Einstellungen > Customizing > Script ein neues Script .

Sowohl der Name des Scripts als auch der Python Klasse kann frei gewählt werden (keine Umlaute, alles zusammengeschrieben).

Die Bezeichnung des Scripts ist der Modulname. Der Name der Pythonklasse ist der Controllername. Beispiel:

  • Modulname: mdlInvoices
  • Controllername: InvoicesPerYearController

In der Form Modulname.Controllername (im Beispiel mdlInvoices.InvoicesPerYearController) wird der List Controller später zugewiesen .

Methoden

Eine List Controller Klasse kann folgende Methoden definieren:

initialize(self, subscriber)
Wird aufgerufen, wenn die Liste berechnet wird. In der initialize Methode werden die Daten vorberechnet, welche für die Zellen Renderer der Liste zur Verfügung stehen sollen.
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 .

Es kann auch von via Modul mitgelieferten Ressourcenplanungs-Controllern geerbt werden. Dann stehen noch eine Vielzahl weitere Methoden zur Verfügung. Viele Beispiele dafür finden Sie im Artikel Vertec Python Funktionen .

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 Ordner sein) des List Controllers zurück.

Einen List Controller zuweisen

Die Zuweisung erfolgt via Modulname.Controllername (siehe Einen List Controller erstellen ):

Ordner

In den Ordnereigenschaften (rechte Maustaste > Eigenschaften) von Ordnern , SQL-Ordnern , Expression-Ordnern und Abfrage-Ordnern im Feld List Controller:

LinkContainer

Auf dem Linktyp (Custom-Link-Typ , Wrapper-Link-Typ ) im Feld List Controller auf der entsprechenden Seite:

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:

Zugriff in der Liste auf einen List Controller

Um in einer Listenspalte auf einen List Controller zuzugreifen, braucht es einen Custom Renderer . Dieser hat Zugriff auf die List Controller Instanz über das Attribut self.controller.

Dynamische Spalten

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

Als Expression geben Sie bei dynamischen Spalten immer %col% an. Damit wird der Index dynamisch definiert und Sie können im List Controller (via column_index) sowie in den Custom Renderern (via expression) darauf zugreifen und die Daten entsprechend ausgeben.

Als dynamisch markierte Spalten werden so viele Male wiederholt, wie die Methode get_dynamic_column_count() des List Controllers zurückgibt.

Mehrere dynamische Spalten müssen hintereinander definiert werden. Sie werden dann als Gruppe wiederholt. Die erste Gruppe erhält den Index 0, die zweite 1 usw. Innerhalb einer Gruppe kann die Anzahl Spalten nicht variiert werden, die Gruppen werden immer en bloc wiederholt.

Beispiel

Im Beispiel wird eine Rechnungsauswertung für Projekte 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 der entsprechenden Spalten in der Liste wird durch einen Custom Renderer bereitgestellt.

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

Es enthält den List Controller (InvoicesPerYearController) sowie einen Total-Renderer (RendererYearTotal):

class InvoicesPerYearController:
  # List Controller zur Darstellung von Rechnungen nach Jahr
    def initialize(self, subscriber):
        invoices = self.evalocl("varParent.rechnungen->orderby(datum)")
        self.yearlist = []
        if invoices:
            fromyear = invoices[0].datum.year
            toyear = invoices[-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
Erklärung
  • Zuerst werden alle Rechnungen des Projekts (varParent) geladen, nach Datum sortiert.
  • fromyear ist das Jahr der ersten Rechnung
  • toyear ist das Jahr der letzten Rechnung
  • In der yearlist werden alle Jahre von fromyear bis und mit toyear eingefügt
  • Pro Jahr gibt es eine Wiederholungsspalte (get_dynamic_column_count)
  • Als Titel wird jeweils das Jahr ausgegeben (get_dynamic_column_title)

Für die Liste wird 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>.<Renderername>, angegeben:

Bitte wählen Sie Ihren Standort