/
Allgemeine Lua-Hooks im ERPv6

Allgemeine Lua-Hooks im ERPv6

Konfiguration


Über den Eintrag “Lua-Hooks konfigurieren” im Hilfe-Menu können können Scripte an den Lua-Hooks eines Fensters hinterlegt werden.

Beispiel aus AR10/AR11:

image-20250318-074049.png
image-20250318-084610.png

Über die editierbare Spalte “Lua-Script” kann entweder ein bestehendes Lua-Fragment (LFRAG10) verknüpft, ein neues Fragment angelegt oder (über das Kontext-Menu) ein bereits verknüpftes Fragment editiert werden.

Hooks

alle Fenster

InstanceInit

Wird beim Erzeugen eines Fenster-Instanz ausgelöst (was gewöhnlicherweise der erste Aufruf eines bestimmten Fensters ist). Der Rückgabe-Wert wird ignoriert.

WindowInit

Wird bei jeder Fenster-Initialisierung ausgelöst. Der Rückgabe-Wert wird ignoriert.

WindowClose (bool)

Wird beim Schliessen des Fensters ausgelöst. Der Rückgabe-Wert steuert, ob das Fenster tatsächlich geschlossen wird (false = nein, true/kein Wert = ja).

Übersichts-Fenster

ViewPre (bool)

Wird beim Klick auf den Anzeigen-Button vor der eigentlichen Verarbeitung ausgelöst. Der Rückgabe-Wert steuert, ob die eigentliche Verarbeitung ausgelöst oder abgebrochen wird (false = abbrechen, true/kein Wert = weiterlaufen).

EditPre (bool)

Wird beim Klick auf den Ändern-Button vor der eigentlichen Verarbeitung ausgelöst. Der Rückgabe-Wert steuert, ob die eigentliche Verarbeitung ausgelöst oder abgebrochen wird (false = abbrechen, true/kein Wert = weiterlaufen).

NewPre (bool)

Wird beim Klick auf den Neuanlegen-Button vor der eigentlichen Verarbeitung ausgelöst. Der Rückgabe-Wert steuert, ob die eigentliche Verarbeitung ausgelöst oder abgebrochen wird (false = abbrechen, true/kein Wert = weiterlaufen).

CopyPre (bool)

Wird beim Klick auf den Kopieren-Button vor der eigentlichen Verarbeitung ausgelöst. Der Rückgabe-Wert steuert, ob die eigentliche Verarbeitung ausgelöst oder abgebrochen wird (false = abbrechen, true/kein Wert = weiterlaufen).

DeleteCheck (bool)

Wird beim Klick auf den Löschen-Button bei der Vorab-Prüfung vor der eigentlichen Verarbeitung ausgelöst. Rückgabe-Wert steuert, ob die eigentliche Verarbeitung ausgelöst oder abgebrochen wird (false = abbrechen, true/kein Wert = weiterlaufen). Dieser Hook wird vor DeletePre ausgelöst.

DeletePre (bool)

Wird beim Klick auf den Löschen-Button vor der eigentlichen Verarbeitung ausgelöst. Der Rückgabe-Wert steuert, ob die eigentliche Verarbeitung ausgelöst oder abgebrochen wird (false = abbrechen, true/kein Wert = weiterlaufen).

DeletePost (bool)

Wird beim Klick auf den Löschen-Button nach der eigentlichen Verarbeitung ausgelöst. Der Rückgabe-Wert steuert, ob die Verarbeitung abgeschlossen oder abgebrochen wird (false = abbrechen, true/kein Wert = abschliessen). Beim Abbruch werden alle bereits getätigten DB-Änderungen rückgängig gemacht.

Detail-Fenster

WindowOKPreValidation (bool)

Wird beim Fenster-OK vor der Feld-Prüfung ausgelöst. Der Rückgabe-Wert steuert, ob die Verarbeitung fortgesetzt oder abgebrochen wird (false = abbrechen, true/kein Wert = weiterlaufen).

WindowOKPostValidation (bool)

Wird beim Fenster-OK nach der Feld-Prüfung ausgelöst. Der Rückgabe-Wert steuert, ob die Verarbeitung fortgesetzt oder abgebrochen wird (false = abbrechen, true/kein Wert = weiterlaufen).

WindowOKPostSave (bool)

Wird beim Fenster-OK nach dem Speichern (noch innerhalb der Transaktion) ausgelöst. Der Rückgabe-Wert steuert, ob die Verarbeitung fortgesetzt oder abgebrochen wird (false = abbrechen, true/kein Wert = weiterlaufen).

WindowOKPost

Wird beim Fenster-OK am Ende der Verarbeitung ausgelöst. Der Rückgabe-Wert wird ignoriert.

Listen

ListInit

Wird bei der Initialisierung der Liste ausgelöst. Der Rückgabe-Wert wird ignoriert.

Ist im Moment nicht generell an allen Listen verfügbar.

ListTooltip (string)

Wird beim Stoppen mit dem Mauszeiger über der Liste ausgelöst. Bekommt 2 Parameter in LUA_HOOK_EVENT_ARGS übergeben:

  1. table mit Maus-Positions-Informationen:
    ”row” = Zeilen-Nr.
    ”column” = Spalten-Nr.
    ”columnName” = Spalten-Name

  2. table mit den Key-Feld-Werten der Zeile

Der Rückgabe-Wert wird als Tooltip angezeigt.

Wenn LuaTooltip Hook verknüpft wird, dann muss danach das Programm neu gestartet werden, damit dies wirksam wird.

Buttons

ButtonClickedPre (bool)

Wird beim Klick auf den Button vor der eigentlichen Verarbeitung ausgelöst. Der Rückgabe-Wert steuert, ob die Verarbeitung fortgesetzt oder abgebrochen wird (false = abbrechen, true/kein Wert = weiterlaufen).

Ob ein Abbruch tatsächlich möglich ist hängt von der individuellen Implementation des Buttons ab.

ButtonClickedPost

Wird beim Klick auf den Button nach der eigentlichen Verarbeitung ausgelöst. Der Rückgabe-Wert wird ignoriert.

Ob bei einem Fehler in der Verarbeitung der ButtonClickedPost Hook ausgeführt wird oder nicht hängt von der individuellen Implementation des Buttons ab. Man kann in ButtonClickedPost Scripten nicht grundsätzlich davon ausgehen, dass die vorangegangene Verarbeitung erfolgreich war. Inbesondere bei Multiselektion wo ja ein Teil der Datensätze erfolgreiche verarbeitet worden sein kann und ein anderer Teil nicht.

Felder

FieldDeselectEnterPre (bool)

Wird beim Enter im Feld vor der eigentlichen Verarbeitung ausgelöst. Der Rückgabe-Wert steuert, ob die Verarbeitung fortgesetzt oder abgebrochen wird (false = abbrechen, true/kein Wert = weiterlaufen).

Ist im Moment nicht generell an allen Feldern verfügbar.

FieldDeselectEnterPost (bool)

Wird beim Enter im Feld nach der eigentlichen Verarbeitung ausgelöst. Der Rückgabe-Wert steuert, ob die Verarbeitung fortgesetzt oder abgebrochen wird (false = abbrechen, true/kein Wert = weiterlaufen). Abbruch hat hier nur Auswirkungen, wenn noch weitere Prüf-Regeln am Feld verknüpft sind.

Ist im Moment nicht generell an allen Feldern verfügbar.

Scripte

Lua-Variablen


In jedem ausgeführten Script stehen diese Variablen zur Verfügung:

Name

Beschreibung

Name

Beschreibung

LUA_HOOK_WINDOW_NAME

Name des Fensters aus dem der Aufruf kam

LUA_HOOK_WINDOW_ARG1

Aufruftyp des Fensters aus dem der Aufruf kam

LUA_HOOK_WINDOW_MODE

