Der Chatbot hilft Ihnen bei Fragen rund um das Produkt und die Anpassbarkeit der Software. Wie bei allen AI-generierten Daten sollten die Antworten bei kritischen Informationen verifiziert werden. Nehmen Sie dafür gerne Kontakt mit uns auf. Weitere Informationen zur Verarbeitung der Chat-Daten bieten wir auf der Datenschutzseite.
Die besten Antworten liefert der Chatbot, wenn Ihr Input möglichst viele Informationen enthält. Zum Beispiel:
«Welche Apps stehen im Vertec Cloud Abo zur Verfügung?»
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.
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.
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.
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.
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 Methodeget_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 Jahrdefinitialize(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))
defget_dynamic_column_count(self, subscriber):
returnlen(self.yearlist)
defget_dynamic_column_title(self, column_index, subscriber):
return self.yearlist[column_index]
class RendererYearTotal:
defget_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: