Vertec Python Interfaces

Produktlinien: Expert
Module: Leistung & CRM
Erstellt: 04.03.2013, Änderung:
Modul ziputils dokumentiert.
Mehr ansehen

Das Modul "vtcapp"

Mit der Vertec Installation wird eine Vertec Python Library mitgeliefert. Diese ist nach der Installation in den Python Scripts automatisch verfügbar und heisst vtcapp. Zu dieser Tabelle gibt es die Hilfe-Funktion help(vtcapp), welche alle Informationen dazu auflistet.

Das Modul hat folgende Methoden / Funktionen:

Methode / Funktion Beschreibung Beispielcode

__doc__

Dokumentation einer Funktion.
>>> print vtcapp.__doc__ 
Interface module to host application.
argobject Aktuelles Vertec Objekt. Diese Variable ist immer verfügbar, der Aufruf kann also ohne vtcapp. erfolgen.
Siehe dazu auch die Beschreibung im Artikel Python Scripts.
projekt = argobject
appdatapath()

Gibt den Pfad zum Vertec Application Data Ordner zurück und erstellt den Ordner, falls noch nicht vorhanden.

Normalerweise befindet sich der Appdata Folder unter dem Pfad \Anwendungsdaten\Vertec. Als Ordnername unter Anwendungsdaten wird derselbe Ordnername genommen, in dem Vertec gestartet wurde. Falls sich Vertec z.B. in einem Ordner VertecTest befindet, dann heisst der dazugehörige Appdate Folder ebenfalls VertecTest.

Falls VertecServer als Dienst gestartet wird, dann wird der AppData Ordner unter Alle Benutzer angelegt, da Dienste normalerweise kein Benutzerprofil zugeordnet haben.

Siehe dazu auch den Artikel Logging.

>>> print vtcapp.appdatapath()
C:\Users\christoph.keller\AppData\Roaming\Vertec
beginsystemcontext() Aktiviert innerhalb des Scripts die erweiterten Berechtigungen. Muss am Ende endsystemcontext() aufrufen, um die erweiterten Berechtigungen wieder freizugeben. Ist im Python-Editor aus Sicherheitsgründen nicht erlaubt.
try: vtcapp.beginsystemcontext() 
main() finally: vtcapp.endsystemcontext()
checkcreate(klasse:string): int

Prüft, ob Berechtigung zum Erstellen von Objekten der angegebenen Klasse besteht.

Rückgabewert ist 0 oder 1 (False, True)

>>> print vtcapp.checkcreate('Projekt')
1
checkfeature(featurecode: string): boolean

Prüft, ob ein bestimmtes Feature lizenziert ist.

Die Featurecodes sind gemäss Vertec Featurematrix (z.B. fcPhasen für Phasen).

Rückgabewert ist False oder True

>>> vtcapp.checkfeature('fcPhasen')
True
comparetext(str1, str2): int

Vergleicht 2 Strings mit derselben Logik wie in Vertec (ComboBoxen, Spaltensortierung). Ist ein normaler ANSI Textvergleich (case insensitive) mit der Ergänzung, dass Bindestriche und Apostrophs als normale Zeichen im Vergleich berücksichtigt werden.

Falls die Strings übereinstimmen, ist der Rückgabewert 0, sonst -1 oder +1 je nachdem welcher String "grösser" ist.

>>>  vtcapp.comparetext('Dies ist mein Test', 'Dies ist mein Text')
-1

>>>  vtcapp.comparetext('Dies ist mein Test', 'Dies ist mein Test')
0

>>> vtcapp.comparetext('Dies ist mein Text', 'Dies ist mein Test')
1
createlist(classname, [list]): list Ab Version 6.1.0.14. Damit kann eine Vertec-Liste erzeugt werden, auf welcher dann OCL ausgewertet werden kann.
  • classname: der Klassenname der Objekte, welche die Liste aufnehmen wird. Der Klassenname ist notwendig, damit die Liste selbst eine statische Typ-Information enthält und als Basis für die Auswertung von OCL Expressions dienen kann.
  • list (optional): das optionale List Argument ermöglicht die Konstruktion einer Liste direkt aufgrund einer anderen Liste. Wird das Argument nicht gesetzt, ist die erzeugte Liste leer und kann via append() oder extend() Methode gefüllt werden (siehe Auflistung der verfügbaren Methoden auf Vertec-Listen).
Ab Vertec 6.2.0.7 liefern die Python-Methoden evalocl(), getwithsql() und getmemberwithsql() automatisch Vertec-Listen zurück, siehe Vertec-Listen.
mylist = vtcapp.createlist('Projekt')
mylist.append(argobject)

oder

liste = vtcapp.createlist("Projekt", vtcapp.evalocl("projekt->select(code.sqllike('A%'))"))
liste2 = liste.evalocl("self->select(aktiv)")
createobject(klasse: string) Erstellt neues Objekt der angegebenen Klasse.
leistung = vtcapp.createobject("OffeneLeistung")
currentlogin(): Projektbearbeiter Aktuell angemeldeter User
>>> bearbeiter = vtcapp.currentlogin()
>>> bearbeiter.name
Christoph Keller
currentobject Siehe dazu die Beschreibung im Artikel Python Scripts.
projekt = currentobject
disableevents() Mit disableevents() kann das Eventsscripting ausgeschaltet werden. Dies betrifft dann die gesamte Vertec-Session (andere Vertec-Sessions oder Desktop Apps sind nicht betroffen).
Diese Funktion wird z.B. dann verwendet, wenn ein gewisses Attribut angepasst werden soll, welches sonst einen Event ausführen würde.

Muss mit enableevents() wieder eingeschaltet werden. Benötigt erweiterte Berechtigungen.
 
Ist im Python-Editor aus Sicherheitsgründen nicht erlaubt. 
# Ganzes Script
try:
vtcapp.disableevents()
main()
finally:
vtcapp.enableevents()

# Teil eines Scripts
vtcapp.disableevents()
rechnung.datum = vtcapp.currentdate()
vtcapp.enableevents()
enableevents() siehe disableevents()  
endsystemcontext() siehe beginsystemcontext()  
evalocl(expression: string): expressiontype Globale OCL Expression auswerten.
projektListe = vtcapp.evalocl("Projekt.allinstances->orderby(code)")
evaloclstring(obj: object, expStr: string): string OCL Expression innerhalb eines Strings auswerten. Rückgabewert: vollständig ausgewerteter String.
>>> vtcapp.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 dann global mit evalocl() abgefragt werden.

Ab Version 6.1.0.14 darf als Variablenname "self" nicht mehr verwendet werden, da dies ein Schlüsselwort ist. Es erscheint eine entsprechende Fehlermeldung.

>>> projekt = vtcapp.evalocl("projekt->select(code='TRASTA')->first")
>>> vtcapp.evaltovariable(projekt, "rechnungen->first", "varRechnung")
>>> vtcapp.evalocl("varRechnung")
15070005, TRASTA >>> projekt.evalocl("varRechnung")
15070005, TRASTA
executefile(pfad: string)

Öffnet eine Datei auf dem Client (ohne Web App). Der Dateipfad muss vom Client aus erreichbar sein.

Kann auch verwendet werden, um ein Programm zu starten (z.B. "calc.exe").

pfad = r'S:\Dokumente\Kontakte\Bistro Cooper\Brief.docx'
vtcapp.executefile(pfad)

Das r vor dem Pfad bewirkt, dass Steuerzeichen ignoriert werden. Da der Backslash in gewissen Kombinationen für Python ein Steuerzeichen darstellt, kann es passieren, dass sonst der Pfad nicht richtig interpretiert bzw. verstückelt wird und es einen Fehler gibt.

vtcapp.executefile("calc.exe")

öffnet den Windows Rechner.

executefolder(pfad: string)

Öffnet den angegebenen Ordner auf dem Client (ohne Web App), z.B. im Windows-Explorer. Der Pfad muss vom Client aus erreichbar sein.

Existiert der Ordner noch nicht, erscheint eine Meldung, ob er erzeugt werden soll:

In einem Script muss das darum abgefragt und der Ordner allenfalls im Code erzeugt werden, wenn keine Meldung auf der Oberfläche erscheinen soll. Dies kann z.B. über das Python Modul os geschehen.

import os
pfad = r'S:\Dokumente\Kontakte\Bistro Cooper'
if os.path.isdir(pfad):
  vtcapp.executefolder(pfad)

Das r vor dem Pfad bewirkt, dass Steuerzeichen ignoriert werden. Da der Backslash in gewissen Kombinationen für Python ein Steuerzeichen darstellt, kann es passieren, dass sonst der Pfad nicht richtig interpretiert bzw. verstückelt wird und es einen Fehler gibt.

executereport(rootObj, optarg, berichtObj, [saveAs, showDialog, doPrint, showApp])

Ab Version 5.8. Erlaubt den Aufruf und das Ausführen von Reports aufgrund eines Bericht-Objekts.

  • rootObj: Das Objekt, auf dem der Report ausgeführt wird.
  • optarg: Entspricht der optionalen Adresse auf dem Druckdialog. Optionales Argument. Wenn nicht verwendet, Parameter mit None angeben.
  • berichtObj: Eine Vertec Bericht-Definition (Klasse Bericht). Der Report wird aufgrund dieser Definition ausgeführt.
    Handelt es sich um einen office-generierten Word- oder Excel-Bericht, kann anstelle des Berichtsobjekts auch ein Pfad für das Office-Template angegeben werden.
    Die Einstellungen des Bericht-Objekts für Speichern unter und Dialog anzeigen können via die entsprechenden Argumente dieser Methode noch übersteuert werden.
  • saveAs: Optional. Pfad zum Speichern des Berichts (falls Office-Bericht). Dieser String kann auch OCL Expressions (mit % getrennt) enthalten.
    Falls ein Leerstring angegeben wird, dann wird kein File gespeichert.
    Wenn None übergeben wird, werden die SaveAs-Einstellungen aus dem Report Objekt (berichtObj) übernommen.
  • showDialog: Anzeige von Dialog mit Speichern unter etc. (falls Office-Bericht). Optional. Mögliche Werte: True oder False. Ab Version 6.1.0.14 wird auch die Anzeige von Meldungen wie "existierendes File überschreiben" und "neuen Pfad erstellen" über diese Einstellung gesteuert. Wenn der Parameter nicht gesetzt wird, wird die entsprechende Einstellung aus dem Report Objekt (berichtObj) übernommen.
  • doPrint: Optional. Mögliche Werte: True oder False. Falls True, wird der Bericht direkt ausgedruckt. Bei Word-Berichten wird Word dann nicht angezeigt.
    Hinweis: Bei Vertec-generierten Word-Berichten wird dieser Wert nicht berücksichtigt. 
  • showApp: Gibt an, ob die Applikation offen angezeigt werden soll (wird nicht beachtet, wenn doPrint=True). Optional. Mögliche Werte: True oder False.

Einen Word-Report für Rechnung anzeigen, ohne Dialog und ohne ein File zu speichern:

vtcapp.executereport(rech, None, rechTempl, "", showDialog=False)
Die Variable rechTempl muss das Bericht Objekt für eine Rechnung enthalten, die Variable rech das Rechnungsobjekt.

executeserverwordreport(rootObj, optarg, templatePath, [outputFormat, saveAs, showDialog, showApp])

Ab Version 6.1.0.11. Diese Methode dient dazu, Vertec-generierte Word-Reports ohne Bericht-Objekt auszuführen.

  • rootObj : Das Objekt, auf dem der Report ausgeführt wird.
  • optarg : Entspricht der optionalen Adresse auf dem Druckdialog. Optionales Argument. Wenn nicht verwendet, Parameter mit None angeben.
  • templatePath: Ein Pfad für das Word-Template.
  • outputFormat : Ein String für das Ausgabeformat. Akzeptiert: "DOCX" oder "PDF". Default: "DOCX"
  • saveAs : Pfad zum Speichern des Berichts als String. Dieser String kann auch OCL Expressions (mit % getrennt) enthalten. Falls ein Leerstring angegeben wird oder das Argument weggelassen wird, dann wird kein File gespeichert. Default: ""
  • showDialog : Anzeige von Dialog mit Speichern unter etc. als boolean. Default: False
  • showApp: : Boolean, der angibt, ob die Applikation offen angezeigt werden soll. Default: True
vtcapp.executeserverwordreport(argobject, None, r"C:\Program Files (x86)\Vertec\Reports\Deutsch\Brief.dot", "", "C:\\Dokumente\\Vertec\\Test", True, True)
executeurl(url)

Öffnet die angegebene URL auf dem Client (alle Apps).

Zum Beispiel eine Website im Browser öffnen:

vtcapp.executeurl("www.vertec.com")

Oder eine Vertec Breadcrumb URL:

vtcapp.executeurl("vertec://CK-676/eigene+Projekte-49/COMINSTALL-2880/")
generateinvoicenumber()

Erzeugt die nächste Vertec Rechnungsnummer gemäss Systemeinstellungen Rechnung / Honorarnote.

rech = argobject
rech.nummer = vtcapp.generateinvoicenumber()
getmemberwithsql(obj: object, membername: string, where: string, order: string): list of objects SQL Statment auf einen Linktyp ausführen.
Der ausführende Benutzer muss über Administratorenrechte oder über das SQL Query Recht verfügen.
Für die Erteilung von temporären Administratorenrechte steht die Variante der erweiterten Berechtigungen zur Verfügung.
projekt = argobject
li=vtcapp.getmemberwithsql(projekt, "offeneleistungen", "xwertext>200", "")
print len(li)
>>> 3
getobjectbyid(id: int or string): object Holt das Objekt mit der entsprechenden ID
obj = vtcapp.getobjectbyid(62162)

oder

obj = vtcapp.getobjectbyid("62162")

Ist die ID nicht vorhanden, wird ein Fehler geworfen.

getpropertyvalue(propname: string): propertytype Hole Wert eines Propertys.
print vtcapp.getpropertyvalue("globaldokpfad")
>>> C:\Programme\Vertec\Dokumente
getwithsql(klasse: string, where: string, order: string): list of objects

ab Vertec 6.3.0.8:

getwithsql(klasse: string, where: string, order: string, [idfilterfeld: string, objectlist: list]): list of objects

Globales SQL Statment ausführen.
Der ausführende Benutzer muss über Administratorenrechte oder über das SQL Query Recht verfügen.
Für die Erteilung von temporären Administratorenrechte steht die Variante der erweiterten Berechtigungen zur Verfügung.
  • klasse: Klassenname als String.
  • where: SQL where clause. Diese kann auch mithilfe der Methoden sqlwhere() und sqlwherebetweendate() erstellt werden.
  • order: SQL Sortierexpression, üblicherweise ein  Feldname der angegebenen Klasse.
    Kann nur verwendet werden, wenn kein idfilterfeld/objectlist angegeben wird.
Optional können ab Vertec 6.3.0.8 folgende Filterkriterien angegeben werden:
  • idfilterfeld: Name des Members, nach welchem die Liste gefiltert werden soll.
  • objectlist: Liste der Objekte, nach welchen im unter idfilterfeld angegebenen Feld gesucht werden soll.
Bei Listen (nicht die Ergebnisliste, sondern die Filterkriterienliste, hier im Beispiel rechts also die projektlist) von mehr als 1500 Einträgen muss zwingend mit diesen Filterkriterien gearbeitet werden, da sonst eine Fehlermeldung erscheint.
liste = vtcapp.getwithsql("Adresseintrag", "standardadresse like 'Badenerstr%'", "name")
for adresse in liste:
print adresse