Modus des Fensters aus dem der Aufruf kam (integer)

LUA_HOOK_WINDOW_ARGS

Parameter des Fensters aus dem der Aufruf kam

LUA_HOOK_OBJECT_NAME

Name des Objekts von dem der Aufruf kam

LUA_HOOK_EVENT_NAME

Name des Ereignisses (allgemeiner Name des Hooks)

LUA_HOOK_EVENT_ARGS

Parameter des Ereignisses

LUA_HOOK_METHOD_NAME

Name der Methode (spezifischer Name des Hooks)

LUA_HOOK_OBJECT

Objekt von dem der Aufruf kam (Instanz von LuaGUIObject)

LUA_HOOK_WINDOW

Fenster von dem der Aufruf kam (Instanz von LuaGUIObject)

LuaGUIObjekt Interface Methoden und Eigenschaften


Generell stehen alle Lua-Funktionen wie auch an anderen Stellen im Programm zur Verfügung.

Über die LuaGUIObject Klasse werden zusätzliche Methoden zur Interaktion mit dem Dialogen und Dialog-Objekten zur Verfügung gestellt.

Dabei sind für unterschiedliche Objekt-Typen unterschiedliche Methoden verfügbar:

alle Objekt-Typen

Eigenschaften

string ID [nur lesend]

Objekt-ID

string Name [nur lesend]

Objekt-Name

Fenster-Objekte (ViewWin)

Methoden

LuaGUIObject GetObjectById(string luaObjectId)

Objekt im Fenster über die Objekt ID ermitteln. Funktioniert für alle arten von Objekten.

LuaGUIObject GetFieldById(string luaFieldId)

Feld-Objekt im Fenster über die Objekt ID ermitteln.

LuaGUIObject GetFieldByName(string luaFieldName)

Feld-Objekt im Fenster über den Feld Name ermitteln.

string[] DumpObjects()

Schreibt eine Liste von ansteuerbaren Objekten ins Protokoll. Liefert eine Liste von Objekt IDs zurück.

alle Listen-Objekte (ListView, ListViewDB)

Eigenschaften

int RowCount [nur lesend]

Anzahl Zeilen in der Liste

int RowCountUnfiltered [nur lesend]

Anzahl Zeilen in der Liste (ungefiltert)

int NSelectedRows [nur lesend]

Anzahl selektierter Zeilen in der Liste

int Layout [nur lesend]

Aktuelles Layout der Liste (ID)

string LayoutName [nur lesend]

Aktuelles Layout der Liste (Name), liefert nur bei Multi-Layout Listen einen Wert

table SelectedRow [nur lesend]

Rohe Daten der (ersten) selektierten Zeile (Array mit Werten, x Key-Felder (wie definiert an der Liste) + x sichtbare Spalten)

table SelectedRows [nur lesend]

Rohe Daten der selektierten Zeilen (Array von Array mit Werten, x Key-Felder (wie definiert an der Liste) + x sichtbare Spalten)

Methoden

bool HasColumn( string columName )

Prüft die Spalte mit dem angegebenen Namen in der Liste existiert

string GetValue( string columName )

Liefert den Wert aus der Spalte mit dem angegebenen Namen (wenn sie existiert) aus der (ersten) selektierten Zeile zurück

table GetValues( string columName, bool allRows=false )

Liefert die Werte aus der Spalte mit dem angegebenen Namen (wenn sie existiert) entweder aus allen selektierten Zeilen oder aus allen Zeilen der Liste zurück

table GetDbTableValues (string tableName, bool allRows=false)

Liefert die Werte aus allen Spalten der angegebenen Tabelle entweder aus allen selektierten Zeilen oder aus allen Zeilen der Liste zurück

DB-Listen-Objekte (ListViewDB)

Eigenschaften

string AddSql

Zusätzliche Einschränkungen an der Liste

Methoden

table GetKeyValues( bool allRows=false )

Liefert die Werte aus den Key-Spalten der angegebenen Tabelle entweder aus allen selektierten Zeilen oder aus allen Zeilen der Liste zurück

