Übersicht
STAR ist die integrierte Skriptsprache von Scopevisio Documents. Sie verwenden STAR beispielsweise in Formular-Events.
Wichtige Grundregeln:
STAR ist dynamisch typisiert und verwendet Python-Typen.
Anweisungen werden durch ein Zeilenende oder ein Semikolon (
;) getrennt.Einrückungen sind nicht signifikant.
Schlüsselwörter (z. B.
if,null) sind nicht case-sensitiv.Kommentare beginnen mit
#und enden am Zeilenende.
Unterstützte Datentypen
STAR unterstützt folgende Python-Typen:
Typ | Beschreibung |
| Text in einfachen oder doppelten Anführungszeichen |
| Ganze Zahlen |
| Zahlen mit Nachkommastellen |
|
|
| Leerer Wert |
String-Beispiele:
python
a = 'single'
b = "double"
Arithmetische Operatoren
Die folgenden Operatoren stehen Ihnen zur Verfügung:
Operator | Bedeutung |
| Addition |
| Subtraktion |
| Multiplikation |
| Division |
| Modulo |
| Integer-Division |
Beispiele:
python
a = (b + 4) * 3
b = 1 + 2 + 3
c = 10 + datepart("year", today())
Index-Operator
Mit dem Index-Operator extrahieren Sie ein Element oder einen Teilbereich (Slice) aus einem String oder einer Sammlung.
Syntax | Beschreibung |
| Gibt das erste Element zurück |
| Gibt Elemente von |
| Entspricht |
| Gibt alle Elemente von |
| Gibt die gesamte Sammlung zurück |
Hinweis für Strings:
str[index]→ gibt das Zeichen an Positionindexzurück.str[start:stop]→ gibt den Teilstring vonstartbisstop-1zurück.
Ausdrücke und Vergleichsoperatoren
Ein Ausdruck wird ausgewertet und liefert einen Wert zurück – zum Beispiel als Ergebnis eines Vergleichs.
Verfügbare Vergleichsoperatoren:
Operator | Bedeutung |
| Gleich |
| Ungleich |
| Kleiner als |
| Kleiner oder gleich |
| Größer als |
| Größer oder gleich |
Logische Verknüpfungen:
Mehrere Ausdrücke kombinieren Sie mit and, or und not.
Der in-Operator prüft, ob ein Wert in einem anderen enthalten ist.
Beispiele:
python
a < 5 and not (b == 1 or c > 10)
'ab' in 'abc' # true
'ac' in 'abc' # false
'Vorgesetzte' in current.user.groups_names # Ist der Nutzer Teil dieser Gruppe?
Operatorrangfolge
Die folgende Tabelle zeigt die Rangfolge von niedrigster zu höchster Priorität:
Priorität | Operator |
1 (niedrigste) |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 (höchste) |
|
Tipp: Verwenden Sie Klammern, um die Standardrangfolge gezielt zu überschreiben.
Variablen
Benennung
Variablennamen müssen mit einem Buchstaben beginnen. Danach sind Buchstaben, Ziffern und Unterstriche erlaubt.
python
a = 100
b1 = "String"
c_2 = false
Wichtig: Sie können eine Variable erst verwenden, nachdem Sie ihr einen Wert zugewiesen haben.
Spezielle Präfix-Variablen (_)
In Formular-Events gibt es Variablen mit dem Präfix _. Diese enthalten die Werte eines Vorgangs.
_rechnrenthält den Wert des Datenfeldes mit dem Kurznamenrechnr.Eine Zuweisung an diese Variable ändert den Wert des entsprechenden Datenfeldes direkt.
Verzweigungen (if / elseif / else)
Sie können beliebig viele elseif-Blöcke und optional einen else-Block verwenden. Schließen Sie jede Verzweigung mit end ab.
python
if a > 0 then
b = 1
elseif a < 0 then
b = -1
else
b = 0
end
Evaluierung von Variablen
STAR wertet Variablenwerte – wie Python – explizit zu true oder false aus. Das ermöglicht vereinfachte Abfragebedingungen und macht den Code lesbarer.
Strings
python
text = "Buchungstext"
# Strenge Abfrage: Text ist weder "" noch null
if text != "" and text != null then
# Logik
end
# Vereinfachte Abfrage – deckt beide Fälle ab
if text then
# Logik
end
Zahlenwerte – Prüfung auf null oder 0
null und 0 werden beide zu false evaluiert.
python
# Implizit: Prüfung auf null oder 0
if (_betragsteuer_reg or 0) == 0 then
_betragsteuer_reg = 1000
end
# Explizit: Vereinfachte Prüfung
if not _betragsteuer_reg then
_betragsteuer_reg = 1000
end
Mehrere Felder prüfen
Beide Felder sind befüllt (weder null noch ""):
python
if _kreditorname and _rechnungsnummer then
# Logik
end
Rechnungsdatum vorhanden, Leistungsdatum fehlt:
python
if _rechdat and not _leistdat then
_leistdat = date(<year>, <month>, <day>)
end
Schleifen (for)
Mit einer for-Schleife iterieren Sie über Objekte, die eine Iteration unterstützen.
python
for idx in _subtable.enumerate() do
row_field = _subtable.get(idx, 'field_name')
if row_field == 'secret' then
continue # Überspringt den Rest – weiter mit dem nächsten Index
elseif row_field == 'stop' then
break # Beendet die Schleife vollständig
end
print(row_field)
end
Schlüsselwörter in Schleifen:
Schlüsselwort | Verhalten |
| Überspringt den restlichen Code und fährt mit dem nächsten Index fort |
| Bricht die Schleife vollständig ab |
Funktionen
Sie definieren eigene Funktionen mit dem Schlüsselwort function. Parameter können Standardwerte haben. Schließen Sie die Funktion mit end ab.
python
function add_mul(a, b, c=1)
return (a + b) * c
end
Hinweise:
c=1ist ein optionaler Parameter mit dem Standardwert1.Mit
returngeben Sie den Rückgabewert der Funktion zurück.
Abbruch und Rückgabe
return – Skript an einer bestimmten Stelle beenden
Mit return beenden Sie die Ausführung des Skripts an einer bestimmten Zeile, ohne weitere Änderungen rückgängig zu machen.
python
betrag = lookup("test_tabelle", "netto_betrag", fallback=null, _name="Mitarbeiter X")
if betrag > 1000 then
print("Ende der Logik")
return
end
print("Fortführende Logik")
abort() – Skript abbrechen und Änderungen rückgängig machen
Mit abort() brechen Sie das Skript sofort ab. Alle vorher durchgeführten Änderungen (z. B. Feldwert-Zuweisungen) werden rückgängig gemacht.
python
name = lookup("firmen", "firma", fallback=null, _name="Meine Firma")
if not name then
abort("Firma konnte nicht gefunden werden.")
else
print("Führe Logik aus")
end
Hinweis: Der optionale Parameter message wird als Fehlertext angezeigt, wenn die Meldung geworfen wird.
Verfügbare Funktionen
Steuerung
Funktion | Beschreibung |
| Bricht das Skript sofort ab und macht alle Änderungen rückgängig |
| Beendet die Ausführung an der aktuellen Stelle |
| Gibt den aktuellen Wert von |
| Sendet nach dem Event eine Info-Nachricht an den Benutzer |
Typkonvertierung
Funktion | Beschreibung |
| Konvertiert |
| Konvertiert |
| Konvertiert einen String in eine Dezimalzahl. Punkt und Komma werden als Trennzeichen erkannt. Endet der String mit |
Mathematik
Funktion | Beschreibung |
| Rundet |
| Gibt die Länge einer Liste oder eines Strings zurück |
Objekte und Attribute
Funktion | Beschreibung |
| Liest ein Attribut eines Objekts aus. Gibt |
| Prüft, ob ein Objekt eine Tabelle ist |
| Gibt |
Datum und Zeit
Funktion | Beschreibung |
| Erstellt ein Datumsobjekt |
| Gibt das heutige Datum zurück |
| Extrahiert einen Teil aus einem Datum. Gültige Werte für |
| Berechnet eine Zeitdifferenz. Gültige Werte für |
| Berechnet eine relative Zeitdifferenz zwischen zwei Datumsangaben |
| Gibt ein |
Hinweis zu datepart und Wochentagen:
"weekday": Montag =0, Sonntag =6"isoweekday": Montag =1, Sonntag =7
String-Methoden
Methode | Beschreibung |
| Prüft, ob der String mit |
| Prüft, ob der String mit |
| Entfernt |
| Entfernt |
|
|
|
|
|
|
| Gibt den String in Kleinbuchstaben zurück |
| Gibt den String in Großbuchstaben zurück |
| Entfernt Whitespace (Leerzeichen, Tabs) am Anfang und Ende |
| Gibt den Index des ersten Vorkommens von |
| Ersetzt alle Vorkommen von |
Datumsobjekte
timedelta – Zeitdifferenz in Tagen und Sekunden
Ein timedelta-Objekt entsteht entweder durch die Funktion timedelta() oder durch arithmetische Operationen mit date-Objekten. Es besitzt die Attribute .days und .seconds.
pyhton
date_1 = date(2020, 2, 3)
date_2 = date(2021, 10, 5)
time_delta = date_2 - date_1
print(time_delta.days) # Ausgabe: 610
print(time_delta.seconds) # Ausgabe: 0
python
time_delta = timedelta(15, unit="days")
date_1 = date(2020, 2, 3)
date_2 = time_delta + date_1
print(date_2.days) # Ausgabe: 18
relativedelta – Relative Zeitdifferenz
Ein relativedelta-Objekt berechnen Sie mit relativedelta(date_1, date_2). Verfügbare Attribute: .years, .weeks, .days, .hours, .minutes, .seconds, .microseconds.
python
date_1 = date(2020, 2, 3)
date_2 = date(2021, 10, 5)
relative_delta = relativedelta(date_2, date_1)
print(relative_delta.years) # Ausgabe: 1
print(relative_delta.months) # Ausgabe: 8
print(relative_delta.days) # Ausgabe: 2
⚠️ Wichtiger Hinweis: .months gibt nicht die Gesamtdifferenz in Monaten zurück (hier wären das 20), sondern nur die Differenz der Monatsattribute beider Datumsobjekte. Um die Gesamtdifferenz in Monaten zu erhalten, müssen Sie die Jahresdifferenz in Monate umrechnen und addieren. Dasselbe gilt für .days.
Letzten Wochentag berechnen – Beispiel
python
# Berechnung des letzten Freitags
today() + relativedelta(weekday=weekday("FR", -1))
Globale Variablen
Schreibgeschützte globale Variablen
current_user
Enthält den aktuell angemeldeten Benutzer als Benutzer-Objekt.
Hinweis: Ist null, wenn kein Benutzer angemeldet ist – z. B. bei der Ausführung einer Hintergrundverarbeitung.
current_record
Stellt Informationen über den aktuellen Vorgang bereit. Diese Daten sind nur lesbar – Sie können sie nicht durch Zuweisung ändern.
Verfügbarkeit: In den Events on_save, on_load sowie während Workflow-Transitionen.
Attribut | Beschreibung |
| ID des Vorgangs |
| Erstellungsdatum |
| Änderungsdatum |
| ID des Erstellers |
| Ablaufdatum |
| Löschdatum |
| Freigabe-ID |
| Freigabe-Version |
| Freigabedatum |
| Status des Vorgangs |
| Postfach-Benutzer |
| Postfach-Gruppen |
| Gibt an, ob der Vorgang ausgeblendet ist |
event
Enthält Basisinformationen über das aktuell ausgeführte Event.
Attribut | Beschreibung |
| Kurzname (mit vorangestelltem |
| Zeilennummer der Tabellenzelle, in der das Event ausgelöst wurde (beginnt bei |
| Kurzname der Spalte, in der das Event ausgelöst wurde. Nur bei Events einer Untertabelle verfügbar. |
Veränderbare Vorgangs-Variablen
Diese Variablen können Sie per Zuweisung ändern, um Eigenschaften des Vorgangs zu bearbeiten.
Variable | Beschreibung |
| Das Ablaufdatum des Vorgangs |
| Das Löschdatum des Vorgangs |
Mandanten-Variable ($client)
Wenn in einem Archiv die Mandanten aktiviert sind, enthält die Variable $client den aktuell ausgewählten Mandanten des Vorgangs.
Sie greifen über Attribute auf die Eigenschaften des Mandanten zu:
Attribut | Beschreibung |
| Kürzel des Mandanten |
| Name des Mandanten |
| Interne ID des Mandanten |
Benutzer-Objekte
Ein Benutzer-Objekt repräsentiert einen Benutzer im System. Sie erhalten Benutzer-Objekte z. B. über die globale Variable current_user oder als Rückgabewert von lookup_user().
Attribute eines Benutzer-Objekts
Attribut | Beschreibung |
| Interne Benutzer-ID |
| Login-Name |
| Vollständiger Name |
| E-Mail-Adresse |
| Oberflächensprache des Benutzers ( |
| Liste der Gruppen-IDs, in denen der Benutzer Mitglied ist |
| Liste der Gruppen-Namen, in denen der Benutzer Mitglied ist |
| Liste der Rollen-IDs, in denen der Benutzer Mitglied ist |
| Liste der Rollen-Namen, in denen der Benutzer Mitglied ist |
| Benutzer-ID des Vertreters – |
|
|
Beispiel:
python
# Prüft, ob der aktuell angemeldete Benutzer Mitglied der Rolle "Prüfer" ist
print("Prüfer" in current_user.roles_names)
Status-Änderung im on_save-Event
Im on_save-Event stehen zusätzliche Variablen zur Verfügung.
Standard-Variablen
Variable | Beschreibung |
| Enthält den aktuellen Statusnamen des Vorgangs. Durch Zuweisung eines gültigen Statusnamens ändern Sie den Status. |
|
|
|
|
Service-gesteuerte Variablen
Variable | Beschreibung |
|
|
| Liste von Zeichenfolgen, die von einem API-Client oder Importservice übermittelt wurde |
Sichtbarkeit von Datenfeldern ändern
Über Events können Sie Datenfelder im Formular steuern:
Zuweisung | Beschreibung |
| Blendet das Datenfeld aus |
| Setzt das Datenfeld auf Read-Only |
| Ändert das Label des Datenfeldes |
Anzeige-Text eines Datenfeldes abfragen (.text)
Bei Key-Value-Feldern (z. B. Benutzer-Vorschlag oder verlinkter Vorgang) können Sie den Anzeige-Text über das Attribut .text abfragen.
Aufruf | Rückgabewert |
| Die intern gespeicherte ID (z. B. Benutzer-ID) |
| Der Anzeige-Text (z. B. der Name des Benutzers) |
Beispiel:
python
if _user.text == current_user.fullname then
_user_refer = "You"
else
_user_refer = _user.text
end
Untertabellen
Wenn in einem Archiv Untertabellen konfiguriert sind, stehen Ihnen folgende Funktionen und Attribute zur Verfügung. Im folgenden Beispiel hat die Untertabelle den Kurznamen table.
Attribute
Attribut | Beschreibung |
| Enthält die aktuelle Anzahl der Tabellenzeilen |
Funktionen
Funktion | Beschreibung |
| Leert die gesamte Tabelle |
| Gibt einen Iterator für alle Zeilenindizes zurück – verwendbar in einer |
| Fügt Zeilen aus |
| Gibt den Wert aus Zeile |
| Schreibt einen Wert in Zeile |
| Setzt mehrere Spaltenwerte auf einmal. Mit |
| Fügt eine neue Zeile ein und gibt deren Index zurück |
| Entfernt die Zeile am Index |
| Berechnet die Summe aller Zahlenwerte in der Spalte |
Hinweis: Zeilenindizes beginnen bei 0 – die erste Zeile hat also den Index 0.
lookup() – Suche in Datentabellen und Archiven
Mit lookup() suchen Sie nach Werten in Datentabellen oder Archiven. Die Funktion gibt das erste gefundene Ergebnis zurück.
Erstes Argument – Quelle auswählen
Wert | Beschreibung |
| Durchsucht die Datentabelle mit dem Kurznamen |
| Identisch – explizites Präfix für Datentabellen |
| Durchsucht das Archiv mit dem Kurznamen |
Zweites Argument – Rückgabefeld
Geben Sie den Kurznamen der Spalte an, deren Wert Sie ermitteln möchten.
Für interne Felder eines Vorgangs verwenden Sie das Präfix record::
Rückgabewert | Beschreibung |
| Interne ID des Vorgangs |
| Release-ID (stabil über alle Versionen) |
| Release-Version |
| Kürzel des Mandanten |
| Name des Mandanten |
| Interne ID des Mandanten |
Keyword-Argumente
Parameter | Beschreibung |
| Filtert nach dem Kurznamen einer Spalte |
| Komplexer Filter als String in der üblichen Filter-Syntax |
| Ermöglicht Wildcard-Suche, z. B. |
| Gibt |
| Filtert nach Mandanten (erforderlich bei Archiv-Lookups mit Mandanten) |
| Filtert nach interner Vorgangs-ID |
| Filtert nach Release-ID |
| Filtert nach Release-Version |
Beispiele
python
# Suche in einer Datentabelle mit Fallback
a = lookup("zahlungsbedingungen", "nettotage", fallback=10, _name="Firma")
# Wildcard-Suche in einem Archiv
b = lookup("archive:kunden", "strasse", wildcard=true, _name="F*", _plz=54321)
# Vorgang im Archiv finden und als Filterkriterium weiterverwenden
rechnr = 1200001
test_lookup = lookup("archive:test", "informationen", _rechnr=rechnr)
referred_lookup = lookup("archive:test_referred", "anbieter", record_release_id=test_lookup)
# Interne Felder zurückgeben
lookup("archive:test", "record:id", record_release_id=lookup_release_id)
lookup("archive:test", "record:client_identifier", record_id=lookup_record_id, client=$client)
Hinweis: Ist das gesuchte Feld eine Untertabelle, gibt lookup() ein Tabellen-Objekt zurück.
lookup_table() – Alle Treffer als Tabelle zurückgeben
lookup_table() funktioniert wie lookup(), gibt aber alle gefundenen Zeilen als Tabellen-Objekt zurück. Das zweite Argument (Feldname) entfällt.
python
a = lookup_table("archive:kunden", _name="F*")format_filter() – Filter dynamisch erzeugen
Mit format_filter() erzeugen Sie den filter-Parameter für lookup() sicher aus Variablen.
Strings erhalten automatisch doppelte Anführungszeichen – enthaltene Anführungszeichen werden escaped.
Datumswerte werden automatisch in das ISO-Format konvertiert.
python
plz = 54321
name = 'Firma "Test"'
f = format_filter("_plz = {p} AND _name = {n} AND _date > {d}", p=plz, n=name, d=today())
```
**Erzeugt folgenden Filter-String:**
```
_plz = 54321 AND _name = "Firma \"Test\"" AND _date > "2022-06-02"
lookup_user() – Benutzer suchen
Mit lookup_user() suchen Sie nach einem Benutzer anhand eines Filterkriteriums. Die Funktion gibt ein Benutzer-Objekt oder null zurück.
Filteroptionen
Parameter | Beschreibung |
| Suche nach Login-Name |
| Suche nach vollständigem Namen |
| Suche nach E-Mail-Adresse |
| Suche nach Benutzer-ID |
python
# Attribut substitute_active auslesen – gibt false zurück, wenn Benutzer nicht gefunden
active = getattr(lookup_user(user_id=_freigeber), "substitute_active", false)
Termine anlegen, bearbeiten und löschen
Die folgenden Funktionen stehen im on_save-Event zur Verfügung.
create_schedule() – Termin anlegen
python
create_schedule(
start_date,
escalation_rule=null,
todo=null,
recipient1=null,
recipient2=null,
recipient3=null,
repeat_unit=null,
repeat_count=null,
from_user=null,
inactive=false
)
Parameter | Pflicht | Beschreibung |
| ✅ Ja | Startdatum des Termins. Muss als |
| Nein | Name der Eskalations-Regel. Ohne Angabe wird die Standard-Regel verwendet. |
| Nein | Empfänger als Benutzer-Objekt (z. B. |
| Nein | Wiederholungsintervall: |
| Nein | Anzahl der Wiederholungen. Erfordert auch |
| Nein | Absender des Termins |
| Nein |
|
Rückgabewert: Das neu erstellte Termin-Objekt.
python
# Termin eine Woche ab heute anlegen
create_schedule(start_date=today() + timedelta(1, "week"))
lookup_schedules() – Termine laden und bearbeiten
python
lookup_schedules(todo=null, wildcard=false)
Parameter | Beschreibung |
| Optional. Filtert nach der Beschreibung des Termins. |
| Optional. |
Termin-Attribute bearbeiten:
python
schedule.start_date = _date + timedelta(1, "week")
schedule.todo = "Invoice checking postponed"
delete_schedule() – Termin löschen
python
delete_schedule(schedule)
Übergibt das Termin-Objekt, das gelöscht werden soll.
