Python Scripts in Vertec

Grundlagen Python Scripts

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:

menu_pythoneditor.png

Zuerst öffnet sich der leere Editor:

python_editor.png

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:

pythoneditor_buttons.png

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/FunktionBeschreibungBeispielcode
__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()
main()

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
try: enableevents()
main()

finally: disableevents()

# Teil eines Scripts
enableevents()

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.
  • caption: Titel des Forms
  • prompt: Einleitungstext
  • default: Default-Wert

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:

  • 10: Debug Log
  • 20: Info Log
  • 30: Warning Log
  • 40: Error Log
  • 50: Fatal Log

from vtcapp import log

projekt = argobject
leistung = projekt.eval("offeneleistungen->first")

if leistung:
try:
leistung.xwertext = 0
except:
log("Leistungen anpassen", 30, "Keine Berechtigung")

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.
  • caption: Titel des Forms
  • text: Einleitungstext
  • col1caption: Spaltentitel 1
  • col2caption: Spaltentitel 2
  • default: Default Rückgabewert
  • list: Liste mit den Values

from vtcapp import evalocl

list = []
projekte= evalocl("Projekte.allinstances ->orderby(code)")

for projekt in projekte:
list.append((projekt.code, projekt.betreffend))

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
myaktivitaeten = vtcapp.getwithsql('aktivitaet', 'datum <= %s' % sqldateliteral(date.today()), '')

sqlwhere(where: string): string SQL Where Clause auf den aktuell verwendeten Datenbankserver anpassen.

import vtcapp

vtcapp.sqlwhere("code like 'GH_%'")

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")
print translate("Leistung")

>>> 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
vtcapp.validateobjects()

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.

VarianteBeschreibungBeispielcode
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
abgelegt unter:
   

kontakt

Suche in Knowledge Base
Hotline

Vertec Hotline: +41 43 444 60 05
Mo - Fr: 9-12 / 14-17 Uhr
Netviewer starten...
Weitere Informationen zu Netviewer.

Haben Sie eine technische Frage zu einem Vertec-Produkt?
zum Anfrageformular...

Unsere Kunden über unsere Support-Leistungen

„Vertec bietet einen hervorragenden Support beim Weiterausbau und bei der Parametrisierung und auch die Hotline-Unterstützung verdient das Prädikat top.“

Thomas Marx, Egeli Informatik AG (40 User)


„Der hervorragende Support, die Hotline sowie eine permanente Weiterentwicklung des Produkts garantieren uns einen hohen Investitionsschutz.“

Moreno Bellido , Walder Wyss & Partner AG, (156 User)