List Controller
Standard
|Expert
CLOUD ABO
|ON-PREMISES
Leistung & CRM
Budget & Teilprojekt
Fremdkosten
Ressourcenplanung
Business Intelligence
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:
<Modulname>.<Klassenname>
.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.get_row_objects
, siehe unten) wird derzeit nur für Ressourcenplanungsansichten unterstützt.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 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 Nur in Kombination mit |
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 |
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.
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).
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: