Hooks bzw. Callout - Funktionen
Durch Einbinden der APD „APCallout.apd“, die individuell um spezielle
Kundenwünsche bzw. –Anforderungen erweitert werden kann, wird es möglich,
die Module um z.B. zusätzliche Gültigkeitsprüfungen, Workflowabläufe etc.
zu erweitern.
Dazu wurden sowohl an den OK-,
Übernehmen- und Abbrechen-Button,
als auch am „Create“ und „Destroy“ eines Fensters (Form-Window, Table-Window
u. Dialog) so genannte „Hooks“ eingebaut. Diese werden sowohl vor (Pre_)
als auch nach (Post_) dem Abarbeiten des ursprünglichen Codes ausgeführt.
Die „Pre_“-Aufrufe reagieren auf einen boolschen Rückgabewert, so dass
bei einem FALSE als Return-Value der ursprüngliche Code nicht abgearbeitet
wird.
Außerdem gibt es noch 10 frei verwendbare Callout-Funktionsaufrufe,
die ein jeder Entwickler pro Modul u. Maske zur Verfügung hat und beliebig
einbauen kann.
Hinweis
Die Rechte für diese Funktion werden im Inst-Modul
-> Benutzerrechte -> Desktop vergeben.
Hinweis
Der Editor wird innerhalb der Module per „Strg
+ Shift + Doppelklick rechte Maustaste“ auf eine freie Fläche für
das jeweilige Fenster aufgerufen.
Kommt es bei der Ausführung von einem Callout-Skript zu einem Fehler, so wird dieser in einer Messagebox ausgegeben:

