Beschreibung der Vertec Python Funktionen
Betriebsart
Cloud Abo
|ON-PREMISES
Module
Leistung & CRM
Budget & Teilprojekt
Fremdkosten
Ressourcenplanung
Business Intelligence
In der Vertec Installation ist eine Vertec Python Library (Modul) integriert. Dieses ist überall in Vertec, z.B. in Python Scripts, verfügbar und heisst vtcapp. Es hat folgende Funktionen:
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 |
projekt = argobject |
||||||||||||||||||||||||||
bigetdata(source, dimensions, measures, from, till, currency=None) |
Ab Vertec 6.8. Python Funktion für die Abfrage von Business Intelligence (BI) Daten. Die genaue Beschreibung finden Sie im Artikel Python Funktion für die Abfrage von BI Daten |
projects = vtcapp.currentlogin().evalocl("eigprojekte->select(aktiv)") result = vtcapp.bigetdata(projects, ["Projekt"], ["FeesExt"], None, None) for project in projects: print("Honorar: {}".format(result.get_value(project, "FeesExt"))) |
||||||||||||||||||||||||||
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. Rückgabewert ist False oder True |
>>> vtcapp.checkfeature('fcPhasen') True |
||||||||||||||||||||||||||
convertwordtopdf(wordDoc: string): string |
Wandelt ein Word-Dokument vom Typ |
Das entsprechende Word-Dokument muss erstellt und gelesen werden: in_file = open("C:\<yourPath>\BeispielWordFürEmail.docx", "rb") wordDoc = in_file.read() Umwandlung: pdfDoc = vtcapp.convertwordtopdf(wordDoc) |
||||||||||||||||||||||||||
createoutlookmail(to, subject, body="", cc="", bcc="", attachments=[], show=True, onBehalfOf="")Python Methode ab Version 6.4.0.4, welche es ermöglicht, auf dem Client via Outlook eine E-Mail Nachricht zu erstellen. Funktioniert mit der Desktop App und der Cloud App. Wenn Sie mit der Web App arbeiten, kann die Methode sendmail() verwendet werden.
Optional:
*Keyword bedeutet, dass Sie die optionalen Werte mit dem Parameter als Keyword, z.B. Beispiele:
Hinweis: Verwenden Sie in Ihren Word-Dokumenten Tabellen und vermeiden Sie Tabstopps, da diese im E-Mail nicht verarbeitet werden können.
|
||||||||||||||||||||||||||||
createlist(classname, [list]): list |
Damit kann eine Vertec-Liste erzeugt werden, auf welcher dann OCL ausgewertet werden kann.
Die Python-Methoden evalocl(), getwithsql() und getmemberwithsql() liefern 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() |
Ab Vertec 6.7.0.7 stattdessen immer DisabledEvents() verwenden. Mit |
# Ganzes Script try: vtcapp.disableevents() main() finally: vtcapp.enableevents() # Teil eines Scripts vtcapp.disableevents() rechnung.datum = vtcapp.currentdate() vtcapp.enableevents() |
||||||||||||||||||||||||||
DisabledEvents() |
Ab Version 6.7.0.7. Muss mit
Innerhalb dieser Methode ist das Eventsscripting ausgeschaltet. Dies betrifft dann die gesamte Vertec-Session (andere Vertec-Sessions oder Desktop Apps sind nicht betroffen). Wird z.B. dann verwendet, wenn ein gewisses Attribut angepasst werden soll, welches sonst einen Event ausführen würde. |
with vtcapp.DisabledEvents(): rechnung.datum = vtcapp.currentdate() |
||||||||||||||||||||||||||
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.
Als Variablenname darf "self" nicht 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(command: string, [argumentString: string])Es werden auch Kommandozeilen-Parameter unterstützt. Dafür können optional Argumente übergeben werden. Der bisherige, einfache Fall funktioniert weiterhin. Das Parameterparsing ist wie folgt:
Es können nur Dateien vom Typ
Beispiele: 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. Ab 6.4.0.10 auch: vtcapp.executefile('notepad++.exe', r'-lpython "C:\Dokumente\Mein Script.py"') |
||||||||||||||||||||||||||||
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 (funktioniert nicht mit Restrict Scripting). |
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]): berichtErlaubt den Aufruf und das Ausführen von Berichten aufgrund eines Bericht-Objekts.
Beispiele: Einen Word-Bericht für Rechnung anzeigen, ohne Dialog und ohne eine Datei 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. Ab Version 6.4.0.8 gibt die Methode den Bericht-Output als Byte-String zurück (nur wenn es sich bei berichtObj um eine Vertec Bericht-Definition handelt, nicht bei Angabe eines Pfads). Dieser kann weiterverarbeitet und beispielsweise als Attachment an eine E-Mail gehängt werden via rechTempl = vtcapp.evalocl("bericht->select(eintragid='BerichtScriptInvoiceWithList')->first") pdf = vtcapp.executereport(argobject, None, rechTempl, "", showDialog=False) vtcapp.createoutlookmail("mail@adresse.com", "Betreffend", "Inhalt", attachments=[('rechnung.pdf', pdf)]) |
||||||||||||||||||||||||||||
executereport2(rootObj, optarg, berichtObj, [saveAs, showDialog, doPrint, showApp]): (bericht, aktivität) |
Ab Version 6.4.0.22. Erlaubt den Aufruf und das Ausführen von Berichten aufgrund eines Bericht-Objekts. Die Methode gibt ein Tupel bestehend aus dem Bericht-Output als Byte-String sowie der zugehörigen Aktivität zurück. Für die Beschreibung der Parameter siehe executereport() hier oberhalb. Als berichtObj kann nur eine Vertec Bericht-Definition (Klasse Bericht) übergeben werden, keine Dateipfade. Eine Tabelle über die Verfügbarkeit mit den verschiedenen Systemen finden Sie im Abschnitt weiter unten. |
rechTempl = vtcapp.evalocl("bericht->select(eintragid='BerichtScriptInvoiceWithList')->first") reportdoc, activity = vtcapp.executereport2(argobject, None, rechTempl) Der Rückgabewert der Methode ist ein Tuple:
Eine Aktivität wird nur erzeugt, wenn ein Bericht gespeichert wird. |
||||||||||||||||||||||||||
executeurl(url) |
Öffnet die angegebene URL auf dem Client (alle full-featured Apps). Die URL muss vom Client aus erreichbar sein. In der Web App muss es sich um einen öffentlich erreichbaren Pfad handeln, ein Zugriff auf den lokalen Client ist nicht möglich. |
Zum Beispiel eine Website im Browser öffnen: vtcapp.executeurl("https://www.vertec.com") Oder eine Vertec Breadcrumb URL: vtcapp.executeurl("vertec://CK-676/eigene+Projekte-49/COMINSTALL-2880/") dasselbe funktioniert auch als Kurzversion, in der nur die IDs angegeben sind: vtcapp.executeurl("vertec://676/49/2880/") |
||||||||||||||||||||||||||
extractplaintext(file): string |
Wird verwendet, um Plain Text aus Dateien zu extrahieren. Die Methode prüft, ob das übergebene File (bytearray) eine der folgenden Dateien darstellt:
Wenn ja extrahiert sie den Text dieser Dateien und gibt ihn als plaintext (string) zurück. Stellt das Bytearray keinen der genannten Dateitypen dar, oder schlägt das Auslesen des Inhalts fehl, zum Beispiel weil die Datei ungültig ist oder es sich um ein passwortgeschützes PDF handelt, wird ein Leerstring ausgegeben. |
Dokumentspeicherung Intern:
file = argobject.content
text = vtcapp.extractplaintext(file)
Dokumentspeicherung Filesystem/DMS: filename, file = vtcapp.requestfilefromclient("File auswählen", r"C:\Dokumente", "PDF|*.pdf|DOCX|*.docx|EML|*.eml|MIME|*.msg") text = vtcapp.extractplaintext(file) |
||||||||||||||||||||||||||
fetchlinkmembers(objectlist, membername): objectlist |
Ab Version 6.4. Lädt für eine Liste von Objekten (objectlist) die Subliste (membername) ins Memory, und macht gleichzeitig den Multilink current, was heisst, dass beim Zugriff auf den Link die Liste nicht nochmal geladen wird. Deshalb sollte der Aufruf fetchlinkmembers() unmittelbar vor der Weiterverwendung der Liste erfolgen. |
# Loop durch die Phasen von Projekten, welche mindestens eine Phase "erteilt" haben projekte = vtcapp.getwithsql("Projekt", "bold_id IN (SELECT projekt FROM projektphase WHERE status=1)", "") vtcapp.fetchlinkmembers(projekte, "phasen") for projekt in projekte: x = projekt.evalocl("phasen->select(status=1)") |
||||||||||||||||||||||||||
generateinvoicenumber() |
Erzeugt die nächste Vertec Rechnungsnummer gemäss Systemeinstellungen Rechnung / Honorarnote. |
rech = argobject rech.nummer = vtcapp.generateinvoicenumber() |
||||||||||||||||||||||||||
getcurrentobject() |
Liefert das im Baum selektierte Objekt zurück und kann mithilfe von OCL Call Operatoren aus OCL aufgerufen werden. |
|||||||||||||||||||||||||||
getmailattachment(content, idx): bytestring |
Ab Version 6.5. Erlaubt den Download eines E-Mail Attachments einer Aktivität. Liefert als Rückgabewert den Inhalt des Attachments als Byte-String zurück. Da die Namen der Attachments nicht zwingend eindeutig sind, muss es per Idx identifiziert werden. |
filecontent = vtcapp.getmailattachment(activity.content, 0) outfile.write(filecontent) outfile.close() |
||||||||||||||||||||||||||
getmailattachments(content): list(string) |
Ab Version 6.5. Liefert eine Liste der Attachment-Namen einer Aktivität. |
filename = vtcapp.getmailattachments(activity.content)[0] outfile = open('C:/data/' + filename, 'wb') |
||||||||||||||||||||||||||
getmemberwithsql(obj: object, membername: string, where: string, order: string): list of objects |
Erlaubt die Abfrage von Members eines Objekts per SQL. |
projekt = argobject li=vtcapp.getmemberwithsql(projekt, "offeneleistungen", "xwertext>200", "") print len(li) >>> 3 |
||||||||||||||||||||||||||
getobjectbyentryid(classname: string, entryid: string): object |
Ab Version 6.6.0.2. Holt das Objekt mit der angegebenen Klasse und Eintrag Id. Es müssen immer beide Parameter angegeben werden. Falls die Klasse Falls keine oder mehrere Objekte gefunden werden, wird ein Fehler geworfen. Hinweis: Die Objekte werden intern via SQL geladen. Somit werden nur bereits in der Datenbank gespeicherte Objekte gefunden. Bei neu angelegten Objekten muss zuerst ein |
obj = vtcapp.getobjectbyentryid("Ordner", "FolderPublicProjectBySectors") |
||||||||||||||||||||||||||
getobjectbyid(id: int, string or long*): object |
Holt das Objekt mit der angegebenen Internen Id. Ist die Id nicht vorhanden, wird ein Fehler geworfen. Hinweis: Die Objekte werden intern via SQL geladen. Somit werden nur bereits in der Datenbank gespeicherte Objekte gefunden. Bei neu angelegten Objekten muss zuerst ein * Ab Vertec 6.7.0.4. |
obj = vtcapp.getobjectbyid(62162) oder obj = vtcapp.getobjectbyid("62162") |
||||||||||||||||||||||||||
getpropertyvalue(propname: string): value |
Gibt den Wert der Systemeinstellung (Property) mit dem angegebenen Namen zurück. Der Rückgabewert richtet sich nach dem Typ des Propertys. |
>>> print vtcapp.getpropertyvalue("firma") LKT Engineering GmbH, Hamburg |
||||||||||||||||||||||||||
getvertecserveraddress(): string |
Liefert die Adresse, unter welcher der Vertec Cloud Server aus dem Internet verfügbar ist. |
vtcapp.executeurl(vtcapp.getvertecserveraddress()) |
||||||||||||||||||||||||||
getwithsql(klasse: string, where: string, order: string, [idfilterfeld: string, objectlist: list]): list of objects
|
Dieses globale SQL Statement dient dazu, Listen, die gefiltert werden sollen, performance-optimiert direkt auf der Datenbank zu filtern (siehe dazu den Artikel Performanceoptimierter Zugriff auf Vertec Objekte). Ein Aufruf via Der ausführende Benutzer muss über Administratorenrechte oder über das SQL Query Recht verfügen. Für die Erteilung von temporären Administratorenrechten steht die Variante der erweiterten Berechtigungen zur Verfügung.
In Vertec Versionen vor 6.7.0.9 (vor Firebird 5) muss bei Listen (nicht die Ergebnisliste, sondern die Filterkriterienliste, im Beispiel rechts also die |
Ohne optionale Filterkriterien: projektlist = vtcapp.getwithsql("Projekt", "bold_id IN (SELECT projekt FROM projektphase WHERE status=1)", "code") Mit optionalen Filterkriterien: projekte = argobject.evalocl("eigProjekte") leistungen = vtcapp.getwithsql("OffeneLeistung","", "datum", "projekt", projekte)
|
||||||||||||||||||||||||||
getwithsqlbymember(klasse: string, member: string, expression: string, order [optional]: string): list of objects |
Ermöglicht die Suche von Objekten einer Klasse aufgrund eines einzelnen Member-Vergleichs für Benutzer ohne SQL-Recht (die allgemeinen SQL-Such-Methoden getwithsql und getmemberwithsql unterliegen den Einschränkungen gemäss SQL-Berechtigung, da sie mit beliebigen SQL WHERE-Klausel aufgerufen werden können.
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%") |
||||||||||||||||||||||||||
importconfigset(xmltext: string/file)Ab Vertec 6.7.0.7: importconfigset(xmltext: string/file): string |
Importiert ein Config Set in Vertec und wendet es an. Als Config Set wird gültiger XML-Text als String bzw. Datei übergeben. Zu Beachten ist das Encoding: Bis 6.3.0.12 muss der übergebene XML-Text im ANSI-Format sein, ab 6.3.0.13 in UTF-8. Ab Vertec 6.7.0.7 gibt die Funktion einen String zurück, welcher mögliche Fehler während des Imports enthält. |
vtcapp.importconfigset("""<?xml version="1.0" encoding="utf-8"?> <configset name="test" author="test"> <requirements /> <references/> <objects/> <settings> <system-setting name="GlobalDokPfad">C:\Dokumente</system-setting> </settings></configset>""") Bzw. ab 6.3.0.13: xml="""<?xml version="1.0" encoding="utf-8"?> <configset name="test" author="test"> <requirements /> <references/> <objects/> <settings> <system-setting name="GlobalDokPfad">C:\Dokumente</system-setting> </settings></configset>""".encode('utf-8') vtcapp.importconfigset(xml) Oder als Datei: f = open(r"C:\Projekte\Vertec\ConfigSet\ConfigSet.xml") vtcapp.importconfigset(f.read()) |
||||||||||||||||||||||||||
indexall([clean:boolean]) |
Ab Vertec 6.8. Indiziert alle Objekte für die Volltextsuche neu. Wird clean angegeben, wird der bereits vorhandene Index weggeworfen und neu erstellt. |
vtcapp.indexall()
behält den aktuellen Index und ergänzt ihn durch die geänderten Objekte. vtcapp.indexall(True) wirft den vorhandenen Index weg und erstellt ihn komplett neu. |
||||||||||||||||||||||||||
indexclass(classname: string) |
Ab Vertec 6.8. Indiziert Objekte der angegebenen Klasse für die Volltextsuche neu. Sind für die mit classname übergebene Klasse Indexkonfigurationen hinterlegt bzw. bei der Klasse Aktivitaet die Systemeinstellungen für das Indizieren von Dokumenten oder E-Mails gesetzt, werden mit dieser Funktion alle Objekte dieser Klasse neu indiziert. Sind diese Voraussetzungen nicht erfüllt, dann wird nichts gemacht. |
vtcapp.indexclass("Project") |
||||||||||||||||||||||||||
indexlist(objectlist) |
Ab Vertec 6.8. Die Methode nimmt eine Liste von Objekten entgegen und indiziert diese für die Volltextsuche neu. Objekte, für die kein Index geschrieben werden soll, werden automatisch aussortiert. Es kann auch ein einzelnes Objekt als Liste übergeben werden. |
Einzelnes Objekt indizieren:
vtcapp.indexlist([argobject])
Liste indizieren:
liste = argobject.eintraege
vtcapp.indexlist(liste)
|
||||||||||||||||||||||||||
indexactivities(type: integer) |
Ab Vertec 6.8. Mit dieser Methode können Aktivitäten einer bestimmten Art (type) für die Volltextsuche neu indiziert werden. Als type wird einer der folgenden Werte übergeben:
|
vtcapp.indexactivities(1)
indiziert alle Dokumente (Word und PDF) neu. |
||||||||||||||||||||||||||
indexstatus(): dict |
Ab Vertec 6.8. Gibt Informationen über den Status der Indizierung für die Volltextsuche als Dictionary mit folgenden Informationen aus:
Diese Informationen werden auch in den System Info im neuen Bereich Indexing ausgegeben. Komplexe Operationen sind |
print vtcapp.indexstatus() {u'OperationRunning': False, u'IsAvailable': True, u'StatusMessage': u'idle'} |
||||||||||||||||||||||||||
indexabort() |
Ab Vertec 6.8. Bricht eine aktuell laufende Indizierung für die Volltextsuche ab. Das Queuing der Objekte wird abgebrochen, bereits gequeute Objekte werden noch fertig indiziert. |
vtcapp.indexabort()
|
||||||||||||||||||||||||||
inputbox(caption: string, prompt: string[, default: string]): string |
Einfaches Eingabefeld anzeigen.
Der Aufbau der Buttons und der Rückgabewerte funktioniert gemäss Artikel msgbox/inputbox: Beschreibung der Parameter. |
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:
|
projekt = argobject leistung = projekt.evalocl("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 [, buttons: int, title: string]): int |
Message Box anzeigen (Versionen ab 6.0) Die Funktion unterstützt (optionale) Argumente für Buttons und Titel. Der Aufbau der Buttons und der Rückgabewerte funktioniert gemäss Artikel msgbox/inputbox: Beschreibung der Parameter. |
vtcapp.msgbox("Dies ist mein Text", 1, "Vertec") |
||||||||||||||||||||||||||
msgtomime(msgcontent): mimecontent |
Ab Version 6.5.0.11 bis und mit Version 6.6. Wandelt
Bestehende E-Mails als |
import os for act in argobject.eintraege: if act.effpfad and os.path.exists(act.effpfad): try: f = open(act.effpfad, 'rb') act.content = vtcapp.msgtomime(f.read()) except Exception as e: print('error on activity %s: %s' % (act, e)) else: print('path is empty or doesn\'t exist on activity %s' % act) |
||||||||||||||||||||||||||
pdfcombine(doc1:string, doc2:string): string |
Diese Methode fügt 2 PDF Dokumente zusammen. Die PDF Dokumente werden dabei als Byte-String übergeben. |
newpdf = vtcapp.pdfcombine(pdf1, pdf2) |
||||||||||||||||||||||||||
pdfextract(doc:string, pagefrom:int, pagetill:int): string |
Diese Methode extrahiert eine oder mehrere Seiten. Die Parameter pagefrom und pagetill entsprechen der ersten bzw. letzen Seite und müssen angegeben werden. |
newpdf = vtcapp.pdfextract(pdf1, pagefrom, pagetill) |
||||||||||||||||||||||||||
pdfpagecount(doc:string): int |
Diese Methode gibt die Seitenanzahl des Dokumentes an. |
pages = vtcapp.pdfpagecount(pdf1) |
||||||||||||||||||||||||||
processbi(von: String, bis: String, generator: String) |
Methode zur Berechnung von BI Daten für das Business Intelligence Modul. Entspricht der Berechnung der BI Daten auf einer Kennzahl und löst die Berechnung des als Parameter mitgegebenen Generators aus. Von- und Bis-Datum werden als String im Format "Jahr-Monat" angegeben. Der Generator muss gleich angegeben werden wie bei den Kennzahlen, also "<Modulname>.<Generatorname>", siehe Beispiel. Benötigt Administrator-Rechte. Diese Methode kann z.B auch über eine geplante Aufgabe automatisiert werden. Für die Berechnung aller Generatoren aller aktiven Kennzalen siehe die Methode vtcapp.standardprocessbi() weiter unten. |
Beispiel: Von Januar 2018 bis und mit Februar 2020: vtcapp.processbi("2018-01", "2020-02", "OffersGenerator.OffersGenerator") |
||||||||||||||||||||||||||
querycallback(state): dict |
Fragt einen vorher via registercallback registierten Callback ab.
Sobald dieser durchgeführt wurde, liefert die Funktion einen Dictionary mit allen mitgelieferten Parametern (inkl. State) zurück. Solange der Callback noch nicht durchgeführt wurde, wird |
Beispielcode: state=vtcapp.registercallback() # nur zur Demonstration: der Aufruf sollte natürlich über einen OAuth Authentifizierungs Server gehen vtcapp.executeurl("https://myserver.vertec-mobile.com/callback?State=%s&message=ASecretMessage" % state) time.sleep(3.0) # kurz warten bis browser offen values=vtcapp.querycallback(state) print(values["message"]) |
||||||||||||||||||||||||||
readinvoicedocument(binaryData) |
Die Python Funktion
*Optionale Daten: werden nur ausgegeben, wenn der QR-Code zusätzliche Informationen enthält. Das Datenobjekt kann schliesslich mit Zudem kann die Funktion auch in einer geplanten Aufgabe verwendet werden. |
Beispielscript: kreditorbeleg = open("C:\Users\Name\Desktop\QrCodeBeleg.pdf",'rb').read() belegdaten = vtcapp.readinvoicedocument(kreditorbeleg) lieferanten = vtcapp.getwithsqlbymember("Adresseintrag", "name", belegdaten.Name) lieferant = lieferanten[0] currency = vtcapp.getwithsqlbymember("Waehrung", "bezeichnung", belegdaten.Currency)[0] kreditor=vtcapp.createobject("Kreditor") kreditor.lieferant = lieferant kreditor.belegbild = kreditorbeleg kreditor.esrteilnehmer = belegdaten.Account kreditor.esrcode = belegdaten.Reference kreditor.waehrung = currency kreditor.betragbrutto = belegdaten.Amount if hasattr(belegdaten, 'DocumentNumber'): kreditor.nummer = belegdaten.DocumentNumber if hasattr(belegdaten, 'DocumentDate'): kreditor.datum = belegdaten.DocumentDate if hasattr(belegdaten, 'DueDate'): kreditor.xfaelligdatum = belegdaten.DueDate if len(kreditor.auslagen) == 1: outlay = kreditor.auslagen[0] outlay.anzahl = None outlay.xwertintfwbrutto = belegdaten['Amount'] |
||||||||||||||||||||||||||
registercallback(): string |
Registriert auf dem Cloud Server einen Callback zum Übertragen eines Authentisierungscodes. Dieser wird z.B. bei der Authentisierung via OAuth benötigt. Rückgabewert ist ein zufällig generierter State-String, welcher beim Callback übergeben werden muss, damit dieser akzeptiert wird. Der Callback wird als http get Anfrage auf den Cloud Server durchgeführt, als Beispiel |
Beispielcode: state=vtcapp.registercallback() # nur zur Demonstration: der Aufruf sollte natürlich über einen OAuth Authentifizierungs Server gehen vtcapp.executeurl("https://myserver.vertec-mobile.com/callback?State=%s&message=ASecretMessage" % state) time.sleep(3.0) # kurz warten bis browser offen values=vtcapp.querycallback(state) print(values["message"]) |
||||||||||||||||||||||||||
rendertemplate(templateString, data): unicode string |
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 Zur Übergabe der Daten stehen als weitere Argumente der Funktion folgende Möglichkeiten zur Verfügung:
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:
# 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 |
||||||||||||||||||||||||||
renewdatabaseindexstatistics() |
Ab Version 6.8. Berechnet die Indexstatistiken neu, siehe dazu Artikel Datenbank Performance und Indexstatistiken. |
vtcapp.renewdatabaseindexstatistics() |
||||||||||||||||||||||||||
requestfilefromclient(dialogTitle: string, directory: string, filter: string [, fileName: string]): (filename, file)Das Format kann pro Filter mehrere Dateitypen enthalten. |
Der Benutzer kann in der Client Applikation eine lokale Datei 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.
Die Methode gibt ein Tupel bestehend aus Dateinamen und Dateiinhalt zurück (vor Version 6.4.0.22 gibt die Methode gibt ein Tupel bestehend aus absolutem Dateipfad inkl. Dateinamen und dem Dateiinhalt zurück). Die Maximalgrösse der hochzuladenden Datei beträgt 50 MB. Klickt der User im Dialog auf Abbrechen, erscheint in Python die Fehlermeldung: Web App Wird ein clientseitiger Pfad angegeben (Parameter Das Startverzeichnis (Parameter In Versionen vor 6.4.0.8 kann der Datei-Dialog keinen benutzerdefinierten Dialogtitel anzeigen. Der Parameter Beim Filter wird die Bezeichnung nicht angezeigt, es heisst lediglich "Alle unterstützen Typen (...)" und dann die Endungen jeweils einzeln. |
Es wird auch eine einfache Syntax unterstützt:
Variante vor Vertec 6.3.0.12:
|
||||||||||||||||||||||||||
roundcurrency(betrag, waehrung=None): float |
Rundet den angegebenen Betrag unter Berücksichtigung der Systemeinstellung Projekt > Kaufmännische Rundungsregeln verwenden. Wird optional eine Währung mitgegeben, wird zusätzlich der darauf eingetragene Wert |
Ohne Währungsangabe: amount = argobject.total vtcapp.roundcurrency(amount) 5105.89 Mit Währungsangabe:
amount = argobject.total
curr = argobject.waehrung
vtcapp.roundcurrency(amount, curr)
5105.9
|
||||||||||||||||||||||||||
search(term:string, [onlyactive:boolean, language:string, similarsearch:boolean, datetimefrom: date, datetimeto:date]): SearchResultFührt eine Volltextsuche in den indizierten Objekten durch.
Zurückgegeben wird ein Python Objekt vom Typ SearchResult. Dieses enthält folgende Eigenschaften:
Eine Suche gibt maximal 500 Businessobjekte aus (SearchResultItems). Diese sind absteigend sortiert nach Relevanz (score). |
results = vtcapp.search("keller", "EN", False, datetimeto=vtcapp.currentdate()) for item in results.items: print item, item.fragments Mit results = vtcapp.search("consulting") projects = results.objects.evalocl("self->select(oclIsTypeOf(Project))")
|
|||||||||||||||||||||||||||
scriptexecute(scripttext, argobject=None) |
Ermöglicht den Aufruf eines Vertec Scripts.
|
proj = vtcapp.getobjectbyentryid("Projekt", "TemplateProject") scripttext = vtcapp.evalocl("scripteintrag->select(bezeichnung='Projekt kopieren')->first.scripttext") vtcapp.scriptexecute(scripttext, proj) |
||||||||||||||||||||||||||
selectaddress()selectphase()selectproject()selectobjectintree() |
Ab Version 6.4.0.21. Ermöglicht den Aufruf der verschiedenen Such- und Auswahldialoge für Adressen, Projekte, Phasen und den Baum direkt aus Python. Die Methoden unterstützen die folgenden optionalen Keyword Argumente:
Rückgabewert ist das ausgewählte Objekt. |
adresse= vtcapp.selectaddress(title="Adressauswahl", classname="Kontakt", filter="vorname like '%S%'") projekt = vtcapp.selectproject(title="Projektauswahl", filter="code like '%S%'") phase= vtcapp.selectphase(title="Phasenauswahl", filter="code like '%S%'") Kontakte = argobject.subordner Kontaktordner = list(Kontakte) Kontaktordner.append(argobject) selected=vtcapp.selectobjectintree("Objekt wählen",Kontaktordner, "Ordner, Kontakt", selectfilter="Kontakt") |
||||||||||||||||||||||||||
selectfromlist (caption: string, text: string, col1caption: string, col2caption: string, default: string, list: list of tuple): string |
Erstellt einen Auswahldialog gemäss den Angaben.
*) 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]): booleanSendet eine Datei oder einen String (als Datei) an einen Client. Die Methode funktioniert auch im Restrict Scripting Modus.
Ab Vertec 6.5.0.11 ist das Unterdrücken eines Dialogs nur noch für die folgenden Dateitypen (Endungen) möglich. Whitelist:
Die Kombination Die Methode hat einen Rückgabewert und liefert True oder False zurück:
Beispiel eines einfachen Projektexports: projekte = argobject.evalocl("eintraege.list") projektstr = "" for projekt in projekte: 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) Dateien 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, |
||||||||||||||||||||||||||||
sendmail(to, subject, body, [cc, bcc, fromSender, attachments])Ermöglicht den E-Mail-Versand aus Vertec mit den unter Systemeinstellungen E-Mail beschriebenen Voraussetzungen. Die Methode kann mit allen Apps verwendet werden.
Optional:
Beispiele:
vtcapp.sendmail("dokumentation@vertec.com", "Dokumentation", "Dies ist der einfachste Fall")
1. Das entsprechende Word-Dokument muss erstellt und gelesen werden: in_file = open("C:\<yourPath>\BeispielWordFürEmail.docx", "rb") dataFileData = in_file.read() 2. Mit der Methode die E-Mail generieren: vtcapp.sendmail('dokumentation@vertec.com', 'Test E-Mail from Word', dataFileData) |
||||||||||||||||||||||||||||
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
|
Nur Vertec Versionen vor 6.6. Ab Vertec Version 6.6 verwenden Sie dafür die Setzt einen Ressourcenplanwert.
|
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. |
Eine detaillierte Beschreibung finden Sie im Artikel über die Python Dialoge. | ||||||||||||||||||||||||||
showdetailform(obj: object) |
Zeigt die Detailansicht des Objektes in einem neuen Tab an. |
leistung = vtcapp.createobject("Offeneleistung") vtcapp.showdetailform(leistung) |
||||||||||||||||||||||||||
standardprocessbi() |
Methode für die Brechnung von BI Daten für das Business Intelligence Modul. Entspricht der Durchführung der standardmässig mitgelieferten geplanten Aufgabe und löst die Berechnung aller Generatoren auf allen aktiven Kennzahlen aus. Benötigt Administrator-Rechte. Für die Berechnung einzelner Generatoren siehe die Methode vtcapp.processbi() weiter oben. |
vtcapp.standardprocessbi() |
||||||||||||||||||||||||||
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-Klausel, 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 Klausel mit einem Datumsintervall, passend auf den aktuell verwendeten Datenbankserver, welche dann in ein |
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 >>> |
||||||||||||||||||||||||||
syncpayments() |
Ab Version 6.4.0.22. Führt einen globalen Zahlungsabgleich durch. Falls keine Debitorenschnittstelle mit Zahlungsabgleich installiert ist, meldet die Methode einen Fehler. |
vtcapp.syncpayments() Die Methode kann beispielsweise als geplante Aufgabe registriert werden. |
||||||||||||||||||||||||||
SystemContext() |
Ab Version 6.6. Aktiviert innerhalb des Scripts die erweiterten Berechtigungen.
|
with vtcapp.SystemContext(): ...Code der vom Systemcontext profitiert. |
||||||||||||||||||||||||||
translate(txt: string[, language:string]): string |
Übersetzt einen GUI Text in die aktuelle Vertec Sprache. Es kann ein optionaler Parameter für die Zielsprache der Übersetzung verwendet werden. |
Die aktuelle Vertec-Sprache ist English: >>> vtcapp.translate("Leistung") Service Ab Version 6.5.0.20: >>> vtcapp.translate('Offer', 'DD') Angebot |
||||||||||||||||||||||||||
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 |
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.evalocl('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 Hinweis: Liegt das Datum am Monatsende und haben die jeweiligen Monate unterschiedliche Anzahl Tage, wird der letzte Tag des gesuchten Monats genommen. Beispiel: |
>>> 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 |
Die Verwendung von strtodate ist heikel, da der String je nach Windows Ländereinstellungen interpretiert wird. So liefert die Expression vtcapp.strtodate('31.01.2024') 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)
executereport(rootObj, optarg, berichtObj, [saveAs, showDialog, doPrint, showApp]) | ||||||||
---|---|---|---|---|---|---|---|---|
Berichtsystem | berichtObj | saveAs | showDialog | doPrint | showApp | Desktop | Cloud | Web |
Office-generierte Legacy-Berichte (Word, Excel) | Berichtobjekt in Vertec
oder Pfad zum Office-Template auf dem Filesystem. |
Falls ein Leerstring angegeben wird oder das Argument weggelassen wird, dann wird kein File gespeichert. |
True oder False
Standard=False |
True oder False
Standard=False In Versionen ab 6.6.0.8 nicht mehr berücksichtigt. |
True oder False
In Versionen vor 6.6.0.8 nicht beachtet, falls doPrint = True. In diesem Fall wird der Bericht immer angezeigt. nicht beachtet, falls Bericht nicht gespeichert wird. In diesem Fall wird der Bericht immer angezeigt. |
x | x | |
Vertec-generierte Legacy-Word-Berichte | Berichtobjekt in Vertec | Dito | Dito | Nicht berücksichtigt | Nicht berücksichtigt | x | x | x |
Office-Berichte (Word, Excel, PDF) | Berichtobjekt in Vertec | Dito | Dito | Nicht berücksichtigt | True oder False
Wird nicht beachtet, falls Bericht nicht gespeichert wird. In diesem Fall wird der Bericht immer angezeigt. |
x | x | x |
executereport2(rootObj, optarg, berichtObj, [saveAs, showDialog, doPrint, showApp]) | ||||||||
---|---|---|---|---|---|---|---|---|
Berichtsystem | berichtObj | saveAs | showDialog | doPrint | showApp | Desktop | Cloud | Web |
Office-generierte Legacy-Berichte (Word, Excel) |
Berichtobjekt in Vertec Keine Pfade. |
Falls ein Leerstring angegeben wird oder das Argument weggelassen wird, dann wird kein File gespeichert. Wird kein File gespeichert, wird auch keine Aktivität erzeugt. |
True oder False
Standard=False |
True oder False
Standard=False In Versionen ab 6.6.0.8 nicht mehr berücksichtigt. |
True oder False
In Versionen vor 6.6.0.8 nicht beachtet, falls doPrint = True. In diesem Fall wird der Bericht immer angezeigt. nicht beachtet, falls Bericht nicht gespeichert wird. In diesem Fall wird der Bericht immer angezeigt. |
x | x | |
Vertec-generierte Legacy-Word-Berichte | Berichtobjekt in Vertec | Dito | Dito | Nicht berücksichtigt | Nicht berücksichtigt | x | x | x |
Office-Berichte (Word, Excel, PDF) | Berichtobjekt in Vertec | Dito | Dito | Nicht berücksichtigt | True oder False
Wird nicht beachtet, falls Bericht nicht gespeichert wird. In diesem Fall wird der Bericht immer angezeigt. |
x | x | x |
kursiv: optionaler Parameter
Auf einzelnen Objekten sind je nach Klasse (Typ) die folgenden Python Funktionen verfügbar.
Die Klasse eines Objekts kann in Python mithilfe von OCL ermittelt werden:
obj.evalocl('ocltype.asstring')
Auf allen Objekten, egal welcher Klasse, gibt es folgende Python Funktionen:
Funktion | Beschreibung | Beispielcode |
---|---|---|
addtag(tagname) |
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() |
evalocl(OCL:string) |
Evaluiert eine OCL-Expression auf dem Objekt. |
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): stringgetkeybool(key): booleangetkeycurr(key): currencygetkeyint(key): integergetkeydate(key): datetime |
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.
Multilanguage-Attribute sind:
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 |
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) |
Löscht den entsprechenden Tag von diesem Objekt. Informationen dazu finden Sie im Artikel Tags auf User-Einträgen. |
argobject.removetag('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.evalocl('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 setattr(target, zName, getattr(source, zName)) vtcapp.showdetailform(target) |
setkeyvalue(key, value) |
Mit dieser Methode werden kundenspezifische Werte als Key-Values auf User-Einträgen abgelegt. Auf diese Werte kann später über die |
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.
Multilanguage-Attribute sind:
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 ausschliesslich zur Steuerung des Memorybedarfs bei Datenmigrationen eingeführt. Sie muss mit Vorsicht verwendet werden, da anschliessende Zugriffe auf das entladene Objekt zu Fehlern führen können. |
|
Auf einzelnen Objekten der Klasse Projekt
gibt es folgende Python Funktionen:
Funktion | Beschreibung | Beispielcode |
---|---|---|
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): ... |
setresourceplanvalue(worker, date, value) |
Ab Vertec 6.6. Erlaubt das Setzen von Ressourcenplanwerten, wenn die Planungsebene auf Projekt eingestellt ist.
|
bearb = vtcapp.currentlogin() projekt = argobject projekt.setresourceplanvalue(bearb, vtcapp.strtodate('15.05.2023'), 180) |
AbstractWorker
ist die Basisklasse von Projektbearbeitern und Planungsbearbeitern. Auf einzelnen Objekten dieser Klassen gibt es folgende Python Funktionen:
Funktion | Beschreibung | Beispielcode |
---|---|---|
setresourceplanvalue(project_or_phase, date, value) |
Ab Vertec 6.6. Erlaubt das Setzen von Ressourcenplanwerten.
|
bearb = vtcapp.currentlogin() projekt = argobject bearb.setresourceplanvalue(projekt, vtcapp.strtodate('15.05.2023'), 180) |
Auf einzelnen Objekten der Klasse Projektbearbeiter
gibt es folgende Python Funktionen:
Funktion | Beschreibung | Beispielcode |
---|---|---|
setnotification(category, text, link) |
Ab Vertec 6.6. Fügt dem Bearbeiter eine Benachrichtigung (Notification) mit angegebener Kategorie, Text und optional verlinktem UserEintrag hinzu. Falls auf dem Bearbeiter bereits eine Notification mit gleicher Kategorie und gleichem verlinkten Objekt vorhanden ist, wird der Text aktualisiert.
|
aktivitaet = argobject zustaendig = aktivitaet.zustaendig if zustaendig and not aktivitaet.erledigt: zustaendig.setnotification('pending_activity', aktivitaet.titel, aktivitaet) |
deletenotification(category, link) |
Ab Vertec 6.6. Löscht die Benachrichtigung (Notification) auf dem Bearbeiter mit entsprechender Kategorie und verlinktem Objekt. Wird keine entsprechende Notification gefunden, geschieht nichts. Es erscheint keine Fehlermeldung. |
aktivitaet = argobject zustaendig = aktivitaet.zustaendig if zustaendig and aktivitaet.erledigt: zustaendig.deletenotification('pending_activity', aktivitaet) |
Auf einzelnen Objekten der Klasse Projektphase
gibt es folgende Python Funktionen:
Funktion | Beschreibung | Beispielcode |
---|---|---|
setresourceplanvalue(worker, date, value) |
Ab Vertec 6.6. Erlaubt das Setzen von Ressourcenplanwerten, wenn die Planungsebene auf Phase eingestellt ist.
|
bearb = vtcapp.currentlogin() phase = argobject phase.setresourceplanvalue(bearb, vtcapp.strtodate('15.05.2023'), 180) |
Auf einzelnen Objekten der Klasse Rechnung
gibt es folgende Python Funktionen:
Funktion | Beschreibung | Beispielcode |
---|---|---|
buchen([raiseException]) |
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() |
Importiert die Zahlungen zur aktuellen Rechnung. Funktioniert nur, wenn die Debitorenschnittstelle den Zahlungsabgleich unterstützt. |
argobject.importzahlungen() |
makeoffen([raiseException]) |
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]) |
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]) |
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() |
Mit der Klasse Projekteintrag
werden Leistungen, Spesen und Auslagen zusammengefasst. Auf einzelnen Objekten dieser Klassen gibt es folgende Python Funktionen:
Funktion | Beschreibung | Beispielcode |
---|---|---|
makeoffen() |
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() |
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() |
Auf einzelnen Objekten der Klasse Leistung
(OffeneLeistung, VerrechneteLeistung) gibt es folgende Python Funktion:
Funktion | Beschreibung | Beispielcode |
---|---|---|
updatesatz() |
Stundensatz wird neu berechnet (aus Tarifsystem).
Benötigt Berechtigung |
argobject.updatesatz() |
Auf einzelnen Objekten der Klasse Aktivitaet
gibt es folgende Python Funktionen:
Funkion | Beschreibung | Beispielcode |
---|---|---|
setpfad(pfad: string) |
Setzt den Dokumentenpfad auf der Aktivität, wenn die Dokumentspeicherung auf |
argobject.setpfad('C:\\Dokumente\\text.txt') |
setdocumentcontent(filename, documentcontent) |
Ab Vertec 6.7.0.15. Fügt der Aktivität ein Dokument hinzu, wenn die Dokumentspeicherung auf
Auf der Aktivität geschieht Folgendes:
Nach erfolgreicher Ausführung wird die Seite Dokument angezeigt. Ist auf der Aktivität bereits ein Dokument gespeichert, wird ein Fehler ausgegeben. Hinweis: Die Methode kann auch verwendet werden, wenn die Dokumentspeicherung nicht auf Intern gestellt ist. Das Dokument wird aber auf jeden Fall intern gespeichert. |
(name, file) = vtcapp.requestfilefromclient("Dokument auswählen", r"C:", "Word|*.docx") activity = vtcapp.createobject("Aktivitaet") activity.setdocumentcontent(name, file) vtcapp.showdetailform(activity) |
setemailcontent(mimecontent) |
Ab Vertec 6.7.0.15. Fügt der Aktivität eine E-Mail hinzu.
Auf der Aktivität geschieht Folgendes:
Nach erfolgreicher Ausführung wird die Seite E-Mail angezeigt. Ist auf der Aktivität bereits ein Dokument gespeichert, wird ein Fehler ausgegeben. |
(name, file) = vtcapp.requestfilefromclient("Email auswählen", r"C:", "Email|*.msg") mimecontent = vtcapp.msgtomime(file) activity = vtcapp.createobject("Aktivitaet") activity.setemailcontent(mimecontent) vtcapp.showdetailform(activity) |
Auf einzelnen Objekten der Klasse Waehrung
gibt es folgende Python Funktion:
Funktion | Beschreibung | Beispielcode |
---|---|---|
getkursto(waehrung: object, date: date): currency |
Gibt den Umrechnungskurs zum entsprechenden Datum zurück. |
chf.getkursto(eur, vtcapp.currentdate()) |
Alle Python Methoden, welche Listen von Businessobjekten zurückgeben, geben direkt eine Vertec-Liste zurück. Die aus den Methoden
resultierenden Listen sind damit direkt Vertec-Listen.
Beispiel: liste = vtcapp.evalocl("projekt->select(code.sqllike('A%'))")
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.evalocl("eintraege").idstring() leistungen = vtcapp.createlist("OffeneLeistung", vtcapp.getwithsql("OffeneLeistung", "projekt IN (%s)" % projektIds, "")) print leistungen.evalocl("wertext->sum") |
extend(liste: list) |
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. |
projektIds = argobject.evalocl("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 Dazu müssen die IDs einer Liste von Objekten in einen comma-delimited String umgewandelt werden.
|
>>> vtcapp.evalocl('Projektbearbeiter->allinstances').idstring() 300,676,7613,682,688,694 |
index(Objekt) |
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) |
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.evalocl("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 projektIds = argobject.evalocl("eintraege").idstring() leistungen = vtcapp.createlist("OffeneLeistung", vtcapp.getwithsql("OffeneLeistung", "projekt IN (%s)" % projektIds, "")) leistungen = leistungen.evalocl("self->reject(bearbeiter.asstring = 'Judith Feller')") |
Vertec- und Python-Listen unterscheiden sich in folgenden Punkten:
Der + Operator ist nicht auf Vertec-Listen anwendbar. Code der Art
projektIds = argobject.evalocl("eintraege").idstring() leistungen = vtcapp.getwithsql("OffeneLeistung", "projekt IN (%s)" % projektIds, "") \ + vtcapp.getwithsql("VerrechneteLeistung", "projekt IN (%s)" % projektIds, "") funktioniert nicht. Es erscheint ein Fehler: Stattdessen muss 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 |
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 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 |