Der Chatbot hilft Ihnen bei Fragen rund um das Produkt und die Anpassbarkeit der Software. Wie bei allen AI-generierten Daten sollten die Antworten bei kritischen Informationen verifiziert werden. Nehmen Sie dafür gerne Kontakt
mit uns auf. Weitere Informationen zur Verarbeitung der Chat-Daten bieten wir auf der Datenschutzseite
.
Die besten Antworten liefert der Chatbot, wenn Ihr Input möglichst viele Informationen enthält. Zum Beispiel:
«Welche Apps stehen im Vertec Cloud Abo zur Verfügung?»
In der Vertec Installation ist eine Vertec Python Library (Modul) integriert. Diese ist nach der Installation in den Python Scripts automatisch verfügbar und heisst vtcapp.
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
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
convertwordtopdf(wordDoc: string): string
Wandelt ein Word-Dokument vom Typ .docx in ein PDF um.
Das entsprechende Word-Dokument muss erstellt und gelesen werden:
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.
to: String. Empfängeradressen, mit ; getrennt, falls mehrere.
subject: String. Betreff der E-Mail.
body:
String. Der eigentliche E-Mail-Text. Kann HTML oder plaintext sein. HTML wird als solches erkannt und dann in Form einer Outlook HTML Mail erstellt.
Ab Version 6.5.0.21 kann auch ein Word-Dokument verwendet werden (siehe Beispiel unten).
Optional:
body: Ist ab Version 6.7 optional. Falls body nicht angegeben, ein Leerstring oder None ist, wird in der angelegten E-Mail nichts gesetzt.
cc: String, Optional, Keyword*. Cc-Adressen, mit ; getrennt, falls mehrere.
bcc: String, Optional, Keyword*. Bcc-Adressen, mit ; getrennt, falls mehrere.
attachments: Liste von Tuples, Optional, Keyword. Liste von Attachments als Tuple von zwei Strings[(Name des Files, Inhalt)], siehe Beispiel unten.
show: Boolean, Optional, Keyword*. Bei True wird die E-Mail erstellt und angezeigt, bei False wird die E-Mail im "Enwürfe"-Ordner gespeichert und nicht angezeigt. Default-Wert ist True.
onBehalfOf: String, Optional. Versendet das E-Mail mit einem abweichenden Absender. Beispiel: vtcapp.createoutlookmail("dokumentation@vertec.com", "Betreff XYZ", onBehalfOf="noreply@vertec.com") öffnet eine E-Mail mit dem Absender noreply@vertec.com.
*Keyword bedeutet, dass Sie die optionalen Werte mit dem Parameter als Keyword, z.B. CC="abc@vertec.com" angeben können. So benötigen Sie keine bestimmte Anzahl Kommas als Platzhalter für nicht angegebene optionalen Werte.
Beispiele:
Einfachster Fall, Body als String:
vtcapp.createoutlookmail("dokumentation@vertec.com", "Dokumentation", "Dies ist der einfachste Fall")
Verwendung von Word-Dokumenten als Body:
Hinweis: Verwenden Sie in Ihren Word-Dokumenten Tabellen und vermeiden Sie Tabstopps, da diese im E-Mail nicht verarbeitet werden können.
Das entsprechende Word-Dokument muss erstellt und gelesen werden:
vtcapp.createoutlookmail('dokumentation@vertec.com', 'Test E-Mail from Word', fileData)
Keywords (show wird per keyword angegeben):
vtcapp.createoutlookmail("dokumentation@vertec.com", "Dokumentation", "jetzt benutzen wir show per keyword", show=False)
Attachments:
akt = argobject
attachments=[('File1.txt', 'This is the content of file 1'),('Anhang.pdf', akt.content)]
vtcapp.createoutlookmail("dokumentation@vertec.com", "Dokumentation", "Eine E-Mail mit attachments", attachments=attachments, show=False)
Der Attachmentname darf nicht leer sein.
Body in HTML
html="<html><body><p>Hallo</p><p>Dies ist eine Outlook Nachricht in HTML.</p><p>Es ist ziemlich einfach, verwenden Sie HTML BODY und P (Paragraph) wie hier dargestellt, und schon entsteht eine strukturierte E-Mail.</p><p>Möchten Sie <b>fettgedruckten</b>, <i>kursiven</i>, <u>unterstrichenen</u> Text, verwenden Sie die entsprechenden Tags.<span style=\"color: red\">Sie können auch eine andere Farbe verwenden.</span></p><p>Freundliche Grüsse</p><p>Ihr Vertec Team</p></body></html>" vtcapp.createoutlookmail("dokumentation@vertec.com", "Dokumentation", html)
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 Version 6.2.0.7 liefern die Python-Methoden evalocl(), getwithsql() und getmemberwithsql() automatisch Vertec-Listen zurück, siehe Vertec-Listen.
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.
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()
DisabledEvents()
Ab Version 6.7.0.7. Muss mit with aufgerufen werden:
with vtcapp.DisabledEvents():
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.
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.
Öffnet eine Datei auf dem Client (ohne Web App). Der Dateipfad muss vom Client aus erreichbar sein.
Ab Version 6.4.0.10 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:
Im command findet kein Parsing statt. Leerzeichen werden als Teil des Pfades interpretiert.
Im argumentString findet das Parsing statt, dort trennen Leerzeichen die Argumente, ausser sie befinden sich innerhalb von doppelten Anführungszeichen "".
Ab Vertec 6.5.0.11 können nur noch Dateien vom Typ .doc, .docx, .xls, .xlsx, .pdf, .csv, .txt, .zip, .png, .jpg, .jpeg, .bmp, .gif, .eml und ab Vertec 6.5.0.15 .ics direkt ausgeführt werden (gleiche Whitelist
wie bei sendfile()). Bei allen anderen kommt ein Dialog mit der Frage, ob Vertec die Datei öffnen darf:
Falls Ja, werden Pfad und Name der Datei gemerkt, und der Dialog erscheint beim erneuten Aufruf dieser Datei nicht mehr.
Das geschieht durch einen Eintrag in der Registry im Key: HKEY_CURRENT_USER\Software\Vertec\ExecuteFileWhiteList. Das Whitelisting bezieht sich nur auf die ausführbare Datei samt Pfad, nicht auf etwaige Argumente.
Falls Nein, besteht kein Schreibzugriff auf diesen Teil der Registry und die Datei kann nicht gemerkt werden. Es wird eine Warnung ins Logfile
geschrieben (Vertec.Cloud.log bzw. Vertec.Desktop.log)
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.
Ö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.
Erlaubt den Aufruf und das Ausführen von Berichten
aufgrund eines Bericht-Objekts.
Eine Tabelle über die Verfügbarkeit mit den verschiedenen Systemen finden Sie im Abschnitt executereport() oder executeserverwordreport()
weiter unten.
rootObj: Das Objekt, auf dem der Bericht ausgeführt wird. Es kann nur ein einzelnes Objekt, keine Liste angegeben werden.
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 Bericht wird aufgrund dieser Definition ausgeführt.
Handelt es sich um einen Legacy Word-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 keine Datei gespeichert.
Wenn None übergeben wird, werden die SaveAs-Einstellungen aus dem Bericht-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 "existierende Datei überschreiben" und "neuen Pfad erstellen" über diese Einstellung gesteuert. Wenn der Parameter nicht gesetzt wird, wird die entsprechende Einstellung aus dem Bericht-Objekt (berichtObj) übernommen.
doPrint: Optional. Mögliche Werte: True oder False. Dieser Wert wird nur bei Office-generierten Legacy-Berichten vor Version 6.6.0.8 berücksichtigt. Falls True, wird der Bericht direkt ausgedruckt, ohne dass sich die entsprechende Office-Applikation öffnet.
showApp: Gibt an, ob der Bericht offen angezeigt werden soll. Optional. Mögliche Werte: True oder False.
Beispiele:
Einen Word-Bericht für Rechnung anzeigen, ohne Dialog und ohne eine Datei zu speichern:
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 vtcapp.createoutlookmail().
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.
rootObj : Das Objekt, auf dem der Bericht ausgeführt wird. Es kann nur ein einzelnes Objekt, keine Liste angegeben werden.
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 keine Datei gespeichert. Default: ""
showDialog : Anzeige von Dialog mit Speichern unter etc. als boolean. Default: False
showApp: : Boolean, der angibt, ob der Bericht offen angezeigt werden soll. Default: True
Ö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.
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)")
getmemberwithsql(obj: object, membername: string, where: string, order: string): list of objects
Erlaubt die Abfrage von Members eines Objekts per SQL.
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.
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 classname nicht existiert oder nicht vom Typ Eintrag erbt, wird ein Fehler geworfen.
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 vtcapp.updatedatabase() abgesetzt werden, damit das Objekt mit dieser Methode gefunden wird.
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 vtcapp.updatedatabase() abgesetzt werden, damit das Objekt mit dieser Methode gefunden wird.
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.
getwithsql(klasse: string, where: string, order: string, [idfilterfeld: string, objectlist: list]): list of objects
Vor Version 6.3.0.8:
getwithsql(klasse: string, where: string, order: string): 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 getwithsql() ist nur dann sinnvoll, wenn eine Where-Klausel benötigt wird. Für ungefilterte Listen verwenden Sie statt getwithsql() bitte evalocl()
.
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.
klasse: Klassenname als String.
where: SQL WHERE-Klausel. 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 Version 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.
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 projekte) von mehr als 1500 Einträgen zwingend mit diesen Filterkriterien gearbeitet werden, da sonst eine Fehlermeldung erscheint.
Ohne optionale Filterkriterien:
projektlist = vtcapp.getwithsql("Projekt", "bold_id IN (SELECT projekt FROM projektphase WHERE status=1)", "code")
getwithsqlbymember(klasse: string, member: string, expression: string, order [optional]: string): list of objects
Ab Version 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 getwithsql und getmemberwithsql unterliegen den Einschränkungen gemäss SQL-Berechtigung, da sie mit beliebigen SQL WHERE-Klausel 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.
Ab Version 6.5.0.11 bis und mit Version 6.6. Wandelt .msg Dateien ins MIME Format um, damit E-Mails (Aktivitäten) direkt in Vertec angezeigt werden können.
Das Vertec Outlook Addin speichert E-Mails als .msg Datei und verknüpft sie mit Aktivitäten.
Bestehende E-Mails als .msg Dateien, z.B. aus der Anwendung mit dem Vertec Outlook Addin, können mittels nebenstehendem Script umgewandelt werden. Das Script funktioniert nur ohne Restrict Scripting
, also nicht im Cloud Abo, und nicht mit Sharepoint-Pfaden. Es wird auf einer Liste von Aktivitäten (aktueller Container) ausgeführt und wandelt alle .msg Dateien um (die E-Mails werden von den Laufwerkpfaden ins Vertec migriert).
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
Ab Version 6.5.0.7. Diese Methode fügt 2 PDF Dokumente zusammen. Die PDF Dokumente werden dabei als Byte-String übergeben.
Ab Version 6.5.0.7. Diese Methode extrahiert eine oder mehrere Seiten. Die Parameter pagefrom und pagetill entsprechen der ersten bzw. letzen Seite und müssen angegeben werden.
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 None zurückgegeben. Bereits erfolgreich abgefragte Callbacks können nicht erneut abgefragt werden, da die Registrierung dann nicht mehr vorhanden ist.
Beim Abfragen via querycallback in einer Schleife (polling) sollte unbedingt eine Verzögerung mit Hilfe von time.sleep Aufrufen eingebaut werden, damit die Session nicht blockiert 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)
Ab Version 6.5.0.7. Die Python Funktion readinvoicedocument akzeptiert die Formate PDF, JPG und PNG von Kreditorbelegen und verarbeitet den darin enthaltenen QR-Code, den sie als Datenobjekt zurückgibt. Ab Version 6.5.0.11 wird auch EPC-QR-Code unterstützt.
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 https://mein.vertec-cloud.com/callback?state=<statestring>&code=<authentisierungscode>. Die mit dem Callback übertragenen Parameter können anschliessend via vtcapp.querycallback abgefragt werden.
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"])
Ab Version 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.
Vor Version 6.4.0.22:
requestfilefromclient(title: string, path: string, filter: string [, abspath: string]): (filepath, file)
Anpassung des Filter-Ausdrucks mit Vertec Version 6.3.0.12: Das Format kann pro Filter auch mehrere Dateitypen enthalten. Die Änderungen sind nicht rückwärtskompatibel, mit der neuen Version müssen die Expressions angepasst werden.
Ab Version 6.3.0.4. 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.
dialogTitle: Titel des Dialogs
directory: 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. Der Filterausdruck ändert sich mit Version 6.3.0.12, bitte Beispiele rechts beachten.
fileName: Absoluter Pfad der hochzuladenden Datei. Dieser Parameter ist optional. Wird er angegeben, so wird in Versionen vor 6.5.0.11 kein Dialog angezeigt.
Ab Vertec 6.5.0.11 erscheint ein Dialog, der den Benutzer darauf aufmerksam macht, dass Vertec diese Datei lesen will, was dieser mit Ja oder Nein quittieren kann. Bei Nein wird der Vorgang abgebrochen und eine Exception geworfen.
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.
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.
Web App
Wird ein clientseitiger Pfad angegeben (Parameter abspath), erscheint in der Web App eine Fehlermeldung.
Das Startverzeichnis (Parameter path) wird ignoriert.
In Versionen vor 6.4.0.8 kann der Datei-Dialog keinen benutzerdefinierten Dialogtitel anzeigen. Der Parameter title wird erst ab Version 6.4.0.8 berücksichtigt.
Beim Filter wird die Bezeichnung nicht angezeigt, es heisst lediglich "Alle unterstützen Typen (...)" und dann die Endungen jeweils einzeln.
Filterausdruck besteht aus Filterpaaren, wobei jedes Filterpaar zwingend Name und Ausdruck benötigt.
Sowohl zwischen den Paaren als auch innerhalb eines Paars zwischen Name und Ausdruck müssen Pipes als Trennzeichen verwendet werden.
Im Falle mehrerer Dateiendungen müssen diese durch Semikola anstatt Kommata getrennt werden:
vtcapp.requestfilefromclient("Hallo Welt", r"C:\MyDirectory", "Office Documents|*.docx;*.xlsx|Text|*.txt|XML|*.xml")
Öffnet einen Dialog mit dem Titel "Hallo Welt" im Verzeichnis C:\MyDirectory, welcher den Upload von Office-, TXT- oder XML-Dateien erlaubt .
Es wird auch eine einfache Syntax unterstützt:
vtcapp.requestfilefromclient("Hallo Welt", r"C:\MyDirectory", "*.txt")
Öffnet einen Dialog mit dem Titel "Hallo Welt" im Verzeichnis C:\MyDirectory, welcher den Upload von TXT-Dateien erlaubt.
vtcapp.requestfilefromclient("Hallo Welt", r"C:\MyDirectory", "*.txt;*.xml")
Öffnet einen Dialog mit dem Titel "Hallo Welt" im Verzeichnis C:\MyDirectory, welcher den Upload von TXT- oder XML-Dateien erlaubt.
vtcapp.requestfilefromclient("", "", "", r"C:\MyDirectory\MyFile.txt")
Lädt die Datei 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
Variante vor Vertec 6.3.0.12:
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.
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.
classname: Adressklasse, in der gesucht wird, z.B Firma. (Default: Adresseintrag)
filter: Zusätzliche SQL Filter Bedingung (Default: leer), z.B. nur auf aktive Objekte
Der Suchdialog für Adressen verwendet die Standard-Suchdefinition gemäss Systemeinstellungen.
selectphase(string title, string filter)
title: Dialog Titel (Default: Phasen auswählen)
filter: Zusätzliche SQL Filter Bedingung (Default: leer), z.B. nur auf aktive Objekte
selectproject(string title, string filter)
title: Dialog Titel (Default: Projekte auswählen)
filter: Zusätzliche SQL Filter Bedingung (Default: leer), z.B. nur auf aktive Objekte
selectobjectintree(string title, list entrylist, string browsefilter, string selectfilter)
title: Dialog Titel (Default: Objekte auswählen)
entrylist: Liste von Vertec Objekten, welche im Dialog als Root Elemente dargestellt werden.
browsefilter: Komma-delimited Filter für Objekttypen (z.B Ordner, Expressionordner)
selectfilter: Der Selectfilter bestimmt, auf welchen Einträgen (Klassen und deren Subklassen) man den Dialog bestätigen kann und somit "auswählt", auch Komma-delimited.
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.
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
Ab Version 6.2. Sendet eine Datei oder einen String (als Datei) an einen Client.
Die Methode funktioniert auch im Restrict Scripting Modus.
file: Hier kann ein String als Datei-Content oder ein Python Datei-Object übergeben werden.
filename: Name der Datei, falls es gespeichert wird.
showsavedialog: Optional. Standard = False. Desktop und Cloud App. Die übertragene Datei soll auf dem Client je nach Anforderung und Möglichkeiten des Clients gespeichert oder gleich ausgeführt 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 die Datei im Temp-Folder des Clients gespeichert, eine bestehende Datei wird dabei überschrieben. Das ist sinnvoll im Zusammenhang mit openfile=true, dann wird die Datei in Temp gespeichert und gleich geöffnet.
Ab Vertec 6.5.0.11 ist das Unterdrücken eines Dialogs nur noch für die folgenden Dateitypen (Endungen) möglich. Whitelist:
.doc, .docx, .xls, .xlsx, .pdf, .csv, .txt, .zip, .png, .jpg, .jpeg, .bmp, .gif, .eml und ab Vertec 6.5.0.15 .ics.
Bei allen Dateitypen, die sich nicht auf dieser Whitelist befinden, erscheint eine Fehlermeldung.
openfile: Optional. Desktop und Cloud App. Wenn true, wird die Datei nach dem Speichern geöffnet. Standard ist true.
Die Kombination showsavedialog=false und openfile=false ist nicht sinnvoll, da so die Datei im Temp-Verzeichnis gespeichert wird und sonst nichts passiert.
Mit der Web App als Client erscheint die Datei immer als Download im Webbrowser. Die Argumente showsavedialog und openfile haben keine Bedeutung.
Ab Version 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 die Datei 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 += 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, open mit with zu verwenden wie im obigen Beispiel.
Ermöglicht den E-Mail-Versand aus Vertec mit den unter Systemeinstellungen E-Mail
beschriebenen Voraussetzungen. Die Methode kann mit allen Apps verwendet werden.
to: String. Empfängeradressen.
Mithilfe eines Semikolon ; können auch mehrere Adressen angegeben werden, ohne Abstand zwischen den Adressen und dem Semikolon.
subject: String. Betreff der E-Mail.
body:
String: Der eigentliche E-Mail-Text. Kann HTML oder plaintext sein. HTML wird als solches erkannt und dann in Form einer Outlook HTML Mail erstellt.
Ab Version 6.5.0.21 kann auch ein Word-Dokument verwendet werden (siehe Beispiel unten).
Optional:
fromSender: String. falls null oder leer wird der Absender aus den Systemeinstellungen genommen. Berechtigungen etc. werden nicht überprüft, es muss sichergestellt werden, dass der User berechtigt ist, unter diesem Absender E-Mails zu versenden, sonst funktioniert das clientseitig nicht.
attachment: [(Name der Datei, Inhalt)]: Falls ausgefüllt, wird der Anhang an die E-Mail angehängt.
Beispiele:
Einfachster Fall, Body als String:
vtcapp.sendmail("dokumentation@vertec.com", "Dokumentation", "Dies ist der einfachste Fall")
Verwendung von Word-Dokumenten als Body:
Hinweis: Verwenden Sie in Ihren Word-Dokumenten Tabellen und vermeiden Sie Tabstopps, da diese im E-Mail nicht verarbeitet werden können.
1. Das entsprechende Word-Dokument muss erstellt und gelesen werden:
Nur Vertec Versionen vor 6.6. Ab Vertec Version 6.6 verwenden Sie dafür die setresourceplanvalue Methoden auf Bearbeitern
, Projekten
oder Projektphasen
.
Setzt einen Ressourcenplanwert.
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.
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
>>>
Erzeugt eine SQL between Klausel 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
>>>
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.
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).
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: incmonth(-1) auf dem 31.03.2021 ausgeführt ergibt den 28.02.2021.
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()
executereport() oder executeserverwordreport()
Wann wird welche Methode verwendet und wie müssen die Parameter gesetzt werden?
Executereport und Executereport2 können mit Office-Berichten
und Legacy Word-Berichten
verwendet werden und erlauben den Aufruf und das Ausführen von Berichten aufgrund eines Bericht-Objekts.
Executeserverwordreport kann nur mit Vertec-generierten Word-Berichten
verwendet werden. Diese Methode dient dazu, Vertec-generierte Word-Berichte ohne ein Bericht-Objekt auszuführen.
Folgende Parameter sind bei allen Methoden gleich:
rootObj
Das Vertec Objekt, auf dem der Bericht ausgeführt wird.
optarg
Optionale Adresse. Falls nicht verwendet, mit None angeben.
# Buchungen
# Wir fragen den Benutzer, ob er in die Buchhaltung buchen will. Vielleicht will er auch einfach nur die Buchungen anschauen.
if vtcapp.msgbox("Die Buchungen wurden erstellt und als .txt Datei am üblichen Ort dokumentiert. Möchten Sie die Buchungen jetzt übertragen?",3, "Vertec") == 6:
# Buchungen werden übertragen.
ext = vtcextensions.getextension("DEBI")
ext.StartLohnBuchung()
for rec in reclist:
ext.LohnBuchungsZeile(rec.Mandant, rec.Personalnummer, rec.Lohnartnummer, rec.Text, rec.GueltigVon, rec.GueltigBis, rec.Anzahl)
# Buchungen werden hier abgesetzt. Vor der Buchung wird überprüft,
# ob diese Zeile bereits vorhanden ist, wenn ja, überspringen.
ext.EndLohnBuchung()
Das Modul "ziputils"
Ab Version 6.3.0.2 gibt es ein Vertec Modul namens ziputils, welches ermöglicht, Dateien zu komprimieren. Dabei werden in Python ZIP-Files generiert.
Es ist auch im Resctict Scripting Modus verfügbar und enthält folgende Methoden:
Methode / Funktion
Beschreibung
Beispielcode
createzip(contentlist: tuples): bytestream
Ab Version 6.3.0.2. Komprimiert eine Liste von tuples (filename,content) zu einem ZIP-File 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)
Ab Version 6.5.0.14 stehen folgende 3 Funktionen zur Verfügung:
readnames(zipcontent) liefert eine Liste der Dateinamen, die im ZIP-File enthalten sind. Falls das ZIP-File eine Ordnerstruktur hat, enthalten die Namen die Pfade mit Slashes (/) getrennt.
readbyname(zipcontent, name) liest eine Datei aufgrund seines Namen aus dem ZIP-File aus.
readbyidx(zipcontent, idx) liest eine Datei aufgrund seines Index in der Namenliste aus.
Das Modul "vtcplanningcore"
Ab Version 6.6. gibt es das Python Modul vtcplanningcore für die Ressourcenplanung
mit folgenden Methoden:
Methode / Funktion
Beschreibung
increment_interval_date(datum, increment): date
Funktion zum Inkrementieren und Dekrementieren von Perioden-Start-Daten. Inkrementiert das angegebene Datum um die in increment angegebene Anzahl Intervalle. Für das Dekrementieren kann eine negative Anzahl Intervalle angegeben werden.
get_planning_level(): string
Gibt die Planungsebene als String zurück.
Mögliche Resultate: 'Projekt' oder 'ProjektPhase'.
get_planning_interval_type(): string
Gibt das Planungsintervall als String zurück.
Mögliche Resultate: 'day', 'week' oder 'month'.
show_bulk_planning_dialog(left_obj, right_obj)
Zeigt einen Dialog zum effizienten Setzen mehrerer Planungswerte für die angegebenen Objekte.
Die Reihenfolge, in der die Objekte bereitgestellt werden, spielt keine Rolle, aber der Aufrufer muss sicherstellen, dass eines davon ein Objekt vom Typ AbstractWorker ist, also entweder ein Projektbearbeiter oder ein Planungsbearbeiter
, und das andere entweder ein Projekt oder eine Projektphase, je nach eingestellter Planungsebene
.
Das ResourcePlanningProvider Hilfsobjekt
Zur Umsetzung der Ressourcenplanungs Listen steht in diesem Modul auch eine ResourcePlanningProvider Klasse zur Verfügung, welche das Auslesen und Setzen von Plandaten erlaubt und die in einem List Controller
verwendet werden kann.
Ein ResourcePlanningProvider Objekt wird für eine Liste von Einträgen (Bearbeiter, Projekte oder Phasen) und eine Zeitperiode angelegt. Der Provider lädt dann sämtliche Planungsdaten für diese Source Objekte und für die angegebene Periode. Anschliessend können die geplanten Werte abgerufen oder gesetzt werden.
Ein Planwert im ResourcePlanningProvider gilt immer für 2 Einträge und ein Datum, z.B. für den Bearbeiter "Christoph Keller", das Projekt "AZZ2" und den Monat beginnend mit 01.08.2022.
Der eine Eintrag (der Source-Eintrag, sourceEntry) muss aus der Liste der bei der Initialisierung angegebenen Einträge stammen. Den anderen Eintrag nennen wir "gegenüberliegend" (othersideEntry).
Die folgenden Methoden stehen auf einem ResourcePlanningProvider Objekt zur Verfügung:
Constructor, erstellt einen Planning-Provider und lädt die Plandaten für die angegebenen Objekte und Periode.
add_entry(obj)
Fügt ein neues Objekt zur Ursprungsliste (sourceEntries) des Providers hinzu.
add_otherside_entry(obj)
Fügt ein neues Objekt temporär in die Liste der otherside Einträge hinzu. Dadurch können für dieses Objekt mit set_planned_minutes() Planwerte eingetragen werden.
get_planned_minutes(date, sourceEntry, othersideEntry, subscriber): int
Liefert die geplante Zeit in Minuten für die Planungs-Zelle mit Intervall-Datum date und die beiden angegebenen Einträge. Falls keine Plandaten vorhanden sind, wird None zurückgegeben.
Setzt die geplante Zeit in Minuten für die Planungszelle mit Intervall-Datum date und die angegebenen Einträge.
Das Setzen eines None Wertes als value entfernt die Plandaten für diese Zelle.
Überprüft, ob für die beiden Objekte und das Datumsintervall Schreibrechte bestehen.
get_planned_minutes_aggregated (source_entry, otherside_entry, dateFrom, dateTo=None, subscriber=None): int
Liefert die aggregierte geplante Zeit für die beiden angegebenen Einträge im angegebenen Zeitraum.
Sowohl source_entry als auch otherside_entry können None sein; in diesem Fall werden alle Einträge berücksichtigt, die dem aktuellen ResourcePlanningProvider bekannt sind.
dateFrom ist erforderlich, dateTo ist optional. Wenn kein dateTo angegeben wird, wird nur das Intervall berücksichtigt, das mit dateFrom übereinstimmt.
Gibt None zurück, wenn keine Planwerte mit den angegebenen Kriterien gefunden werden.
get_net_capacity_minutes(self, worker, dateFrom, dateTo=None, subscriber=None): int
Netto-Kapazität in Minuten pro Bearbeiter.
worker: AbstractWorker, PlanningWorker oder Projektbearbeiter
dateFrom: Start-Datum
dateTo: Optional, End-Datum. Fall None, wird das End-Datum vom Intervall des dateFrom verwendet.
Damit können beispielsweise auf einem Projekt die Bearbeiter, welche bereits überlastet sind, in der Liste farblich hervorgehoben werden.
get_custom_net_capacity_minutes(self, worker, dateFrom, dateTo=None, subscriber=None): int
Ab Vertec 6.7.0.5. Netto-Kapazität in Minuten pro Bearbeiter unter Berücksichtigung der Systemeinstellung Angepasste Nettokapazität (Prozent)
.
Gibt None zurück, falls die Systemeinstellung leer ist oder einen ungültigen Wert enthält.
get_gross_capacity_minutes(self, worker, dateFrom, dateTo=None, subscriber=None): int
Brutto-Kapazität in Minuten pro Bearbeiter.
worker
: AbstractWorker, PlanningWorker oder Projektbearbeiter
dateFrom: Start-Datum
dateTo: Optional, End-Datum. Fall None, wird das End-Datum vom Intervall des dateFrom verwendet.
Damit können beispielsweise auf einem Projekt die Bearbeiter, welche bereits überlastet sind, in der Liste farblich hervorgehoben werden.
get_remaining_capacity_minutes(worker, dateFrom, dateTo=None, subscriber=None): int
Verbleibende freie Kapazität in Minuten für einen bestimmten Bearbeiter und einen bestimmten Datumsbereich (net_capacity - planned_minutes).
worker
: AbstractWorker, PlanningWorker oder Projektbearbeiter (siehe 2.4)
dateFrom: Start-Datum
dateTo: Optional, End-Datum. Fall None, wird das End-Datum vom Intervall des dateFrom verwendet.
get_custom_remaining_capacity_minutes(self,worker, dateFrom, dateTo=None, subscriber=None): int
Ab Vertec 6.7.0.5. Verbleibende freie Kapazität in Minuten für einen bestimmten Bearbeiter und einen bestimmten Datumsbereich unter Berücksichtigung der Systemeinstellung Angepasste Nettokapazität (Prozent)
.
Gibt None zurück, falls die Systemeinstellung leer ist oder einen ungültigen Wert enthält.
get_otherside_entries(subscriber): list of entries
Liefert die Liste der Einträge für welche bereits Plandaten vorhanden sind, ausgehend von den im Constructor angegebenen Objekten sourceEntries.
generate_date_range(start, end)
Liefert eine Liste von Datumswerten für Planungsintervalle von start bis end. Richtet sich nach der systemweiten Einstellung des Planungs-Intervalls (Monate, Wochen, Tage).
get_start_preceding_interval(): date
Gibt das Datum des Intervalls zurück, das dem Startintervall vorausgeht.
get_column_title_by_date(date): string
Liefert bei Angabe des Datumswert für ein bestimmtes Planungsintervall den geeigneten Spalten-Titel.
ResourcePlanningProvider werden üblicherweise in List Controllern und Custom Renderern für Planungslisten ver-wendet. Der List Controller instanziiert einen Planning-Provider, welcher dann zum Anzeigen und Setzen der Werte in Plan Zellen verwendet wird.
vtcplanningcore als Stub File
Das vtcplanningcore Modul ist auch als Python Stub
File verfügbar. Es heisst vtcplanningcore.py und ist wie die anderen Stub Files im Unterordner PythonStubs im Vertec Installationsverzeichnis abgelegt.
Das Modul "vtcplanning"
Ab Version 6.6. gibt es das Python Modul vtcplanning, mit demStandard Implementierungen von List Controllern
für die Ressourcenplanung mitgeliefert werden.
Diese besitzen alle eine initialize_with_period(start, end, interval) Methode, welche vom Vertec Kern aufgerufen wird und die darzustellende Planungsperiode sowie das Planungsintervall angibt.
Damit eine Planungsliste, welche auf einem neuen Intervall (z.B. aktueller Monat) startet, nicht ganz leer ist, laden die List Controller jeweils auch Planungsdaten für ein Intervall vor dem angegebenen Startdatum.
Das heisst, wenn als Planungsperiode August - Oktober angegeben ist (Planungsintervall "Monat") dann werden auch Zeilenobjekte dargestellt, welche im Juli, nicht aber in August-Oktober Planungsdaten haben.
Zeittabellen
Die Zeittabellen
basieren auf einem Einzelobjekt und zeigen pro geplantes gegenüberliegendes Objekt eine Zeile an. Die Spalten entsprechen den zeitlichen Planungsintervallen.
Zeittabellen können, basierend auf einer Liste, auch als read-only Summentabellen
angezeigt werden.
Wir liefern im Python Modul vtcplanning die folgenden List Controller Klassen mit:
List Controller
Beschreibung
vtcplanning.SingleObjectTimeTableController
Wird verwendet, um auf einzelnen Objekten zu planen (Häkchen Für einzelne Objekte anzeigen? ist gesetzt).
Der Controller kann selbst mit den verschiedenen Klassen (Projekt, ProjektPhase, AbstractWorker, Projektbearbeiter oder PlanningWorker) umgehen, es kann immer derselbe Controller angegeben werden.
Basierend auf einem Einzelobjekt, jedoch read-only, nicht zur Planung. Wird verwendet für Zeittabellen auf einzelnen Objekten, auf die nicht geplant werden kann.
Für read-only Phasen-Zeittabellen auf einzelnen Objekten. Werden verwendet, um Phasensummen anzuzeigen, falls die Planungsart Bearbeiter-Phasen-Zuordnung
ist.
vtcplanning.ReadonlyContainerTimeTableController
Für read-only Zeittabellen auf Listen (Häkchen Für Listen anzeigen? ist gesetzt).
Wird verwendet für Summen-Zeittabellen
.
Für Read-only Zeittabellen auf Listen (Häkchen Für Listen anzeigen? ist gesetzt).
Wird verwendet für Summen-Zeittabellen
, um auf einer Liste von Objekten die Summen der Gegenseite anzuzeigen (z.B. Bearbeitersummen auf einer Projektliste).
Für Read-only Zeittabellen auf Listen (Häkchen Für Listen anzeigen? ist gesetzt), um auf einer Liste von Projekten oder Bearbeiter Summen von Phasen anzuzeigen, wenn die Planungsebene Projekt ist (in diesem Fall würden die normalen Listen-Controller auf Projekten nicht angezeigt).
Pivottabellen
Ausgehend von einer Liste von Einträgen (AbstractWorker, Projekt oder Phasen) kann eine Ressourcenplanungs Pivottabelle
dargestellt werden. Die Pivottabelle zeigt die Einträge als Spalten und die geplanten gegenüberliegenden Einträge als Zeilen. Dies ermöglich es, via Stern-Zeile Plandaten für neue gegenüberliegende Einträge zu erfassen.
Zur Realisierung von Pivottabellen Ansichten stehen die folgenden List Controller Klassen zur Verfügung:
List Controller
Beschreibung
vtcplanning.RegularPivotTableController
Für Pivottabellen mit den Einträgen in der Liste als Zeilen und der Gegenseite als Spalten. Wird verwendet, um auf einer Liste zu planen (Häkchen Für Listen anzeigen? ist gesetzt).
Der Controller kann selbst mit den verschiedenen Klassen (Projekt, ProjektPhase, AbstractWorker, Projektbearbeiter oder PlanningWorker) umgehen, es kann immer derselbe Controller angegeben werden.
vtcplanning.MirroredPivotTableController
Für Pivottabellen mit den Einträgen in der Liste als Spalten und der Gegenseite als Zeilen. Wird verwendet, um auf einer Liste zu planen (Häkchen Für Listen anzeigen? ist gesetzt).
In dieser Liste kann eine Stern-Zeile angezeigt werden, um neue zu planende Objekte einzufügen. Genauere Informationen dazu finden Sie hier
.
Der Controller kann selbst mit den verschiedenen Klassen (Projekt, ProjektPhase, AbstractWorker, Projektbearbeiter oder PlanningWorker) umgehen, es kann immer derselbe Controller angegeben werden.
vtcplanning.ReadonlyRegularPivotTableController
Wird verwendet, um Projekt – Bearbeiter Pivottabellen anzuzeigen, wenn die Planungsebene Phasen ist, mit den Einträgen der Liste als Zeilen und der Gegenseite als Spalten.
vtcplanning.ReadonlyMirroredPivotTableController
Wird verwendet, um Projekt – Bearbeiter Pivottabellen anzuzeigen, wenn die Planungsebene Phasen ist, mit den Einträgen der Liste als Spalten und der Gegenseite als Zeilen.
Wird verwendet, um auch auf einem Einzelprojekt in Pivottabellen zu planen. Zeigt eine Pivottabelle mit dem einzelnen Eintrag als Zeile und der Gegenseite als Spalten.
Wird verwendet, um auch auf einem Einzelprojekt in Pivottabellen zu planen. Zeigt eine Pivottabelle mit dem einzelnen Eintrag als Spalte und der Gegenseite als Zeilen.
Verfügbare Renderer
Dazu passend gibt es folgende Custom Renderer
zur Verwendung in den Ressourcenplanungstabellen. Alle diese Renderer können in den Listeneinstellungen auf zwei Arten verwendet werden:
Zeigt pro Zeile den summierten Wert über alle Spalten.
Custom Renderer
Beschreibung
vtcplanning.PlannedMinutesRenderer
Renderer für die Planungszeiten. Ermöglicht die Eingabe der Planwerte in den einzelnen Zellen.
vtcplanning.NetCapacityRenderer
Renderer, um die Netto-Verfügbarkeit von Bearbeitern anzuzeigen.
vtcplanning.CustomNetCapacityRenderer
Ab Vertec 6.7.0.5. Zeigt die Netto-Verfügbarkeit von Bearbeitern unter Berücksichtigung der Systemeinstellung Angepasste Nettokapazität (Prozent)
.
vtcplanning.GrossCapacityRenderer
Renderer, um die Brutto-Verfügbarkeit von Bearbeitern anzuzeigen.
vtcplanning.RemainingCapacityRenderer
Renderer, um die Rest-Verfügbarkeit von Bearbeitern anzuzeigen.
vtcplanning.CustomRemainingCapacityRenderer
Ab Vertec 6.7.0.5. Zeigt die Rest-Verfügbarkeit von Bearbeitern unter Berücksichtigung der Systemeinstellung Angepasste Nettokapazität (Prozent)
.
vtcplanning als Stub File
Das vtcplanning Modul ist auch als Python Stub
File verfügbar. Es heisst vtcplanning.py und ist wie die anderen Stub Files im Unterordner PythonStubs im Vertec Installationsverzeichnis abgelegt.
Das Modul "vtccom"
Ab Vertec 6.7.0.7 gibt es das Python Modul vtccom, welches die Möglichkeiten des COM Forwarding implementiert.
Dieses enthält die Funktion vtccom.createobject(identifier), welche ein Forwarding Proxy für den COM Server auf dem Client liefert.
Die Informationen dazu finden Sie im Artikel über das COM Forwarding
.
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.
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.
Vor Version 6.1.0.10 hiess das auf dem einzelnen Objekt eval(). Dann wurde die Methode an die globale Methode angeglichen, so dass sie überall gleich heisst. In Versionen ab 6.1.0.10 sollte man deshalb immer evalocl() verwenden.
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 Version 6.1.0.10. Mit diesen Methoden wird auf die als Key-Values abgelegten Werte zugegriffen.
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.
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)
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 target.zName ansprechen, gäbe es eine Fehlermeldung "target has no attribute zName". Also verwendet man setattr:
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.
Classname eines Objektes
Der Zugriff auf den classname funktioniert in Python nur über OCL:
obj.evalocl('ocltype.asstring')
Methoden auf einzelnen Objekten vom Typ "Projekt"
Methode/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
Ab Vertec 6.6. Erlaubt das Setzen von Ressourcenplanwerten.
project or phase: Je nach Planungsebene
wird hier ein Projekt oder eine Projektphase angegeben.
date: Es wird diejenige Periode mit dem Value gefüllt, in welcher sich das Datum befindet.
value: Wert in Minuten.
bearb = vtcapp.currentlogin()
projekt = argobject
bearb.setresourceplanvalue(projekt, vtcapp.strtodate('15.05.2023'), 180)
Methoden auf einzelnen Objekten vom Typ "Projektbearbeiter"
Auf Projektbearbeitern gibt es folgende Methoden:
Methode/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.
category ist ein String, welcher die Kategorie (Art) der Notification bezeichnet. Dieser ist frei wählbar.
text ist ein beliebiger Text, welcher die Notification beschreibt und üblicherweise auch Angaben zum verlinkten Objekt enthält.
link (optional): ist ein Vertec Objekt (UserEintrag). Falls angegeben, wird die Notification mit dem entsprechenden Icon sowie der Standardanzeige
des Objekts dargestellt.
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)
Methoden auf einzelnen Objekten vom Typ "Projektphase"
Auf Projektphasen gibt es folgende Methoden:
Methode/Funktion
Beschreibung
Beispielcode
setresourceplanvalue(worker, date, value)
Ab Vertec 6.6. Erlaubt das Setzen von Ressourcenplanwerten, wenn die Planungsebene
auf Phase eingestellt ist.
worker: Als worker wird ein Planungsbearbeiter
oder ein Projektbearbeiter übergeben.
date: Es wird diejenige Periode mit dem Value gefüllt, in welcher sich das Datum befindet.
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.
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/Funktion
Beschreibung
Beispielcode
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/Funktion
Beschreibung
Beispielcode
updatesatz()
Ab Version 6.1.0.14. Stundensatz wird neu berechnet (aus Tarifsystem).
Benötigt BerechtigungProjekt-Administrator oder Super.
argobject.updatesatz()
Methoden auf einzelnen Objekten vom Typ "Aktivitaet"
Methode/Funkion
Beschreibung
Beispielcode
setpfad(pfad: string)
Ab Version 6.1.0.14. Setzt den Dokumentenpfad auf der Aktivität, wenn die Dokumentspeicherung
auf Dateisystem oder DMS eingestellt ist.
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 Intern eingestellt ist.
filename: Name, unter dem die Datei gespeichert werden soll.
documentcontent: Dokumentinhalt als bytestream.
Auf der Aktivität geschieht Folgendes:
DocumentFullName wird gesetzt
DocumentData Objekt wird erzeugt und mit dem Content beschrieben
DocumentSize wird auf Länge des Content Arrays gesetzt
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.
Ab Vertec 6.7.0.15. Fügt der Aktivität eine E-Mail hinzu.
mimecontent: Hier wird die .eml Datei angegeben. Falls es sich bei der E-Mail um eine .msg Datei handelt, muss diese mit vtcapp.msgtomime()
zuerst ins MIME Format konvertiert werden.
Auf der Aktivität geschieht Folgendes:
EmailSender wird extrahiert und gesetzt
EmailRecipients wird extrahiert und gesetzt
DocumentData Objekt wird erzeugt und mit dem Content beschrieben
DocumentSize wird auf Länge des Content Arrays gesetzt
EmailAttachmentNames wird gesetzt
Text wird mit body (plain text) beschrieben
Title wird mit subject beschrieben
Nach erfolgreicher Ausführung wird die Seite E-Mail angezeigt.
Ist auf der Aktivität bereits ein Dokument gespeichert, wird ein Fehler ausgegeben.
Methoden auf einzelnen Objekten vom Typ "Waehrung"
Methode/Funktion
Beschreibung
Beispielcode
getkursto(waehrung: object, date: date): currency
Ab Version 6.1.0.14. Gibt den Umrechnungskurs zum entsprechenden Datum zurück.
chf.getkursto(eur, vtcapp.currentdate())
Vertec-Listen
Ab Version 6.2.0.7 geben alle Python Methoden, welche Listen von Businessobjekten 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.
Ab Version 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.
Ab Version 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 Version 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.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 remove() Methode zu zeigen. Diesen Anwendungsfall würde man eher via reject lösen:
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.