List Controller
Produktlinie
Standard
|Expert
Betriebsart
CLOUD ABO
|ON-PREMISES
Module
Leistung & CRM
Budget & Teilprojekt
Fremdkosten
Ressourcenplanung
Business Intelligence
Ein List Controller dient dazu, Daten für Listen zu berechnen und vorzuladen.
Ordnern (inkl. Abfrage-Ordner , SQL-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.
Dynamisch
definiert werden und werden gegen rechts repetiert. Anzahl Repetitionen und Überschriften können via List Controller gesteuert werden, siehe Abschnitt Dynamische Spalten.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:
mdlInvoices
InvoicesPerYearController
In der Form Modulname.Controllername (im Beispiel mdlInvoices.InvoicesPerYearController
) wird der List Controller später zugewiesen
.
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 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 |
Die Zuweisung erfolgt via Modulname.Controllername
(siehe Einen List Controller erstellen
):
In den Ordnereigenschaften (rechte Maustaste > Eigenschaften) von Ordnern , SQL-Ordnern , Expression-Ordnern und Abfrage-Ordnern im Feld List Controller:
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:
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
.
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.
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
varParent
) geladen, nach Datum sortiert.fromyear
ist das Jahr der ersten Rechnungtoyear
ist das Jahr der letzten Rechnungyearlist
werden alle Jahre von fromyear bis und mit toyear eingefügtget_dynamic_column_count
)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: