Allgemeine Lua-Hooks im ERPv6
- 1 Konfiguration
- 1.1 Hooks
- 1.1.1 alle Fenster
- 1.1.1.1 InstanceInit
- 1.1.1.2 WindowInit
- 1.1.1.3 WindowClose (bool)
- 1.1.2 Übersichts-Fenster
- 1.1.2.1 ViewPre (bool)
- 1.1.2.2 EditPre (bool)
- 1.1.2.3 NewPre (bool)
- 1.1.2.4 CopyPre (bool)
- 1.1.2.5 DeleteCheck (bool)
- 1.1.2.6 DeletePre (bool)
- 1.1.2.7 DeletePost (bool)
- 1.1.3 Detail-Fenster
- 1.1.3.1 WindowOKPreValidation (bool)
- 1.1.3.2 WindowOKPostValidation (bool)
- 1.1.3.3 WindowOKPostSave (bool)
- 1.1.3.4 WindowOKPost
- 1.1.4 Listen
- 1.1.4.1 ListInit
- 1.1.4.2 ListTooltip (string)
- 1.1.5 Buttons
- 1.1.5.1 ButtonClickedPre (bool)
- 1.1.5.2 ButtonClickedPost
- 1.1.6 Felder
- 1.1.6.1 FieldDeselectEnterPre (bool)
- 1.1.6.2 FieldDeselectEnterPost (bool)
- 1.1.1 alle Fenster
- 1.1 Hooks
- 2 Scripte
- 2.1 Lua-Variablen
- 2.2 LuaGUIObjekt Interface Methoden und Eigenschaften
- 2.2.1 alle Objekt-Typen
- 2.2.1.1 Eigenschaften
- 2.2.1.1.1 string ID [nur lesend]
- 2.2.1.1.2 string Name [nur lesend]
- 2.2.1.1 Eigenschaften
- 2.2.2 Fenster-Objekte (ViewWin)
- 2.2.2.1 Methoden
- 2.2.2.1.1 LuaGUIObject GetObjectById(string luaObjectId)
- 2.2.2.1.2 LuaGUIObject GetFieldById(string luaFieldId)
- 2.2.2.1.3 LuaGUIObject GetFieldByName(string luaFieldName)
- 2.2.2.1.4 string[] DumpObjects()
- 2.2.2.1 Methoden
- 2.2.3 alle Listen-Objekte (ListView, ListViewDB)
- 2.2.3.1 Eigenschaften
- 2.2.3.1.1 int RowCount [nur lesend]
- 2.2.3.1.2 int RowCountUnfiltered [nur lesend]
- 2.2.3.1.3 int NSelectedRows [nur lesend]
- 2.2.3.1.4 int Layout [nur lesend]
- 2.2.3.1.5 string LayoutName [nur lesend]
- 2.2.3.1.6 table SelectedRow [nur lesend]
- 2.2.3.1.7 table SelectedRows [nur lesend]
- 2.2.3.2 Methoden
- 2.2.3.1 Eigenschaften
- 2.2.4 DB-Listen-Objekte (ListViewDB)
- 2.2.4.1 Eigenschaften
- 2.2.4.1.1 string AddSql
- 2.2.4.2 Methoden
- 2.2.4.2.1 table GetKeyValues( bool allRows=false )
- 2.2.4.2.2 void EmptyList()
- 2.2.4.2.3 int Search( string addSQL=null )
- 2.2.4.1 Eigenschaften
- 2.2.5 alle Felder (IField)
- 2.2.5.1 Eigenschaften
- 2.2.5.1.1 bool IsEditable
- 2.2.5.1.2 bool IsHiddenByView [nur lesend]
- 2.2.5.1.3 bool Visible
- 2.2.5.1.4 bool RealVisible [nur lesend]
- 2.2.5.1.5 bool Sensitive
- 2.2.5.1.6 Text
- 2.2.5.2 Methoden
- 2.2.5.2.1 void GrabFocus()
- 2.2.5.2.2 void TriggerActivated()
- 2.2.5.2.3 void TriggerChanged()
- 2.2.5.1 Eigenschaften
- 2.2.6 Text-Eingabefelder (nicht für Checkboxen, Poptexte, usw.)
- 2.2.6.1 Eigenschaften
- 2.2.6.1.1 string Format
- 2.2.6.1.2 int WidthChars
- 2.2.6.1.3 int MaxLength
- 2.2.6.1 Eigenschaften
- 2.2.7 alle Arten von Kombi-Felder Label+Feld (ICField)
- 2.2.7.1 Eigenschaften
- 2.2.7.1.1 string LabelText
- 2.2.7.1.2 string LabelVisible
- 2.2.7.1 Eigenschaften
- 2.2.1 alle Objekt-Typen
- 3 Beispiele
- 4 Hinweise
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:
Ü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:
table mit Maus-Positions-Informationen:
”row” = Zeilen-Nr.
”column” = Spalten-Nr.
”columnName” = Spalten-Nametable 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 |
---|---|
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.