ab Vertec 6.3.0.8:

projektlist = argobject.evalocl("eigprojekte")
liste = vtcapp.getwithsql("OffeneLeistung", "datum<=%s" % sqlDate, "", "projekt", projektlist)
oder auch ohne whereclause:
liste = vtcapp.getwithsql("OffeneLeistung", "", "", "projekt", projektlist)

getwithsqlbymember(klasse: string, member: string, expression: string, order [optional]: string): list of objects Ab Vertec 6.3.0.8. Ermöglicht die Suche von Objekten einer Klasse aufgrund eines einzelnen Member-Vergleichs für Benutzer ohne SQL-Recht (die allgemeinen SQL-Such-Methoden getwithsqlundgetmemberwithsql unterliegen den Einschränkungen gemäss SQL-Berechtigung, da sie mit beliebigen SQL Where-Clauses aufgerufen werden können.​​
  • klasse: Klassenname als String.
  • member: Membername als String
  • expression: Vergleichs-String (ohne Delimiter). Er kann % Platzhalter enthalten, etwaige String-Delimiter innerhalb
    des Strings werden escaped. Der Vergleich ist case-insensitiv.
  • order: SQL Sortierexpression, üblicherweise ein Feldname der angegebenen Klasse.
Beim Aufruf der Funktion wird die Berechtigung des aktuellen Bearbeiters auf dem für die Selektion verwendeten Member geprüft. Der Benutzer muss klassenweites Lese-Recht auf dem Member haben, damit die Suche funktioniert. Andernfalls gibt es einen Fehler.
>>> projektlist = vtcapp.getwithsqlbymember("Projekt", "Code", "COM%")
>>> for projekt in projektlist: print projekt
COMINSTALL
COM-SSUP
importconfigset(xmltext: string) Ab Version 6.2. Importiert ein Config Set in Vertec und wendet es an.
Als Config Set wird gültiger XML-Text als String übergeben.
vtcapp.importconfigset("""<?xml version="1.0" encoding="utf-8"?>
<configset name="test" author="test"> <requirements /> <references/>
<objects/> <settings> <system-setting name="GlobalWordTemplatePath">C:/TestConfigSet/>
</system-setting> </settings></configset>""")
inputbox(caption: string, prompt: string, default: string): string Einfaches Eingabefeld anzeigen.
  • caption: Titel des Forms
  • prompt: Einleitungstext
  • default: Default-Wert
print vtcapp.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
projekt = argobject
leistung = projekt.eval("offeneleistungen->first")
if leistung:
try:
leistung.xwertext = 0
except:
vtcapp.log("Leistungen anpassen", 30, "Keine Berechtigung")
msgbox(msg: string) Message Box anzeigen (Versionen vor 6.0)

Als Titel wird Information und als Dialogtyp (Kombination Button / Zeichen) immer Info verwendet.

vtcapp.msgbox("Das ist ein Test")

msgbox(text: string [, int buttons: int, title: string]): int

Message Box anzeigen (Versionen ab 6.0)

Die Funktion wurde der entsprechenden VisualBasic-Funktion (vertec.msgbox) angeglichen und unterstützt nun (optionale) Argumente für Buttons und Title.

Der Aufbau der Buttons und der Rückgabewerte funktioniert wie bei der VB-Variante gemäss Win32 MessageBox Funktion. Siehe Informationen dazu im Artikel msgbox/inputbox: Beschreibung der Parameter.

rendertemplate(templateString, data): unicode string Ab Vertec 6.3.0.9 gibt es eine allgemein verwendbare Template Engine in Python. Sie basiert auf der der Jinja2 Template Engine (​http://jinja.pocoo.org). ​

Für die einfache Verwendung in Vertec gibt es diese Methode. Sie ist auch im Restricted Scripting Modus (Cloud-Abo) verfügbar und liefert einen Unicode String zurück.​

Das templateString Argument kann ein String oder Unicode-String sein und kann Jinja2 spezifische Markups enthalten.

Zur Übergabe der Daten stehen als weitere Argumente der Funktion folgende Möglichkeiten zur Verfügung:

  • Python Dictionary mit String-Werten als Keys. Definiert damit die im Template verfügbaren Variablen.
  • Beliebige Anzahl von Keyword Argumenten, welche die im Template verfügbaren Variablen definieren.
  • Kein weiteres Argument, das Template wird dann ohne Daten verarbeitet.
Alternativ ist es auch möglich, durch import der jinja2 Package die Template Engine direkt zu verwenden. Diese Anwendung ist aber nicht Cloud-Abo kompatibel und wird nicht empfohlen.

Die wichtisten Strukturen sind die folgenden:

  • Ein Block ist mit {% ... %} eingefasst. Er enthält eine Control-Anweisung oder eine Variablen-Zuweisung.
    • {% if proj.code == "ABC" %} ... {% endif %}. Ein If Statement in einem Block wird verwendet, um einen Bereich des Templates konditional auszugeben. Ein if muss durch ein endif abgeschlossen werden. Optional ist auch ein {% else %} dazwischen erlaubt.
    • {% for proj in projects %} ... {% endfor %}. Ein for Statement erlaubt die Wiederholung (Iterierung) eines Template Bereichs. Muss durch endfor abgeschlossen werden.
  • Eine Expression wird mit {{ ... }} abgetrennt. Eine Expression wird im Context des Templates ausgewertet und als String in die Ausgabe des Templates gemischt.
Vollständige Dokumentation der Möglichkeiten in Templates findet sich unter http://jinja.pocoo.org/docs/2.10/templates/.
# Beispiel Code für Ausgabe einer Projektliste

templateText = """
My own projects
===============
{% for proj in projects %}
Project: {{ proj.code }}, {{ proj.beschrieb }}
{% endfor %}
===============
"""

projects = vtcapp.evalocl("timSession->first.login.eigProjekte")
rendered_text = vtcapp.rendertemplate(templateText, projects = projects)

print rendered_text
requestfilefromclient(title: string, path: string, filter: string [, abspath: string]): (filename, file) Ab Vertec 6.3.0.4.
Der Benutzer kann in der Client Applikation ein lokales File auswählen. Dieses wird dann an den Server übertragen und steht als Rückgabewert der Python Methode in Form eines Binär-Streams zur weiteren Verarbeitung zur Verfügung.
  • title: Titel des Dialogs
  • path: Pfad des im Dialog zu öffnenden Verzeichnisses. Falls es den Pfad nicht gibt, wird der Desktop angezeigt.
  • filter: Filterausdruck, um die Auswahl von Dateien im Dialog einzugrenzen
  • abspath: Absoluter Pfad der hochzuladenden Datei. Dieser Parameter ist optional. Wird er angegeben, so wird kein Dialog angezeigt.
Die Methode gibt ein Tupel bestehend aus absolutem Dateinamen und Dateiinhalt zurück.
Die Maximalgrösse der hochzuladenden Datei beträgt 50 MB.
Es existiert eine Blacklist von Verzeichnissen, aus der keine Dateien angefordert werden dürfen, z.B. die Windows-Umgebungsvariable SYSTEMROOT (typischerweise C:\Windows).

Klickt der User im Dialog auf Abbrechen, erscheint in Python die Fehlermeldung: RuntimeError: The file upload was canceled by the user.

Limitierungen der Web App

Der Filedialog kann weder einen benutzerdefinierten Dialogtitel anzeigen, noch lässt er sich auf ein Startverzeichnis setzen. Somit werden die ersten zwei Parameter: title und pathignoriert.

Wird ein clientseitiger Pfad angegeben (Parameter abspath), erscheint in der Web App eine Fehlermeldung.

Beispiele:

vtcapp.requestfilefromclient("Hallo Welt", r"C:\MyDirectory", "Python|.py,Text|.txt,Xml|.xml")
Öffnet einen Dialog mit dem Titel "Hallo Welt" im Verzeichnis C:\MyDirectory, welcher den Upload von PY-, TXT- oder XML-Dateien erlaubt.

vtcapp.requestfilefromclient("", "", "", r"C:\MyDirectory\MyFile.txt")
Lädt die Datei ohne das Öffnen eines Dialogs hoch.

vtcapp.requestfilefromclient("Hallo Welt", r"C:\Windows\System32", "*.dll")
Wirft eine Fehlermeldung, da nicht auf dieses Verzeichnis zugegriffen werden darf

vtcapp.requestfilefromclient("", "", "", r"C:\Windows\System32\cmd.exe")
Wirft eine Fehlermeldung, da nicht auf dieses Verzeichnis zugegriffen werden darf
scriptexecute(scripttext, argobject=None)

Ermöglicht den Aufruf eines Vertec Scripts.

  • scripttext: Als Scripttext wird der eigentliche Code übergeben. Dies kann zum Beispiel der Text eines in Vertec registrierten Scripts oder aber auch ein Codetext selbst sein.
  • argobject: Mit diesem Parameter können Sie das Objekt angeben, auf dem das Script ausgeführt werden soll. Wird dieser Parameter weggelassen, wird das Script auf dem aktuellen Vertec-Objekt aufgerufen.
projektListe = vtcapp.evalocl("Projekt.allinstances->orderby(code)")
scripttext = vtcapp.evalocl("scripteintrag->select(bezeichnung='Projekt kopieren')->first.scripttext")
vtcapp.scriptexecute(scripttext)
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: Standard Rückgabewert bzw. vorselektierte Zeile *)
  • list: Liste mit den Werten, die zur Auswahl angezeigt werden
Die Funktion gibt einen String mit dem ausgewählten Wert zurück. Es kann nur ein Wert aus der Liste ausgewählt werden.

*) Um eine Zeile vorzuselektieren, müssen die Tuples der Listenzeilen aus 3 Elementen bestehen. Das dritte Element ist dann der Rückgabewert, wenn die Zeile ausgewählt wird (diese dritte Spalte ist unsichtbar).

Nur in diesem Fall hat der default-Parameter eine Wirkung: es wird dann die Zeile vorselektiert, deren dritte Spalte dem angegebenen Default entspricht.
projektliste = []
projekte= vtcapp.evalocl("Projekt.allinstances->orderby(code)")

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

print vtcapp.selectfromlist("Projekt auswählen", "Wählen Sie das Projekt aus:", "Code", "Betreffend", "", projektliste)
>>> COMINSTALL










*) vtcapp.selectfromlist("","","","","2",[("one","eins","1"),("two","zwei","2")])
sendfile(file: string, filename: string, [showsavedialog: boolean], [openfile: boolean]): boolean

Ab Vertec 6.2. Sendet ein File oder einen String (als File) an einen Client.

Die Methode funktioniert auch im Restrict Scripting Modus.

  • file: Hier kann ein Pfad zu einem File angegeben werden oder ein String. Daher funktioniert das auch in Cloud Clients ohne Filesystemzugriff.
  • filename: Name des Files, falls es gespeichert wird.
  • showsavedialog: Optional. Desktop und Cloud App. Das übertragene File soll auf dem Client je nach Anforderung und Möglichkeiten des Clients gespeichert oder gleich ausgeführt (Shell-Execute) werden.

    Ein gesetztes showsavedialog Argument bewirkt, dass ein Speichern-Dialog angezeigt wird. Standardmässig wird dabei der Desktop als Speicherort angezeigt.
    Falls showsavedialog=false ist, wird das File im Temp-Folder des Clients gespeichert, ein bestehendes File wird dabei überschrieben. Das ist sinnvoll im Zusammenhang mit openfile=true, dann wird das File in Temp gespeichert und gleich geöffnet.

    Standard ist false.
  • openfile: Optional. Desktop und Cloud App. Wenn true, wird das File nach dem Speichern geöffnet.
    Standard ist true.

Die Kombination showsavedialog=false und openfile=false ist nicht sinnvoll, da so das File im Temp-Verzeichnis gespeichert wird und sonst nichts passiert.

Mit der Web App als Client erscheint das File immer als Download im Webbrowser. Die Argumente showsavedialog und openfile haben keine Bedeutung.

Ab Vertec 6.3.0.8 hat die Methode einen Rückgabewert und liefert True oder False zurück:

  • True, falls die Datei gespeichert wurde,
  • False, falls die Datei nicht gespeichert wurde,
  • Die Web App liefert immer True zurück, da dort nicht überprüft werden kann, ob das File gespeichert wurde. Bei der Verwendung der Web App empfehlen wir, im Browser den automatischen Download einzuschalten.

Beispiel eines einfachen Projektexports:

projekte = argobject.evalocl("eintraege.list")
projektstr = ""
for projekt in projekte:
    projektstr = projektstr + projekt.code + "\r\n"
vtcapp.sendfile(projektstr, 'projekte.txt', True, True)

Beispiel wie ein lokal vorliegendes Bild geschickt werden kann:

filename = r"C:\Arbeitsverzeichnis\python_editor.png"
# opening for [r]eading as [b]inary
with open(filename, 'rb') as afile:
    vtcapp.sendfile(afile, 'aFilenameHere.jpg', True, True)

Files sollten explizit geschlossen werden nach Gebrauch. Ansonsten werden sie erst vom Garbage Collector geschlossen oder im Fehlerfall sogar erst bei der nächsten Exception. Es wird empfohlen, open mit with zu verwenden wie im obigen Beispiel.

setpropertyvalue(name, value)

Setzt eine Systemeinstellung. Der entsprechende Name ist jeweils bei den einzelnen Systemeinstellungen angegeben.

vtcapp.setpropertyvalue('Sperrdatum', vtcapp.incmonth(vtcapp.currentdate(), -1))

setresourceplanvalue
(bearbeiter, projekt, phase, date, intervalType, value)

Setzt einen Ressourcenplanwert. Verfügbar ab Vertec Version 5.7.0.16
  • intervalTyp: 0 = Tag, 1 = Woche, 2 = Monat
  • value: Wert in Minuten.
  • date: Es wird die Periode mit dem Value gefüllt, in der das Datum ist. Am besten nimmt man das Datum am Anfang der Periode, dann gibt es keine Unklarheiten.
bearbeiter = vtcapp.currentlogin()
projekt = argobject

vtcapp.setresourceplanvalue(bearbeiter, projekt, None, vtcapp.firstdayofmonth(vtcapp.currentdate()), 0, 240)
showcustomdialog(dialogdefinition, initialwerte) Dialog-Funktion, mit welcher in Python Scripts Dialoge definiert und vom Script angezeigt werden können. Verfügbar ab Vertec Version 6.1. Eine detaillierte Beschreibung finden Sie im Artikel über die Python Dialoge.
showdetailform(obj: object) Form eines Objektes anzeigen
leistung = vtcapp.createobject("Offeneleistung")
vtcapp.showdetailform(leistung)
strtominutes(string): integer Übersetzt einen String in einen Minutenwert (Integer), unter Berücksichtigung der aktuell eingestellten Systemeinstellung Anzeige Minuten.

Anzeige Minuten ist Stunden:Minuten:

print vtcapp.strtominutes('1:30')
>>> 90
print vtcapp.strtominutes('1.50')
>>> 110

Anzeige Minuten ist Stunden.Dezimal:

print vtcapp.strtominutes('1.50')
>>> 90
sqldateliteral(datum: date): string Diese Methode ergibt das richtige Datumsformat für SQL-Abfragen, je nach verwendetem Datenbankserver, welches dann in ein getwithsql statement eingebaut werden kann.
aktivitaeten = vtcapp.getwithsql('Aktivitaet', 'datum = %s' % vtcapp.sqldateliteral(vtcapp.currentdate()), '')
for akt in aktivitaeten:
    print akt

>>>
Support, 30.05.2017, Support Frau Müller
Verkauf, 30.05.2017, Rechnung mit Leistungsliste (Word)
Verkauf, 30.05.2017, Rechnung mit Leistungsliste (Word)
Verkauf, 30.05.2017, Offerte (Word)
Verkauf, 30.05.2017, Offerte (Word)
Marketing, 30.05.2017, Informationen bezüglich KZU
>>>
sqlwhere(where: string): string Erzeugt eine SQL where clause, passend auf den aktuell verwendeten Datenbankserver, welche dann in ein getwithsql Statement eingebaut werden kann.
whereclause = vtcapp.sqlwhere("standardadresse like 'Dachsweg%'")
leistungen = vtcapp.sqlwherebetweendate('datum', vtcapp.firstdayofmonth(heute), heute)
print leistungen, whereclause

adressen = vtcapp.getwithsql("Adresseintrag", whereclause, "bold_id")
for adresse in adressen:
  print adresse

>>>
upper(standardadresse) starting with 'DACHSWEG'
Comtelsat AG
Comtelsat AG, Lanz André
Comtelsat AG, Huber Thomas
>>>
sqlwherebetweendate(abfrage:string, von: date, bis: date): string

Erzeugt eine SQL between clause mit einem Datumsintervall, passend auf den aktuell verwendeten Datenbankserver, welche dann in ein getwithsql Statement eingebaut werden kann.

heute = vtcapp.currentdate()
whereclause = vtcapp.sqlwherebetweendate('datum', vtcapp.firstdayofmonth(heute), heute)
print whereclause

leistungen = vtcapp.getwithsql("Leistung", whereclause, "datum")
for leistung in leistungen:
  print leistung

>>>
datum between '01.05.2017' and '30.05.2017'
COMINSTALL, 09.05.2017, BER Besprechung mit Hr. Müller
COMINSTALL, 16.05.2017, TM Telefon mit Hr. Müller
>>>
translate(txt: string): string Übersetzt einen GUI Text in die aktuelle Vertec Sprache.

Die aktuelle Vertec-Sprache ist English:

>>> vtcapp.translate("Leistung")
Service
updatedatabase() Speichert Änderungen in die Datenbank.
vtcapp.updatedatabase()
validateobjects() Validiert neuerstelle Objekte. Diese sind, sofern sie keine Regeln verletzen, danach nicht mehr ungültig.
vtcapp.validateobjects()
versiontointeger(versionstring): int Verwandelt einen Vertec Versionsstring in eine Zahl, die sich zum Vergleich von verschiedenen Versionen eignet.
Bsp: "5.5.0.67" wird in 550067 umgesetzt, 
"5.5" in 550000,
"5" in 500000

Datumsfunktionen

Folgende Datumsfunktionen sind verfügbar. Sie alle befinden sich im Modul vtcapp.

Funktion Erklärung Beispiel Ab Version
currentdate(): date Gibt das aktuelle Datum zurück.
>>> vtcapp.currentdate()
2017-01-23
6.1.0.10
currentdatetime(): datetime Gibt das aktuelle Datum und die aktuelle Uhrzeit zurück.
>>> vtcapp.currentdatetime()
2017-01-23 15:01:12.880000
6.1.0.10
datetostr(date): string Wandelt ein Datum in einen String um und gibt diesen gemäss Ländereinstellungen zurück.

Zum Beispiel in Australian English:

>>> print vtcapp.strtodate('13/06/17')
2017-06-13
>>> print vtcapp.datetostr(datum)
13/06/2017
6.1.0.14
datetostrgerman(date): string Wandelt ein Datum in einen String um und gibt diesen in deutschem Datumsformat zurück.

Es braucht an gewissen Orten in Scripts manchmal Datumswerte im deutschen Format, unabhängig von aktuellen Regionaleinstellungen (siehe z.B. von/bis-Argumente bei groupLeistungen Operatoren).
>>> vtcapp.datetostrgerman(argobject.eval('creationdatetime'))
13.10.2016
6.2
firstdayofmonth(date): date Liefert das Datum des ersten Tages im selben Monat zurück
>>> vtcapp.firstdayofmonth(vtcapp.currentdate())
2018-03-01
5.7
firstdayofyear(date): date Liefert das Datum des ersten Tages im selben Jahr zurück
>>> vtcapp.firstdayofyear(vtcapp.currentdate())
2018-01-01
5.7
formatminutes(integer): string Liefert Stunden-Minuten-Darstellung gemäss Einstellung in Vertec zurück
>>> vtcapp.formatminutes(argobject.minutenext)
1:00
5.7
incday(date, integer): date Inkrementiert den Tag (+ oder -) und liefert das neue Datum zurück
>>> vtcapp.incday(vtcapp.currentdate(), 1)
2018-03-17
5.7
incminute(datetime, integer): datetime Inkrementiert Minuten (+ oder -) und liefert neues Datum zurück.

Das Datum, das übergeben wird, muss im Format Datetime sein, also einen Zeitteil haben.

Zählt zur aktuellen Zeit 4 Stunden hinzu:
>>> vtcapp.incminute(vtcapp.currentdatetime(), 240)
2018-03-16 18:43:44.958000

5.7

incmonth(date, integer): date Inkrementiert Monat (+ oder -) und liefert das neue Datum zurück
>>> vtcapp.incmonth(vtcapp.currentdate(), -1)
2018-02-16
5.7
incyear(date, integer): date Inkrementiert das Jahr (+ oder -) und liefert das neue Datum zurück
>>> vtcapp.incyear(vtcapp.currentdate(), -1)
2017-03-16
5.7
lastdayofmonth(date): date Liefert das Datum des letzten Tages im selben Monat zurück
>>> vtcapp.lastdayofmonth(vtcapp.currentdate())
2018-03-31
5.7
lastdayofyear(date): date Liefert das Datum des letzten Tages im selben Jahr zurück
>>> vtcapp.lastdayofyear(vtcapp.currentdate())
2018-12-31
5.7
ocldate(date): string Liefert OCL encodedate string aufgrund eines Datumswertes
>>> import datetime
>>> vtcapp.ocldate(datetime.date(2018,01,31))
encodedate(2018,1,31)
5.7
strtodate(string): datetime Interpretiert einen Datumsstring gemäss Windows Ländereinstellungen (siehe Anmerkungen zur Verwendung von strtodate weiter unten).
print vtcapp.strtodate('1.10.17')
>>> 2017-10-01 00:00:00
5.7
thismonday(datum): datum Liefert das Datum des Montags in derselben Wochen zurück
>>> vtcapp.thismonday(vtcapp.currentdate())
2018-03-12
5.7

Anmerkung zur Verwendung von strtodate

Die Verwendung von strtodate ist heikel, da der String je nach Windows Ländereinstellungen interpretiert wird. So liefert die Expression vtcapp.strtodate('31.01.2017') einen Fehler, wenn es sich nicht um deutsche Ländereinstellungen handelt.

Im Code sollte deshalb immer die Python Datumsfunktion datetime.date(year, month, day) verwendet werden (siehe obiges Beispiel). Soll jedoch beispielsweise vom User ein bestimmtes Datum über eine Inputbox abgefragt werden, kann man das so machen, dass man ihm einen Datumsvorschlag im richtigen Format präsentiert, welcher von ihm entsprechend abgeändert werden kann.

Dafür wird das Datum gemäss lokalen Ländereinstellungen formatiert (vtcapp.datetostr..) dargestellt:

# Frage den Benutzer nach dem Datum. Das Datum wird gemäss Windows-locale dargestellt.
res = vtcapp.inputbox('Vertec', 'Datum für die Berechnung', vtcapp.datetostr(vtcapp.currentdate()))
print vtcapp.strtodate(res)

