Python Scripts in Vertec
Vertec hat eine Python Engine eingebunden, um benutzerdefinierte Scripts ausführen zu können. Aus einem Vertec Pythonscript heraus ist wiederum das ganze Vertec Objektmodell zugänglich.
Ein Script kann entweder über den Vertec Script-Editor oder in jedem Text-Editoren (z.B. Notepad) erstellt werden.
Mehr Informationen über Python finden Sie in der Python Standard Library unter http://docs.python.org/library.
Scripts, die immer wieder verwendet werden, können im Vertec auch registriert werden. Sie sind dann über den Menüpunkt "Eintrag" oder im Kontextmenü über die rechte Maustaste abrufbar. Siehe dazu den Artikel über das Registrieren von Scripts.
Der Python-Editor
Scripts erstellen oder laden
Um ein Python Script zu erstellen oder auszuführen, gibt es einen Python Editor. Um diesen im Vertec einzublenden, müssen Sie Vertec mit dem Parameter /pythonedit starten.
Über das Menü Optionen können Sie daraufhin den Python Editor aufrufen:

Zuerst öffnet sich der leere Editor:

Im oberen Teil des Fensters wird der Scriptcode angezeigt bzw. geschrieben. Der untere Teil mit den >>> ist das Ausgabe-Fenster.
Folgende Buttons sind verfügbar:

