Einführung in das Vertec Customizing
Beim Customizing geht es darum, Vertec an individuelle Kundenbedürfnisse anzupassen.
Vertec ist sehr umfassend anpassbar, und deshalb gibt es eine grosse Spannweite bezüglich der Komplexität der Anpassungen. Vom Anlegen einer Ordnerstruktur und dem Anpassen von Listeneinstellungen bis hin zu vollautomatisierten Workflows ist alles möglich. Aber wie entscheidet man, wann und welches Customizing benötigt wird? Dieser Artikel soll bei dieser Entscheidung helfen.
Grundsätzlich gilt: Je weniger Customizing, desto besser.
Das ist natürlich sehr einfach ausgedrückt, aber es ist wichtig zu bedenken, dass jedes Customizing auch gewartet werden muss und Risiken bergen kann bezüglich der Übersichtlichkeit und der Performance. Siehe dazu auch den Punkt 6 unseres 10-Punkte-Plans für eine zukunftsfähige Vertec-Installation.
Die erste Überlegung sollte deshalb immer lauten: Was gibt es out-of-the-box und können wir auch damit leben? Und wenn nicht, wie können wir mit möglichst wenigen Handgriffen daraus das machen, was wir brauchen?
Die Vertec Software kennt ihr Objektmodell zur Laufzeit und kann via OCL auch navigiert werden. Um Vertec customizen zu können, muss man zwingend das Modell kennen bzw. wissen, wie man darin navigiert. Es ist im Vertec Model Browser zu finden und kann auch über das Vertec Python Modul "vtcmodel" aufgerufen werden.
Das Customizing von Vertec findet in den full-featured Apps (Cloud App, Web App und Desktop App) statt. Specialized Apps wie die Phone App oder die Outlook App können nicht angepasst werden.
Die full-featured Apps verfügen alle über dieselbe Benutzeroberfläche - das Customizing wirkt also automatisch überall gleich.
Die verschiedenen Möglichkeiten, Vertec zu parametrisieren, sind nachfolgend aufgelistet. Die Reihenfolge sagt dabei etwas über die Komplexität des Customizing mit diesen Elementen aus. Je weiter oben in der Liste, desto unkomplizierter; je weiter unten, desto komplexer und potenziell risikoreicher.
Oft gibt es verschiedene Wege, ein Resultat zu erreichen. Dann sollte man möglichst die einfachste Variante wählen.
Die Benutzeroberfläche von Vertec (wir sprechen hier immer von den full-featured Apps) besteht aus einer Baum-Ansicht auf der linken Seite, und was im Baum ausgewählt ist, wird rechts angezeigt - entweder ein einzelnes Objekt oder eine Liste von Objekten.
Die am wenigsten invasive (und risikoreiche) Methode zum Parametrisieren der Vertec Benutzeroberfläche besteht darin, neue Ordner hinzuzufügen. Dabei muss es sich um Unterordner von vorhandenen Überordnern (Stammordnern) oder um neue Stammordner handeln.
Diese Ordner können Objekte enthalten, die manuell mit dem Ordner selbst verknüpft sind, oder sie können als Stichwort-Ordner definiert werden. In diesem Fall sind die Unterordner die Stichworte, die auf den Seiten eines einzelnen Objekts angezeigt und ausgewählt werden können.
Diese Ordner können auch andere Ordner enthalten wie SQL-Ordner oder Expression-Ordner.
Ein Expression-Ordner ist ein Ordner, dessen Inhalt über eine OCL Expression berechnet wird.
Dies ist eine sehr mächtige und risikofreie Sache, kann aber zu beträchtlichen Performanceproblemen führen, wenn sie nicht mit Bedacht konfiguriert werden. Eine gute Beschreibung dazu finden Sie im Artikel Performanz von OCL Abfragen.
Als performantere Alternative kann stattdessen ein SQL-Ordner verwendet werden.
Ein SQL-Ordner berechnet seinen Inhalt wie der Expression-Ordner, die Objekte werden jedoch via SQL abgerufen.
Das hat den Vorteil, dass die Objekte auf der Datenbank gefiltert werden und nur die Resultatliste ins Memory geladen wird. Eine gute Übersicht zu diesem Thema finden Sie im Artikel Performanceoptimierter Zugriff auf Vertec Objekte.
Möchte man Schnitt- oder Teilmengen aus anderen Ordnern anzeigen, kann dafür ein Abfrage-Ordner gewählt werden.
Es gelten auch hier die Grundsätze für einen performanceoptimierten Zugriff auf Vertec Objekte.
Wie die Liste von Objekten in den Ordnern und Containern (Container sind Ordner, die die via Linktypen verknüpften Objekte enthalten) angezeigt werden, kann über die Listeneinstellungen parametrisiert werden.
Denen Spalten werden über OCL-Expressions und Renderer definiert. Auch hier gilt: So lange nur auf Attribute der in der Liste geladenen Objekte zugegriffen wird, gibt es keinen Einfluss auf die Performance.
Sobald Berechnungen gemacht werden, die auf Objekte zugreifen, welche sich nicht in der Liste befinden, müssen diese geladen werden - für jede Zeile einzeln. Je mehr, desto langsamer. Insbesondere globale Zugriffe sind hier unbedingt zu vermeiden. In solchen Fällen lohnt es sich, einen List Controller einzusetzen, welcher diese Daten nur einmal vorberechnet, und die Resultate via Custom Renderer anzuzeigen.
Associations, also Verknüpfungen zwischen Vertec Objekten, welche sich im Modell befinden, können via Wrapper-Link-Typen auf die Benutzeroberfläche gebracht werden. Deren Objekte auf beiden Seiten werden über OCL berechnet. Die einfachste Form eines Ausdrucks ist die Association selbst: rechnungen für alle Rechnungen eines Projekts. Aber es können auch komplexere OCL-Expressions verwendet werden, zum Beispiel rechnungen->select(not bezahlt) für alle unbezahlten Rechnungen eines Projekts.
Jeder Linktyp erzeugt zwei Ordner auf jeder Seite, in welchen die verknüpften Objekte dargestellt werden. Diese werden Container genannt. Wie diese Listen dargestellt werden, kann wiederum über die Listeneinstellungen eingestellt werden.
Eine Vielzahl von Wrapper-Link-Typen wird bereits mitgeliefert - Beispiele sind die Leistungen auf Bearbeitern, die eigenen Projekte bei Projektleitern etc.
Werden Verknüpfungen zwischen Vertec Objekten benötigt, welche sich nicht im Modell befinden, können dafür Custom-Link-Typen erstellt werden.
Custom-Link-Typen sind individuelle Assoziationen zwischen Vertec-Klassen. Die Objekte werden über die Benutzeroberfläche (Drag & Drop) verknüpft oder können auch über ein Script gesetzt werden.
Tags eignen sich dafür, Vertec Objekte zu kennzeichnen, um dann performant danach suchen zu können (Ja/Nein Kennzeichnung).
Keys sind dafür gedacht, kundenspezifische Werte zwischenzuspeichern, die dann via OCL performant abgefragt werden können.
Diese Werte können entweder via Scripts oder über die Benutzeroberfläche mit einem Custom Renderer gesetzt werden.
Benutzerdefinierte Zusatzfelder können für alle Klassen definiert werden, die von UserEintrag erben (also Subklassen von UserEintrag sind, siehe Modell).
Zusatzfelder erscheinen auf den einzelnen Objekten automatisch auf der Seite Weitere Informationen und können auch in den Listen via Listeneinstellungen angezeigt werden. Es ist auch möglich, sie auf anderen Seiten eines einzelnen Objekts zu platzieren und via Scripts darauf zuzugreifen.
Es ist eine mächtige Funktion, aber keine leistungsfähige: Die Werte in den Zusatzfeldern sind nicht direkt auf dem Objekt gespeichert, sondern auf einem separaten Zusatzfeld-Objekt. Diese Liste von Objekten muss zuerst geladen werden, wenn man sie z.B. via ->select() filtern will.
Hier kann es sich lohnen, auf leistungsfähige Alternativen wie Keys und Tags anstelle eines Zusatzfelds zu setzen. Deren Handling ist zwar auf den ersten Blick etwas komplizierter, aber mittels Custom Renderern lassen sich für den Enduser sehr einfache Anwendungen erzielen.
Vertec hat 50 "leere" Klassen, die Zusatzklassen. Diese haben keine Members (ausser denen, die sie von ihrer Superklasse UserEintrag erben, siehe Modell) und keine Funktionalität. Sie dienen dazu, Objekte einer individuellen Art erzeugen zu können, die nicht im Modell enthalten ist.
Um eine Zusatzklasse nutzen zu können, muss sie in den Klasseneinstellungen definiert und dafür Zusatzfelder erstellt werden. Dann werden sie über Custom-Link-Typen mit anderen Objekten verknüpft, um auf der Oberfläche zu erscheinen. In diesen Containern werden die einzelnen Objekte dann entweder manuell erzeugt ("Neu"-Häkchen auf dem Link-Typ setzen), oder aber via Script.
Die Zusatzfelder erscheinen bei Zusatzklassen automatisch auf der ersten Seite (nicht unter Weitere Informationen), sortiert nach ihrer Reihenfolge auf der Zusatzfeld-Definition. Möchte man die Darstellung dieser Seite beeinflussen, kann das via Customizing von Seiten geschehen.
Einzelne Objekte wie Projekte oder Rechnungen werden in Seiten, sogenannten Pages, angezeigt. Sie sind in XML definiert, und via Customizing von Seiten können bestehende Teile von Seiten überschrieben, Elemente darin eingefügt oder daraus entfernt oder neue Seiten hinzugefügt werden. Das XML der Seiten wird in den Klasseneinstellungen gespeichert.
Vertec enthält eine Python-Runtime-Engine (2.7 zur Abwärtskompatibilität und 3.12). In Scripts kann über das Modul "vtcapp" auf Vertec Objekte und die Businesslogik zugegriffen werden. Sie werden registriert und können als Menüpunkte auf Vertec Objekten oder in Listen angezeigt werden, damit die User passende Vorgänge auslösen können.
Die Erstellung von Office-Berichten (Word, Excel, PDF) in Vertec erfolgt über ein Skript, das die zu druckende Struktur generiert, und eine Word- oder Excel-Vorlage zur Definition des visuellen Erscheinungsbilds.
Eine Vielzahl von Office-Berichten wird standardmässig mitgeliefert, siehe Alle Vertec Berichte auf einen Blick.
Um die Standardberichte an Ihr Erscheinungsbild anzupassen, können Sie bestehende Vorlagen herunterladen, anpassen und wieder hochladen. Um Logik einzubauen, können die bestehenden Scripts erweitert werden. Es können auch ganz neue Vorlagen erstellt werden. Alle Informationen dazu finden Sie im Artikel Berichte registrieren.
Gültigkeitsbedingungen, sogenannte Constraints, sind OCL Expressions, die auf Objekten ausgewertet werden und definieren, ob das Objekt gültig ist oder nicht.
Nicht gültige Objekte werden in Vertec rot angezeigt, und neue Objekte, die nie gültig waren, werden beim Verlassen von Vertec automatisch gelöscht. Siehe dazu auch den Artikel Gültigkeit / Status von Einträgen.
Da die Gültigkeitsprüfung immer erfolgt, also auch, wenn ein Objekt nur (einzeln oder in Listen) angezeigt wird, muss zwingend auf die Performance geachtet werden.
Python Scripts können nicht nur als Menüpunkte registriert werden, sondern auch als Scripts auf Events, die bei bestimmten Ereignissen automatisch ausgelöst werden, zum Beispiel, wenn ein neues Objekt erzeugt oder ein Member geändert wird.
Damit wird in die Businesslogik von Vertec eingegriffen, und es muss darauf geachtet werden, dass dadurch keine ungültigen Zustände entstehen können.
Auch muss das sehr gut dokumentiert werden, damit klar ist, warum und wie solche Vorgänge im Hintergrund ablaufen.
Das Vertec Business Intelligence (BI) Modul erzeugt in BI Generatoren mittels Python Code die Rohdaten, die in einem BI-Cube gespeichert werden, und mittels BI Kennzahlen und BI Anzeigen auf der Vertec Benutzeroberfläche dargestellt werden.
Es können neue Generatoren mit benutzerdefinierten Kennzahlen erstellt werden. Auch können mit den bereits vorhandenen Kennzahlen kundenspezifische BI Anzeigen erstellt und nach Bedarf auch als Standardanzeigen in Ordnern hinterlegt werden.
Die Zahlen können auch via OCL Operatoren für die Abfrage von BI Daten performant in Vertec Listen angezeigt oder via Python Funktion für die Abfrage von BI Daten weiterverarbeitet werden.
Ein List Controller ist ein Python Skript, welches einem Ordner oder einem Link Container zugewiesen werden kann und ausgeführt wird, nachdem ein Ordner seinen Inhalt berechnet hat. Er kann verwendet werden, um Objekte aus Performance-Gründen vorab zu laden und Werte, die in der Liste angezeigt werden sollen, vorab zu berechnen. Der Zugriff auf die Werte und die Anzeige in der Liste erfolgt dann via Custom Renderer.
Custom Renderer sind in Python definiert und werden verwendet, um Werte in Listen oder Detailseiten anzuzeigen. Die meisten werden in Verbindung mit List Controllern verwendet, um vorberechnete Werte anzuzeigen.
Auch können Custom Renderer verwendet werden, um Werte anders darzustellen und um die Erfassung von Keys und Tags über die Benutzeroberfläche zu erleichtern.
Bei Cusom Renderern ist insbesondere wichtig, auf die Subscriptions zu achten, damit sich die angezeigten Werte automatisch aktualisieren, wenn zugrunde liegende Werte verändert werden.
Mit dem Modul Ressourcenplanung können spezielle Listcontroller verwendet werden, um das Verhalten der Vertec Ressourcenplanung zu definieren. Die angezeigten Grafiken (und Werte) werden über Auslastungsdimensionen und Ansichten definiert. Der Bereich ist komplex und performancerelevant, da komplizierte Berechnungen das Handling signifikant verlangsamen können. Sie finden eine Übersicht im Artikel OCL, Python, Custom Renderer und List Controller rund um die Ressourcenplanung.
Vertec liefert mit dem Vertec REST API einen Webservice standardmässig mit.
Es können aber auch benutzerdefinierte Custom Webservices erstellt werden, um von aussen auf Vertec zugreifen zu können.
Dafür wird ein Script erstellt, welches eine Python-Klasse definiert, die WebService vom Vertec Python Modul "vtcweb" subklassiert.
Die Bereitstellung als Endpunkt der URL erfolgt über das Webservice Objekt.
Anhand einiger Beispiele möchten wir durch mögliche Gedankengänge bei der Wahl einer Anpassung führen.
Als Beispiel möchten wir Adressen einen der folgenden Status zuweisen: PK, K, IOK oder Intern.
Um zu diesem Ziel zu kommen, gibt es folgende Varianten:
Schauen wir in der Liste, welche der Varianten sich möglichst weit oben befindet, fällt unsere Wahl klar auf den Stichwortordner.
Diese Variante eignet sich vor allem für Stammdaten wie Projekte, Adressen oder Bearbeiter, um diese zu kategorisieren. Der Vorteil ist, dass man in den Stichwortordnern auch gleich die zugeordneten Objekte einsehen kann.
Als Beispiel möchten wir Adressen visieren. Wir möchten also kennzeichnen können, ob eine Adresse schon visiert wurde oder nicht.
Dafür gibt es folgende Varianten:
Ein Boolean-Zusatzfeld ist zwar auf den ersten Blick einfacher zu erstellen, aber gerade bei Ja/Nein-Suchen wenig performant, da sich der Wert in einem Hilfsobjekt befindet, welches für alle Objekte noch separat geladen werden muss.
Deshalb wählen wir dafür den Tag und richten ihn so ein, dass der User ebenfalls einfach ein Häkchen setzen kann. Eine Anleitung dafür finden Sie hier: Einen Tag setzen.