Die Methode datetostr() wurde in Vertec Version 6.1.0.14 eingeführt. In früheren Vertec Versionen kann das Datum gemäss lokalen Ländereinstellungen  mit strftime formatiert dargestellt werden:

import datetime

# Frage den Benutzer nach dem Datum. Datum gemäss Windows-locale dargestellt.
res = vtcapp.inputbox('Vertec', 'Datum für die Berechnung', datetime.date.today().strftime('%x'))
print vtcapp.strtodate(res).date()

Das Modul "ziputils"

Ab Vertec 6.3.0.2 gibt es ein Vertec Modul namens ziputils, welches ermöglicht, in Python ZIP-Files zu generieren.

Es ist auch im Resctict Scripting Modus verfügbar und enthält folgende Methoden:

Methode / Funktion Beschreibung Beispielcode
createzip(contentlist: tuples): bytestream Ab Vertec 6.3.0.2. Erzeugt aus einer Liste von tuples (filename,content) ein zipfile und gibt es als bytestream zurück. Dieser kann einfach mit einem Filename.zip abgespeichert/gedownloaded werden.
import ziputils

zip = ziputils.createzip([('file.txt', 'Hallo das ist ein Text')])
vtcapp.sendfile(zip, 'ziptest.zip', True)

Das einzelne Vertec Datenobjekt

Für einzelne Objekte gibt es folgende Methoden:

Methode/Funktion Beschreibung Beispielcode

addtag(tagname)

Ab Version 6.1.0.10. Setzt auf dem Objekt einen Tag. Informationen dazu finden Sie im Artikel Tags auf User-Einträgen.

argobject.addtag('mytag')

checkright(recht: string, membername: string): boolean

Prüft, ob der angemeldete Benutzer das angegebene Recht auf dem angegebenen Membernamen besitzt.

Mögliche Rechte sind: 'read', 'write', 'create', 'delete', 'execute'

Rückgabewert: 1 = True, 0 = False

obj = argobject
if obj.checkright('read', 'offeneleistung'):
...

delete()

Löscht das Objekt in Vertec

obj.delete()

eval(OCL:string)

oder

Eval(OCL:string)

Evaluiert eine OCL-Expression auf dem Objekt

projektcode = argobject.eval("code")

evalocl(OCL:string)

Ab Vertec 6.1.0.10. Evaluiert eine OCL-Expression auf dem Objekt. Macht dasselbe wie eval, wurde eingeführt, damit es gleich heisst wie die globale Methode.

projektcode = argobject.evalocl("code")

getattr(object, name[, default])

Gibt den Wert eines Members zurück.

getattr(obj, "vorname")

ist äquivalent zu obj.vorname. Manchmal benötigt man getattr, weil man ein Member beispielsweise in einer Methode als Parameter bekommt und dann so abfragt.

Gibt es auf dem Objekt kein Member dieses Namens, gibt die Methode den default zurück, falls ein solcher angegeben ist. Ansonsten gibt es einen AttributeError.

getattr(obj, "vorname", "")
projekt = argobject
if hasattr(projekt, "offeneleistungen"):
liste = getattr(projekt, "offeneleistungen")
for leistung in liste:
print leistung.text

getkeystring(key): string

getkeybool(key): boolean

getkeycurr(key): currency

getkeyint(key): integer

getkeydate(key): datetime

Ab Vertec 6.1.0.10. Mit diesen Methoden wird auf die als Key-Values abgelegten Werte zugegriffen.

Details dazu finden Sie im Artikel Key-Values auf User-Einträgen.

>>> argobject.getkeydate('datum')
2017-02-03 00:00:00
getmemfootprint(): integer

Ab Version 5.8. Liefert als Resultat die Anzahl Bytes, welche das Objekt im Memory belegt (Memory Footprint).

Der Wert wird wie folgt bestimmt:

Instanz des Objekts

+ Summe der Instanzen aller Member

+ Grösse des Wertes jedes Members (bei Strings die Länge)

+ MemFootPrint aller owned linked Objekte (z.B. Phasen des Projekts).

Es ist zu beachten, dass es sich dabei um eine Annäherung handelt, da die Grenze, was bei einem Objekt alles gezählt werden muss, nicht genau gezogen werden kann.

Folgendes Script gibt den Memory-Bedarf aller Projekte im System aus:

r = vtcapp.evalocl("projekt")
for projekt in r:
print projekt.code+' '+str(projekt.getmemfootprint())
getmlvalue(membername:string, language:string): value

Die sogenannten Multilanguage-Attribute (MLStrings, mehrsprachige Attribute) können über diese Methode abgefragt werden (ab Version 5.4).

  • Membername: Name des Members
  • Language ist der jeweilige Languagecode (DE, FR, IT, EN).

Multilanguage-Attribute sind:

  • Taetigkeit.Text
  • Spesentyp.Text
  • Auslagetyp.Text
  • Zusatzfeldklasse.Bezeichnung (Bezeichnung von Zusatzfeldern)
  • GridColDef.Titel (Spaltentitel in Listeneinstellungen)

Um ein solches Attribut zu setzen, kann die Methode setmlvalue() verwendet werden.

taetigkeit = argobject
print taetigkeit.getmlvalue("text", "FR")
>>>
Vacances
>>>

Wird das Member normal abgefragt, entspricht der Rückgabewert immer der aktuellen Vertec-Sprache:

print taetigkeit.text
>>>
Ferien/Urlaub
>>>
hasattr(object, name): boolean

Überprüft, ob ein Objekt ein entsprechendes Member hat.

obj = adresse
if hasattr(obj, "vorname"):
print obj.vorname
hastag(tagname): boolean

Ab Version 6.1.0.10. Prüft, ob ein Objekt einen entsprechenden Tag gesetzt hat.

Informationen dazu finden Sie im Artikel Tags auf User-Einträgen.

obj = argobject
if obj.hastag('mytag'):
...

istypeof(Classname:string)

oder

IsTypeOf(Classname:string): boolean

Prüft, ob das Objekt vom Typ Classname ist.

True oder False.

obj = argobject # das aktuelle Objekt ist eine Firma in Vertec
obj.IsTypeOf("Projekt")
>>> 0 # false

obj.istypeof("Firma")
>>> 1 # true

linkto(target, rolle)

Macht eine Verknüpfung via Linktyp vom Objekt zum übergebenen Objekt (target) mit der angegebenen Rolle.

Detaillierte Informationen zu diesem Thema finden Sie im Artikel Operatoren und Methoden für Links.

objid

Liefert die interne ID des Objekts zurück.

>>> argobject.objid
3011

removetag(tagname)

Ab Version 6.1.0.10. Löscht den entsprechenden Tag von diesem Objekt.

Informationen dazu finden Sie im Artikel Tags auf User-Einträgen.

argobject.remove('mytag')
setattr(object, name, value)

Beschreibt das Attribut name des Objektes object mit dem Wert value.

So kann man beispielsweise durch die Zusatzfelder eines Objektes loopen und die gefundenen Attributnamen nutzen, um die Attribute zu beschreiben.

Dieser Code erstellt ein neues Objekt vom gleichen Typ wie das argobject und kopiert die Inhalte alle Zusatzfelder auf das neue Objekt.

source = argobject
target = vtcapp.createobject(source.eval('ocltype.asstring'))
zusatzfelder = source.zusatzfelder
for z in zusatzfelder:
zName = z.metazusatzfeld.fieldname

Nun weiss man den Namen des Zusatzfeldes, aber würde man es mit target.zName ansprechen, gäbe es eine Fehlermeldung "target has no attribute zName". Also verwendet man setattr:

setattr(target, zName, getattr(source, zName))
vtcapp.showdetailform(target)
setkeyvalue(key, value)

Ab Vertec 6.1.0.10. Mit dieser Methode werden kundenspezifische Werte als Key-Values auf User-Einträgen abgelegt.

Auf diese Werte kann später über die getkey-Methoden zugegriffen und Listen so performant gefiltert werden.

argobject.setkeyvalue("datum", "2017-02-03")
setmemberoutofdate(membername:string)

Wenn ein Wert frisch von Datenbank gelesen werden soll, muss das Feld out of date gesetzt werden.

Diese Methode macht dasselbe wie der Notif bei einer Modified message.

proj = argobject
proj.setmemberoutofdate('code')

sorgt dafür, dass beim nächsten Zugriff auf Projekt.code dieser Wert frisch aus der Datenbank geladen wird.

setmlvalue(membername:string, value:string, language:string)

Die sogenannten Multilanguage-Attribute (MLStrings, mehrsprachige Attribute) können über diese Methode gesetzt werden (ab Version 5.4).

  • Membername: Name des Members
  • Value: Der Wert für die angegebene Sprache
  • Language ist der jeweilige Languagecode (DE, FR, IT, EN).

Multilanguage-Attribute sind:

  • Taetigkeit.Text
  • Spesentyp.Text
  • Auslagetyp.Text
  • Zusatzfeldklasse.Bezeichnung (Bezeichnung von Zusatzfeldern)
  • GridColDef.Titel (Spaltentitel in Listeneinstellungen)

Um ein solches Attribut abzufragen, kann die Methode getmlvalue() verwendet werden.

taetigkeit = argobject
taetigkeit.setmlvalue("text", "Vacanze", "IT")
unlink(target, rolle)

Entfernt die Verknüpfung vom Objekt zum übergebenen Objekt (target) mit der angegebenen Link-Rolle.

Detaillierte Informationen zu diesem Thema finden Sie im Artikel Operatoren und Methoden für Links.

unload(): None

Entfernt das Objekt aus dem Vertec Objektspeicher.

Diese Methode wurde eingeführt, um bei Datenmigrationen den Memorybedarf steuern zu können. Sie muss jedoch mit äusserster Vorsicht verwendet werden, da anschliessende Zugriffe auf das entladene Objekt zu Fehlern führen können.

Wir raten von der Verwendung ab, ausser auf eigenes Risiko und wenn man genau weiss, was man tut.

 

Classname eines Objektes

Der Zugriff auf den classname funktioniert in Python nur über OCL:

obj.eval('ocltype.asstring')

Methoden auf einzelnen Objekten vom Typ "Projekt"

Methode/FunktionBeschreibungBeispielcode
entrytypeslookup(typidx, phase=None): Liste von Projekteintragstypen

Gibt eine Liste von Projekteintragstypen für das Projekt (und optional eine Phase) zurück

typeidx: 0: Tätigkeiten, 1: Spesentypen, 2: Auslagetypen.

proj = argobject
taetigkeitenliste = proj.entrytypeslookup(0, None)
phaseslookup(user, entrytype=None): Liste von Projektphasen

Gibt eine Liste von Projektphasen für den angegebenen User (und optional eines Projekteintragstyps) zurück.

proj = argobject
bearbeiter= vtcapp.currentlogin()
phasenliste = proj.phaseslookup(bearbeiter, None)
projektbearbeiterisassigned(user): boolean

Gibt an, ob der angegebene User berechtigt ist, auf diesem Projekt Leistungen etc. zu erzeugen.

proj = argobject
bearbeiter= vtcapp.currentlogin()
if proj.projektbearbeiterisassigned(bearbeiter):
  ...

Methoden auf einzelnen Objekten vom Typ "Projektbearbeiter"

Methode/FunktionBeschreibungBeispielcode
changepassword(newpassword:string)Ändert das Passwort des Bearbeiters. Nur erlaubt, falls der Bearbeiter selbst angemeldet oder Administrator ist.
bearb = argobject
bearb.changepassword('Ndlsije56!')
ispasswordvalid(password:string)

Prüft, ob das Passwort das korrekte (aktuelle) Passwort für den Benutzer ist.

bearb = argobject
ir bearb.ispasswordvalid('Ndlsije56!'):
...

Methoden auf einzelnen Objekten vom Typ "Rechnung"

Methode/Funktion Beschreibung Beispielcode
buchen([raiseException])

Ab Version 5.8. Bucht eine Rechnung in die Buchhaltung.

Das Argument raiseException ist ein Boolean (Wahr/Falsch), welcher angibt, ob Fehler beim Buchen bzw. beim Stornieren gemeldet werden sollen.

raiseException ist optional, Default-Wert ist True.

Wenn raiseException False ist, dann werden Fehler beim Buchen ignoriert, die Rechnung ist dann einfach nicht gebucht.

rechnung = argobject
rechnung.buchen()
importzahlungen()

Ab Version 5.8. Importiert die Zahlungen zur aktuellen Rechnung. Funktioniert nur, wenn die Debitorenschnittstelle den Zahlungsabgleich unterstützt.

argobject.importzahlungen()
makeoffen([raiseException])

Ab Version 5.8. Setzt eine verrechnete Rechnung wieder auf offen (Verrechnen rückgängig).

Das Argument raiseException ist ein Boolean (Wahr/Falsch), welcher angibt, ob Fehler beim Verrechnen bzw. beim Verrechnen rückgängig gemeldet werden sollen.

raiseException ist optional, Default-Wert ist True.

Wenn raiseException False ist, dann werden Fehler beim Verrechnen rückgängig ignoriert, die Rechnung bleibt dann einfach verrechnet.

rechnung = argobject
rechnung.makeoffen(False)
makeverrechnet([raiseException])

Ab Version 5.8. Verrechnet eine offene Rechnung.

Das Argument raiseException ist ein Boolean (Wahr/Falsch), welcher angibt, ob Fehler beim Verrechnen bzw. beim Verrechnen rückgängig gemeldet werden sollen.

raiseException ist optional, Default-Wert ist True.

Wenn raiseException False ist, dann werden Fehler beim Verrechnen ignoriert, die Rechnung bleibt dann einfach offen.

rechnung = argobject
rechnung.makeverrechnet(False)
stornieren([raiseException])

Ab Version 5.8. Storniert eine gebuchte Rechnung.

Das Argument raiseException ist ein Boolean (Wahr/Falsch), welcher angibt, ob Fehler beim Buchen bzw. beim Stornieren gemeldet werden sollen.

raiseException ist optional, Default-Wert ist True.

Wenn raiseException False ist, dann werden Fehler beim Buchen ignoriert, die Rechnung ist dann einfach nicht storniert.
rechnung = argobject
rechnung.stornieren()

Methoden auf einzelnen Objekten vom Typ "Projekteintrag"

Unter dem Begriff Projekteintrag werden Leistungen, Spesen und Auslagen zusammengefasst.

Methode/FunktionBeschreibungBeispielcode
makeoffen()

Ab Version 5.8. Setzt eine verrechnete Leistung, Spese oder Auslage auf offen.

Das funktioniert nur, wenn sich die Leistung, Spese oder Auslage nicht auf einer Rechnung befindet, ansonsten wird ein Fehler geworfen.

argobject.makeoffen()
makeverrechnet()

Ab Version 5.8. Setzt eine offene Leistung, Spese oder Auslage auf verrechnet.

Das funktioniert nur, wenn sich die Leistung, Spese oder Auslage nicht auf einer Rechnung befindet, ansonsten wird ein Fehler geworfen.

argobject.makeverrechnet()

Methoden auf einzelnen Objekten vom Typ "Leistung"

Methode/FunktionBeschreibungBeispielcode
updatesatz()Ab Version 6.1.0.14. Stundensatz wird neu berechnet (aus Tarifsystem).

Benötigt Berechtigung Projekt-Administrator oder Super.

argobject.updatesatz()

Methoden auf einzelnen Objekten vom Typ "Aktivitaet"