Neue Datei: Fügt einen weiteren Reiter im Codefenster ein, wo ein Script geschrieben oder geladen werden kann.
Datei öffnen: Über diesen Button können Sie ein bestehenden Script in den Editor laden. Es erscheint im aktuellen Reiter.
Datei speichern: Speichert das Script im aktuellen Reiter als .py-Datei ab.
Datei schliessen: Schliesst das Script bzw. den Reiter im Editor. Nicht gespeicherte Inhalte gehen verloren!
Datei ausführen: Führt das Script aus. Falls Fehler auftreten, erscheinen diese im Ausgabefenster.
Neben den üblichen Kürzeln für Kopieren (Ctrl-C) und Einfügen (Ctrl-V) sind die folgenden Tastaturkürzel im Python Scripteditor nützlich:
Markieren und Tab: markierten Block einrücken
Markieren und Shift-Tab: Einrückung des markierten Blocks verkleinern
ALT-Backspace: Undo (letzte Textänderung rückgängig machen)
Shift-ALT-Backspace: Redo (letztes Undo rückgängig machen)
Die Library "vtcapp"
Mit der Vertec Installation wird eine Vertec Python Library mitgeliefert. Diese ist nach der Installation automatisch verfügbar und heisst vtcapp.
Damit alle Funktionen und Methoden dieser Library im Script verfügbar sind, muss sie am Anfang des Scripts importiert werden:
import vtcapp
Die Lybrary hat folgende Methoden / Funktionen:
| Methode/Funktion | Beschreibung | Beispielcode |
|---|---|---|
| __doc__ | Dokumentation einer Funktion. |
import vtcapp vtcapp.__doc__ >>> Interface module to host application. |
| argobject | Aktuelles Vertec Objekt | projekt = argobject |
| beginsystemcontext() | Mit Super-Rechten ausführen. Muss am Ende endsystemcontext() aufrufen, um Super-Rechte freizugeben. Ist im Python-Editor aus Sicherheitsgründen nicht erlaubt. |
from vtcapp import beginsystemcontext, endsystemcontext try: beginsystemcontext() finally: endsystemcontext() |
| createobject(klasse: string) | Erstellt neues Objekt der angegebenen Klasse. |
from vtcapp import createobject leistung = createobject("OffeneLeistung") |
| currentlogin(): Projektbearbeiter | Aktuell angemeldeter User |
from vtcapp import currentlogin bearbeiter = currentlogin() print bearbeiter.name >>> Christoph Keller |
| deleteinvalidobjects() | Löscht ungültige Objekte des aktuellen Logins. |
from vtcapp import deleteinvalidobjects deleteinvalidobjects() |
| disableevents() | Eventsscripting ausschalten. Muss mit enableevents() wieder eingeschaltet werden. Diese Funktion wird oft verwendet, wenn man ein gewisses Attribut anpassen möchte, welche eigentlich einen Event ausführen würde. Ist im Python-Editor aus Sicherheitsgründen nicht erlaubt. Achtung: Nach dem enableevents() darf es keine msgbox() mehr haben, sonst werden die nicht aufgerufenen Events nachträglich aufgerufen. |
from vtcapp import enableevents, disableevents # Ganzes Script finally: disableevents() # Teil eines Scripts rechnung.datum = date.today() disableevents() |
| dologin(loginname: string, passwort: string): boolean | Wechselt den aktuellen Login in Vertec. Rückgabewert: Login erfolgreich oder nicht. |
from vtcapp import dologin dologin("keller", "") |
| enableevents() | siehe disableevents() | |
| endsystemcontext() | siehe beginsystemcontext() | |
| evalocl(expression: string): expressiontype | Globale OCL Expression auswerten. |
from vtcapp import evalocl projektListe = evalocl("Projekt.allinstances ->orderby(code)") |
| evaloclstring(obj: object, expStr: string): string | OCL Expression innerhalb eines Strings auswerten. Rückgabewert: vollständig ausgewerteter String. |
from vtcapp import evaloclstring print evaloclstring(argobject, "Bearbeiter: %name% ist %stufe.asstring%") >>> Bearbeiter: Christoph Keller ist Senior Consultant |
| evaltovariable(obj: object, ocl: string, varname: string) | Wertet eine OCL aus und speichert den Wert in eine OCL Variable. Die Variable kann man nur mit eval() auf das Objekt abfragen. |
from vtcapp import evaltovariable evaltovariable(argobject, "kuerzel+' - '+name", "userinfo") print argobject.eval("userinfo") >>> CK - Christoph Keller |
| getmemberwithsql(obj: object, membername: string, where: string, order: string): list of objects | SQL Statment auf einen Linktyp ausführen. SQL: Hole alle Offene Leistungen auf Projekt, die den Betrag>200 haben, ohne alle Offene Leistungen des Projektes zu laden. OCL: projekt.offeneleistung ->select(xwertext>200) würde nach offeneleistung gleich alle laden. |
from vtcapp import getmemberwithsql projekt = argobject li=getmemberwithsql(projekt, "offeneleistungen", "xwertext>200", "") print len(li) >>> 3 |
| getpropertyvalue(propname: string): propertytype | Hole Wert eines Propertys. |
from vtcapp import getpropertyvalue print getpropertyvalue("globaldokpfad") >>> C:\Programme\Vertec\Dokumente |
| getwithsql(klasse: string, where: string, order: string): list of objects | Globale SQL Statment ausführen. |
from vtcapp import getwithsql liste = getwithsql("Adresseintrag", "standardstrasse like 'Badenerstr%'", "") |
| inputbox(caption: string, prompt: string, default: string): string | Einfaches Eingabefeld anzeigen.
|
from vtcapp import inputbox print inputbox("Titel", "Geben Sie einen Text ein:", "") >>> test |
| log(category: string, level: int, msg: string) |
Log Message in Vertec Logging System. Levels vorhanden:
|
from vtcapp import log projekt = argobject if leistung: |
| msgbox(msg: string) | Message Box anzeigen |
from vtcapp import msgbox msgbox("Das ist ein test") |
| readinivalue(section: string, value: string, default: string): string | Werte lesen aus dem Vertec.ini File. |
from vtcapp import readinivalue print readinivalue("database", "servername", "") >>> XY: C:\Programme\Vertec\DB\VertecDemo.fdb |
| selectfromlist (caption: string, text: string, col1caption: string, col2caption: string, default: string, list: list of tuple): string | Erstellt einen Auswahldialog gemäss den Angaben.
|
from vtcapp import evalocl list = [] for projekt in projekte: print SelectFromList("Projekt auswählen", "Wählen Sie das Projekt aus:", "Code", "Betreffend", "", list) >>> COMINSTALL |
| setlanguage(langcode: string [, persistent: boolean=False]) | Stellt die Sprache in Vertec um. |
from vtcapp import setlanguage setlanguage("EN") |
| showdetailform(obj: object) | Form eines Objektes anzeigen |
from vtcapp import createobject, showdetailform leistung = createobject(Offeneleistung) showdetailform(leistung) |
| sqldateliteral(datum: date): date | Diese Methode ergibt das richtige Datumsformat für SQL-Abfragen, je nach verwendetem Datenbankserver |
from datetime import date |
| sqlwhere(where: string): string | SQL Where Clause auf den aktuell verwendeten Datenbankserver anpassen. |
import vtcapp |
| strtodate(strDate: string): date | Wandelt einen String in ein Datum um. |
from vtcapp import strtodate print strtodate('1.10.09') >>> 2009-10-01 00:00:00 |
| translate(txt: string): string | Übersetzt einen GUI Text in die aktuelle Vertec Sprache. |
from vtcapp import setlanguage, translate setlanguage("EN") >>> Service |
| updatedatabase() | Speichert Änderungen in die Datenbank. import vtcapp vtcapp.updatedatabase() validateobjects() Validiert neuerstelle Objekte. Diese sind, sofern sie keine Regeln verletzen, danach nicht mehr ungültig. |
import vtcapp |
Classname eines Objektes
Zugriff auf classname funktioniert nur über OCL in Python.
obj.eval('ocltype.asstring')
Funktionen ohne Parameter aufrufen
Beim Aufruf einer Funktion, welche keine Parameter erwartet, ist es sehr wichtig, dass die Klammern nicht vergessen gehen. Beispiel:
from vtcapp import updatedatabase
updatedatabase #Falsch, Funktion wird nicht aufgerufen und es wird keine Fehlermeldung ausgegeben!
updatedatabase() #Richtig
Funktion aufrufen (aus einem anderen Script)
In Python ist es möglich eine Funktion aus einem anderen Script aufzurufen. Funktionen, welche öffters bzw. in mehreren Scripts verwendet werden, sollten in einem eigenen Script (Modul) ausgelagert werden.
Aufruf:
import <scriptname> #Scriptname des Moduls
<scriptname>.<funktion>
Beispiel:
import ZuAbschlaege
ZuAbschlaege.berechneRabatt(ZuAbschlaegeListe)
Import-Varianten
Es sind 2 Möglichkeiten vorhanden, wie ein Modul importiert werden kann.
| Variante | Beschreibung | Beispielcode |
|---|---|---|
| Variante 1 | Importiert das gesamte Modul. Der Aufruf der Funktion muss mit dem Modulnamen beginnen (<scriptname>.<funktion>).
Vorteil: Diese Variante wird empfohlen, wenn das Modul nur wenige Funktionen beinhaltet und alle bzw. fast alle Funktionen benötigt werden. |
import vtcApp vtcApp.msgbox("Das ist ein Test") vtcApp.updateDatabase() |
| Variante 2 | Variante 2: Importiert die einzelnen Funktionen des Moduls. Der Aufruf der Funktion wird mit dem Funktionsnamen aufgerufen (<funktion>). Vorteil: Diese Variante wird empfohlen, wenn nur wenige Funktionen verwendet werden. |
from vtcApp import msgbox, updatedatabase msgbox("Das ist ein Test") updateDatabase() |
Modul neu laden (Reload)
Die Imports werden beim ersten Aufruf geladen. Vertec merkt sich nun, dass dieses Modul (Script) geladen ist und lädt es nicht wieder. Das bedeutet: Bei einer Änderung des Moduls, sind die Änderung nicht sichtbar, wenn das geänderte Modul bereits geladen wurde.
Mit dem Befehl reload kann ein Modul neu geladen werden. Dies kann einmalig über den Python Editor im Vertec (Optionen -> Python Editor) ausgeführt werden oder bei ständigen Anpassungen auch direkt im Script nach dem import-Befehl integriert werden. Beispiel:
import ZuAbschlaege
reload(ZuAbschlaege)
Globale Variablen definieren
Unterschied zwischen lokalen und globalen Variablen:
Lokale Variablen können nur innerhalb der Funktion verwendet werden und müssen für jede Verwendung in einer anderen Funktion als Parameter übergeben werden.
Globale Variablen werden einmal initialisiert und sind in jeder Funktion im gleichen Script verfügbar.
Globale Variablen deklariert man ausserhalb von Funktionen. Die Deklaration ist gleich wie bei lokalen Variablen (x = 5).
Um diese Variablen innerhalb der Funktionen zu verwenden, muss die globale Variable geladen werden (global Variable). Beispiel:
Leistung = argobject
def WertExtAendern(betrag):
global Leistung # globale Variable verwenden
Leistung.xWertExt = betrag
def BearbeiterSetzen(bearbeiter):
global Leistung
Leistung.bearbeiter = bearbeiter
| erstellt: | 22.02.2010 |
|---|---|
| geändert: | 09.12.2011: Methode sqldateliteral hinzugefügt. |
| Produktlinien: | Expert |
| Module: | Leistung & CRM |