In der Fehlermeldung werden die Modulnummer, der Dialogname und der Hook genannt, um den Fehler im Skript schnell beseitigen zu können.
Wichtig:
Skript-Fehler im Applikationsserver werden dort in die Ereignisausgabe geschrieben. Sowird verhindert, dass der Applikationsserver durch eine aufgehende Fehlermeldung an der Ausführung nicht mit der Fehlermeldung zusammenhängender Aufgaben gehindert wird.
Funktionen Pre- bzw. PostCallout
Die Callout-Funktionen befinden sich in der neuen APD namens "APCallout.apd".
Hier kann man die beiden Funktionen "PreCallout(...)" und "PostCallout(...)"
benutzen. Beide haben folgende Aufrufparameter:
-
nModul:
Nummer des aufrufenden Moduls
-
sUser:
aktuell angemeldeter Benutzer
-
sWindow:
Name des Parent-Window (z.B. frmMain)
-
nAktion:
Konstante der auszuführenden Aktion (z.B. nCALLOUT_OK)
-
sContext:
Exekution Kontext, um per SalCompileAndEvaluate()
aus der APD auf Variablen, Datenfelder, etc. des aufrufenden Moduls zugreifen
zu können
Aufrufbeispiel:
If PreCallout( nModul, SqlUser, GetItemNameX(hWndForm),
nCALLOUT_CREATE, SalContextCurrent () )
bzw.
If PostCallout( nModul, SqlUser, GetItemNameX(hWndForm),
nCALLOUT_CREATE, SalContextCurrent () )
Funktion FreeAktionCallout
Diese Callout-Funktion befindet sich in der APD names „APCallout.apd“.
Mit ihr kann man die 10 frei verfügbaren (pro Modul u. Maske) Hooks ausführen.
Aufrufbeispiel:
If not FreeAktionCallout ( nModul, SqlUser,
GetItemNameX(hWndForm), nCALLOUT_AKTION05, SalContextCurrent() )
Return FALSE
Dieser Aufruf führt das Script „On_Aktion05“ aus, welches für das aktuelle
Modul und das aktuelle Fenster hinterlegt ist und dem eingeloggten Benutzer
(SqlUser) zugewiesen wurde.
Es stehen die Konstanten „nCALLOUT_AKTION01“ bis „nCALLOUT_AKTION10“
zur Verfügung und können gemäß obigem Beispiel an beliebiger Stelle durch
den Entwickler in „seinen“ Module verwendet und
dokumentiert werden.
Funktion GetAndExecuteScriptFromDB¶
Diese Funktion wird in der Regel nur innerhalb der APCallout.apd verwendet.
Mit ihr kann man ein Script aus der Datenbank laden und ausführen. Allerdings
könnte man diese Funktion auch an einer beliebigen Stelle im Code einbauen
und somit z.B. ein Script ausführen, dass NICHT über den Script-Editor
in die Datenbank gespeichert wurde.
Die Funktion hat folgende Aufrufparameter:
-
nModul:
Nummer des aufrufenden Moduls
-
sUser:
aktuell angemeldeter Benutzer
-
sWindow:
Name des Parent-Window (z.B. frmMain)
-
sAktion:
auszuführende Aktion (z.B. ‚Pre_Ok’), s. a. alle Aktionen in Kapitel 2.1
-
sContext:
Exekution Kontext, um per SalCompileAndEvaluate() aus der APD auf Variablen,
Datenfelder, etc. des aufrufenden Moduls zugreifen zu können
Aufrufbeispiel:
If not GetAndExecuteScriptFromDB( nModul,
SqlUser, ‘frmMain’, 'Post_Ok', SalContextCurrent() )
Return FALSE
oder
GetAndExecuteScriptFromDB( nModul, SqlUser,
GetItemNameX(hWndForm), 'Post_Ok', SalContextCurrent ()
Beschreibung des Fensters:

Groupbox „Callout-Script“
Durch Auswahl der Combobox „bei Aktion“ wird das jeweilige Script zur
Bearbeitung in den Editor geladen. Außerdem werden die Benutzerrechte
entsprechend angezeigt.
In der Combobox sind folgende Einträge vorhanden:
-
„Pre_Ok“: wird
vor dem Drücken des OK-Buttons ausgeführt
-
„Pre_Apply“:
wird vor dem Drücken des Übernehmen-Buttons ausgeführt
-
„Pre_Cancel“:
wird vor dem Drücken des Abbrechen-Buttons ausgeführt
-
„Pre_Create“:
wird vor dem Erzeugen des Fensters ausgeführt
-
„Pre_Destroy“:
wird vor dem Schließen des Fensters ausgeführt
-
„Pre_Load”:
kann vor dem Laden von Daten ausgeführt werden (muss individuell implementiert
werden)
-
„Pre_Delete”:
kann vor dem Löschen von Daten ausgeführt werden (muss individuell implementiert
werden)
-
„Post_Ok”: wird
nach dem Drücken des OK-Buttons ausgeführt
-
„Post _Apply“:
wird nach dem Drücken des Übernehmen-Buttons ausgeführt
-
„Post _Cancel“:
wird nach dem Drücken des Abbrechen-Buttons ausgeführt
-
„Post _Create“:
wird nach dem Erzeugen des Fensters ausgeführt
-
„Post _Destroy“:
wird nach dem Schließen des Fensters ausgeführt
-
„Post _Load”:
kann nach dem Laden von Daten ausgeführt werden (muss individuell implementiert
werden)
-
„Post _Delete”:
kann nach dem Löschen von Daten ausgeführt werden (muss individuell implementiert
werden)
-
„On_Aktion01”:
– “On_Aktion10” Scripte, die jeder Entwickler frei in seinen Masken verwenden
kann.
Mit Hilfe der Combobox „Formatierung“
kann man das geladene Script automatisch formatieren. Dabei werden die
Zeilen eingerückt, sowie einzelnen Schlüsselwörter (wie If, then …) werden
je nach Auswahl entsprechend formatiert.
Der Button „Check Code“ überprüft
die Syntax des Skriptes. Dabei wird keine vollständige Lauffähigkeit des
Skriptes überprüft, sondern lediglich, ob alle verwendeten Variablen deklariert
wurden und z.B. Schleifen- bzw. If-Anweisungen korrekt sind.
Groupbox „Berechtigung für unten ausgewähltes Script“
Für jedes Script muss für die einzelnen Benutzer die Berechtigung vergeben
werden. Die Button ►u. ◄verschieben nur die markierten
Benutzer ins jeweils andere Auswahlfeld, während die Button ►►u.
◄◄
ALLE Einträge eines Auswahlfeldes verschieben, d.h. man kann festlegen,
ob ein Script für einen Benutzer ausgeführt werden soll oder nicht.
ACHTUNG:
Das bedeutet NICHT,
dass man für ein und dieselbe Aktion für unterschiedliche Benutzer unterschiedliche
Scripte hinterlegen kann. Das geht leider nicht. Hier müsste man dann
im Script selber über eine If-Abfrage pro Benutzer verschiedene Zweige
durchlaufen.
Groupbox „XML-Im/Export
Über die Button Import bzw. Export kann man die Scripte im XML-Format
im- bzw. exportieren. Setzt man die Checkbox „alle Masken des aktuellen
Moduls ex-/importieren, dann werden ALLE Scripte des aktuellen Moduls
ex- bzw. importiert. Ist das Flag nicht gesetzt, gilt der Ex-/Import nur
für die Scripte der Maske, aus der der Editor gestartet wurde.
Beim Import werden nur die Scripte in der Datenbank gelöscht bzw. überschrieben,
die sich in der zu importierenden XML-Datei befinden.
Die Berechtigungen werden NICHT mit im-/exportiert. D.h. sie müssen
nach einem Import manuell neu vergeben
werden.
Beim Export erschient nach dem Klick auf den Button folgende Dialog.
Hier kann man eine Dateinamen angeben und ein Verzeichnis auswählen, in
das die Datei exportiert werden soll.

Hinweis:
Beim Import erscheint der gleiche Dialog, nur dass dort nicht „Speichern“, sondern „Öffnen“
auf dem oberen Button steht und man eine XML-Datei auswählen muss, die
man importieren möchte.
ACHTUNG:
Man kann jeweils nur XML-Dateien für das
aktuelle Modul importieren. XML-Dateien, die aus anderen Modulen exportiert
wurden, lassen sich nicht importieren und es erscheint eine Fehlermeldung.
Debuggen
Unter dem Editor befinde sich die drei Button, mit denen man im Einzelschrittmodus
das Script laufen lassen kann:

Start
des Debugging

Stop
des Debugging

Zeile
ausführen und zur nächsten springen
Skripting
unter eEvolution® 6
-
Das
"alte" Skripting in SQLWindows-Syntax funktioniert
weiter.
-
Es
ist jetzt auch C#-Syntax möglich.
Features
-
"normales" C#-Skripting
-
Skripting im Appserver
-
Einbinden von .NET-Assemblies
zur Laufzeit
Bei C#-Skripting muss eine spezielle Form verwendet werden:
#C#
using System.Windows.Forms;
{
//fast beliebiger C#-Code, mit folgenden Einschränkungen:
//keine lokalen Methoden oder Klassen
//keine lokalen usings
//kein ternärer Operator ( ? : )
//keine lokalen Vars als Bindevars in SQL-Stmts.
//...evtl. noch einige Dinge…
}
Mit der Syntax Scripting.LoadAssembly(„meine.dll“);
können zur Laufzeit eigene Assemblies eingebunden werden.
Vorteile:
-
Wirklich freies Programmieren
-
Einbinden von eEvolution®-Standardcode als Binärverweis
-
die Performance gegenüber normalem Skripting ist etwa
4-fach besser!
Skripting unter eEvolution® 5
Variablen
Variablen müssen vor dem eigentlichen Script-Code deklariert werden.
Es werden derzeit folgende Variablen-Typen unterstützt:
-
Number
-
String
-
DateTime
-
Sql Handle
-
Window Handle
-
Variant
-
Boolean
-
File Handle
Innerhalb des Scripts wird mittels vorangestelltem # auf die einzelnen
Variablen zugegriffen.
Beispiel:
; ******* Variablen ****************
String: sHelp
Sql Handle: hSqlMy
Number: nFetch
; ******* Code
****************
SqlConnect(#hSqlMy)
If SqlPrepareAndExecute( #hSqlMy, 'select
kdnr from tkdauf into :#sHelp where lfdnr = 1')
SqlFetchNext(#hSqlMy, #nFetch)
Endif
Set frmMain.dfsAufNr = #sHelp
SqlDisconnect(#hSqlMy)
; ******* Ende
****************
Bedingungen, Schleifen
If ... [Else] ... Endif
Eine If-Bedingung kann in zwei Arten eingesetzt
werden. Und zwar mit oder ohne "Else". Sie muss aber immer mit
einem "Endif" abgeschlossen werden.
Beispiele:
If #nID > 10
SalMessageBox('nID
ist größer 10', 'Meldung', MB_Ok)
Endif
If #nID > 10
SalMessageBox('nID
ist größer 10', 'Meldung', MB_Ok)
Else
SalMessageBox('nID
ist kleiner/gleich 10', 'Meldung', MB_Ok)
Endif
While ... Loop
Beispiel:
Number: nID
Set #nID = 1
While #nID < 10
SalMessageBox(SalNumberToStrX(#nID,
0), 'Meldung', MB_Ok)
Set #nID
= #nID + 1
Loop
For ... [Step] ... Next
Die For ...Next Schleife kann in zwei Arten
eingesetzt werden. Und zwar mit einer Angabe eines "Steps",
oder ohne diese Angabe. Setzt man sie ohne die Angabe ein, so wird die
Zählvariable pro Schleifen-Durchgang um 1 erhöht.
Beispiele:
Number: nID
For #nID = 1 to 10
SalMessageBox(SalNumberToStrX(#nID,
0), 'Meldung', MB_Ok)
Next
For #nID = 1 to 10 Step 2
SalMessageBox(SalNumberToStrX(#nID,
0), 'Meldung', MB_Ok)
Next
Return-Wert
Ein Script kann einen boolschen Wert (true/false) als Rückgabewert haben.
Dazu wird das Steuerwort „Return“ mit nachfolgendem boolschen Ausdruck
verwendet.
Wird nicht explizit ein „Return“ angegeben, wird bei fehlerfreier Verarbeitung
de Scripts ein „Return TRUE“ angenommen.
Beispiele:
Number: nID
For #nID = 1 to 10
If #nID
> 7
Return
FALSE
Endif
Next
If frmMain.dfnAufNr != NUMBER_Null
Return TRUE
Else
Return FALSE
Endif