Methode/FunkionBeschreibungBeispielcode
setpfad(pfad: string)Ab Version 6.1.0.14. Setzt den Dokumentenpfad auf der Aktivität.

Benötigt Schreibrechte auf der Aktivität.

argobject.setpfad('C:\\Dokumente\\text.txt')

Methoden auf einzelnen Objekten vom Typ "Waehrung"

Methode/FunktionBeschreibungBeispielcode
getkursto(waehrung: object, date: date): currencyAb Version 6.1.0.14. Gibt den Umrechnungskurs zum entsprechenden Datum zurück.
chf.getkursto(eur, vtcapp.currentdate())

Vertec-Listen

Ab Vertec 6.2.0.7 geben alle Python Methoden, welche Listen von Businesobjekten zurückgeben, direkt eine Vertec-Liste zurück und keine Python-Liste mehr. Die aus den Methoden

  • evalocl()
  • getwithsql()
  • getmemberwithsql()

resultierenden Listen sind also direkt Vertec-Listen und müssen nicht mehr mit vtcapp.createlist() erzeugt werden.

Beispiel

Versionen vor 6.2.0.7: liste = vtcapp.createlist("Projekt", vtcapp.evalocl("projekt->select(code.sqllike('A%'))"))

Versionen ab 6.2.0.7: liste = vtcapp.evalocl("projekt->select(code.sqllike('A%'))")

 

Methoden auf Vertec-Listen

Methode/Funktion Beschreibung Beispielcode
append(Objekt) Eine Liste kann via append() Methode gefüllt werden. Es können nur einzelne Objekte, nicht ganze Listen mit append() übergeben werden.
mylist = vtcapp.createlist('Projekt')
mylist.append(argobject)
evalocl(OCL:string) Auf der Vertec-Liste kann eine OCL-Expression abgesetzt werden.
projektIds = argobject.eval("eintraege").idstring()
leistungen = vtcapp.createlist("OffeneLeistung", vtcapp.getwithsql("OffeneLeistung", "projekt IN (%s)" % projektIds, ""))
print leistungen.evalocl("wertext->sum")
extend(liste: list) Ab Vertec 6.2. Mit der extend() Methode kann einer Vertec-Liste eine weitere Liste angehängt werden.

Dabei wird geprüft, ob es sich bei der Vertec-Liste um eine derived Liste (z.B. Container.eintraege) handelt. Der Zugriff wird in diesem Fall verweigert.

projektIds = argobject.eval("eintraege").idstring()
leistungen = vtcapp.createlist("OffeneLeistung", vtcapp.getwithsql("OffeneLeistung", "projekt IN (%s)" % projektIds, ""))
leistungen.extend(vtcapp.createlist("VerrechneteLeistung", vtcapp.getwithsql("VerrechneteLeistung", "projekt IN (%s)" % projektIds, "")))
print leistungen.evalocl("wertext->sum")
idstring()

Eine häufige Anforderung in Python Scripts ist, aufgrund einer Liste von Vertec Objekten eine SQL-Abfrage mit bold_id in (...) zu formulieren.

Dazu müssen die IDs einer Liste von Objekten in einen comma-delimited String umgewandelt werden.

  • List.idstring() gibt die IDs der Vertec-Objekte als comma-delimited string zurück.
  • Falls die Liste nicht persistente Objekte enthält gibt die Methode eine Fehlermeldung zurück.
>>> vtcapp.evalocl('Projektbearbeiter->allinstances').idstring()
300,676,7613,682,688,694
index(Objekt) Ab Vertec 6.2.0.7. Gibt den Index des Objekts in der Liste zurück.
Falls das Objekt mehrmals vorkommt, wird der tiefste Index zurückgegeben.
Wurde aus Kompatibilitätsgründen mit Python-Listen eingeführt (siehe unten).
>>> liste = vtcapp.evalocl("projekt.code")
>>> print liste.index('COMINSTALL')
25
insert(index, Objekt) Ab Vertec 6.2.0.7. Fügt ein Objekt an der Stelle index in die Liste ein.
Wurde aus Kompatibilitätsgründen mit Python-Listen eingeführt (siehe unten).
>>> liste = [123, 'xyz', 'miau', 'abc']
>>> liste.insert(3, 2009)
>>> print liste
[123, 'xyz', 'miau', 2009, 'abc']
remove(Objekt) Entfernt das angegebene Objekt aus der Liste
projektIds = argobject.eval("eintraege").idstring()
leistungen = vtcapp.createlist("OffeneLeistung", vtcapp.getwithsql("OffeneLeistung", "projekt IN (%s)" % projektIds, ""))
fl = leistungen.evalocl("self->select(bearbeiter.asstring = 'Judith Feller')")
for leistung in fl:
    leistungen.remove(leistung)

Das obige Beispiel dient dazu, die remove() Methode zu zeigen. Diesen Anwendungsfall würde man eher via reject lösen:

projektIds = argobject.eval("eintraege").idstring()
leistungen = vtcapp.createlist("OffeneLeistung", vtcapp.getwithsql("OffeneLeistung", "projekt IN (%s)" % projektIds, ""))
leistungen = leistungen.evalocl("self->reject(bearbeiter.asstring = 'Judith Feller')")

Unterschiede Vertec- und Python-Listen

Vertec- und Python-Listen unterscheiden sich in folgenden Punkten:

Der + Operator ist nicht auf Vertec-Listen anwendbar. Code der Art
projektIds = argobject.eval("eintraege").idstring()
leistungen = vtcapp.getwithsql("OffeneLeistung", "projekt IN (%s)" % projektIds, "") \
+ vtcapp.getwithsql("VerrechneteLeistung", "projekt IN (%s)" % projektIds, "")

funktioniert nicht. Es erscheint ein Fehler: TypeError: can only concatenate list (not "BoldListAdapter") to list.

Stattdessen muss extend() oder += verwendet werden:

leistungen = vtcapp.getwithsql("OffeneLeistung", "projekt IN (%s)" % projektIds, "")
leistungen.extend(vtcapp.getwithsql("VerrechneteLeistung", "projekt IN (%s)" % projektIds, ""))
bzw.
leistungen = vtcapp.getwithsql("OffeneLeistung", "projekt IN (%s)" % projektIds, "")
leistungen += vtcapp.getwithsql("VerrechneteLeistung", "projekt IN (%s)" % projektIds, "")

Aus Vertec-Listen können zur Herstellung der Kompatibilität Python-Listen erstellt werden durch list(vertecliste).

Man muss beachten, dass Vertec-Listen "live" sind. Das heisst, bei Aktionen, die sich auf die Logik der Listenberechnung beziehen, kann sich diese verändern, wie in folgenden Beispielen gezeigt:

Bei remove() und delete() ist die Liste nach jeder Iteration um eines kürzer. Am Schluss ist nur die Hälfte der Liste gelöscht. Um alle Objekte einer Liste zu löschen, sollte man sie deshalb am besten in eine Python-Liste umwandeln:

for l in list(argobject.offeneleistungen):
    l.delete()

Im folgenden Fall handelt es sich um eine Liste von offenen Leistungen:

leistungen = phase.evalocl("offeneleistungen")
for l in leistungen:
    l.makeverrechnet()

Werden sie der Reihe nach verrechnet, verschwinden sie automatisch aus der Liste. Der Effekt ist derselbe wie oben: Es wird nur die Hälfte der Leistungen verrechnet. Stattdessen in eine Python-Liste umwandeln:

for l in list(phase.evalocl("offeneleistungen")):
    l.makeverrechnet()

'count', 'pop', 'reverse' und 'sort' gibt es nur auf Python-Listen. Wenn Sie diese Methoden verwenden, müssten Sie diese umschreiben bzw. mit list(vertecliste) aus der Vertec-Liste wieder eine Python-Liste machen.