void EmptyList()

Leert die Liste

int Search( string addSQL=null )

Löst eine Suche aus, mit optionalen Teil-SQL, das an das Query angehaengt wird

alle Felder (IField)

Eigenschaften

bool IsEditable

Editierbarkeit des Feldes

bool IsHiddenByView [nur lesend]

Ob Feld durch den View unsichtbar geschalten ist

bool Visible

Sichtbarkeit des Feldes

bool RealVisible [nur lesend]

Tatsächliche Sichtbarkeit des Feldes

bool Sensitive

Zustand des Feldes

Text

Inhalt des Feldes

Methoden

void GrabFocus()

Setzt den Focus auf das Feld

void TriggerActivated()

Löst den Activated Event Handler am Feld aus (was normalerweise bei Enter im Feld passiert)

void TriggerChanged()

Löst den Changed Event Handler am Feld aus (was normalerweise bei Änderungen im Feld passiert)

Text-Eingabefelder (nicht für Checkboxen, Poptexte, usw.)

Eigenschaften

string Format

Format des Feldes (CHR, NUM, FLT, usw., Formate aus sltdcol)

int WidthChars

Breite des Feldes in Zeichen

int MaxLength

Maximale Länge des Feld-Inhalts in Zeichen

alle Arten von Kombi-Felder Label+Feld (ICField)

Eigenschaften

string LabelText

Label-Text kombinierte Felder

string LabelVisible

Label-Sichtbarkeit kombinierte Felder

Beispiele

Dispo-Nr. (bestab.auidnr) aller selektierten Datensätze aus einer Liste lesen

local List = LUA_HOOK_WINDOW:GetObjectById("List") if List.NSelectedRows < 1 then -- nichts tun, weiterlaufen lassen return true end if not List:HasColumn("bestab.auidnr") then -- Spalte Dispo-Nr. Feld in Liste, Verarbeitung nicht moeglich, mit Fehler abbrechen DLG_MsgBox( "Spalte 'Dispo-Nr.' (bestab.auidnr) fehlt in der Liste. Bitte Spalte in die Liste konfigurieren!" ) return false end -- bestab.auidnr aus allen selektierten Zeilen in der Liste lesen for k,v in ipairs(List:GetValues("bestab.auidnr")) do SY_Proto2( "selektierter Datensatz: Dispo-Nr.: "..v ) -- hier koennte man irgendwas mit der Dispo-Nr. tun end -- Verarbeitung weiterlaufen lassen return true

Key-Felder aller Datensätze aus einer Liste lesen

local proto = require("de.syslog.proto") local List = LUA_HOOK_WINDOW:GetObjectById("List") if List.NSelectedRows < 1 then -- nichts tun, weiterlaufen lassen return true end local allKeys = List:GetKeyValues(true) for k,v in pairs(allKeys) do -- v ist eine Table indiziert mit "TABELLE.FELDNAME" SY_Proto2(proto.printrec(v)) -- hier koennte man irgendwas mit den Keyfeld-Werten tun end -- Verarbeitung weiterlaufen lassen return true

Hinweise

  • Jede Fenster-Instanz hat ihre eigene Lua Instanz, die gewöhnlicherweise bei der ersten Verwendung von Lua im Fenster erzeugt wird.

  • Die an den Scripting Hooks hinterlegten Scripte werden alle mit dieser Instanz ausgeführt.

  • Das bedeutet auch, dass globale Lua-Variablen (d.h. alle Variablen, die einfach nur gesetzt und nicht vorher als local deklariert wurden) in folgenden Aufrufen weiterhin verfügbar sind (da es sich immer um den selben Lua Interpreter handelt, der einfach nur Script-Fragmente ausführt).

  • Alle verwendeten Variablen und Funktionen sollten konsequent als local deklariert werden - außer es explizit gewünscht die Informationen in folgende Script-Aufrufe weiterzuschleifen.

Related content