Status:beta , nicht im produktiv Systemen verwenden!
ESDK App basierend auf GroovyFO
GroovyFO ist der Versuch das gute aus JFOP und Standard FO des abas-ERP zu kombinieren. GroovyFO ermöglicht es, wie bei FOP gewohnt, einfach Programme im abas selbst zu schreiben (als Text anlegen). Es können nun jedoch ohne zusätzliches kompilieren und redeployen JFOP's in Form von GroovyFO-Scripten ausgeführt werden.
einige Vorteile:
- automatische Typkonvertierung,beim Zugriff auf abas Variablen (bsp.: I3 -> Integer)
- Auch Umgang mit abas Datum möglich
M.datum = M.datum +1
, einen Tag weiterM.datum = M.datum -1
, einen Tag zurückM.datum = M.datum & 1
M.datum = M.datum % 1
- Auch Umgang mit abas Datum möglich
- Syntax an Standard FO angelehnt
- Wertzuweisung
M.datum = M.datum +1
- Wertzuweisung
- Zugriff mittels Dachoperator
H.platz^id
- Kontrollstrukturen aus Java
for
,while
,if
,switch
, Methoden, Klassen ...
- Syntax vereinfachung gegenüber JFOP
- kein Redeployen nach Änderungen an GroovyFO-Scripten nötig, änderungen an den Scripten sind sofort wirksam
- diverse Helferklassen für Selektion, Infosystemaufrufe, Charts usw.
- Ablaufsteuerung durch die Methoden
always
undonerror
Die Klasse de.finetech.groovy.ScriptExecutor
ist ein JFOP welches als ersten Parameter eine Textdatei (Groovyscript) erwartet. Dieses wird dann auf Basis der Script-Klasse de.finetech.groovy.AbasBaseScript
initialisiert. Diese Klasse kapselt JFOP-Funktionen um so Schreibarbeit sparen zu können. Weiterhin besteht durch die Verwendung von Groovy die Möglichkeit Kontrollstrukturen wie if-Anweisungen, Schleifen oder eben auch Klassen im Kontext eines FOP zu verwenden. Dadurch das bei jeden Aufruf des ScriptExecuters die Groovy Datei neu interpretiert wird, können Änderungen an dieser Datei ohne erneutes redeployen des JFOP-Server wirksam werden. Dieses Verhalten ist ähnlich dem Verhalten von FOP's.
- aktuellsten esdk-installer herunterladen und entpacken
wget https://bintray.com/abas/abas-essentials-sdk/download_file?file_path=de/abas/esdk/installer/0.12.29/installer-0.12.29.zip -O installer-0.12.29.zip
- aktuellen Release von groovyfo herunterladen (standaloneapp)
- installieren
./esdk-app-installer-0.12.29/bin/esdk-app-installer -a groovyfo-0.5.5-standalone-app.jar
Aufruf eines GroovyFO aus der Kommandoübersicht
<Text>java:GroovyFO@grvfo GROOVYSCRIPT_WELCHES_AUSGEFÜHRT_WERDEN_SOLL<zeigen>
oder in einem Infosystemen hinterlegen
java:GroovyFO@grvfo GROOVYSCRIPT_WELCHES_AUSGEFÜHRT_WERDEN_SOLL
Text ow1/GROOVYFO.TEST wie folgt anlegen.
/*
* Beispiel GroovyFO holt die ersten 100 Teile aus der DB
* und gibt deren Suchwort aus
* ow1/GROOVYFO.TEST
*/
for(def i=0; i<100 && hole(Teil); i++){
// Ausgabe auf Konsole
println ( h.such )
}
Zum testen Kommando aufrufen mit
<Text>java:GroovyFO@grvfo ow1/GROOVYFO.TEST<zeigen>
JFOP | FOP | groovyfo dt | engl |
---|---|---|---|
EKS.Hvar(...) | H|von | h.von | |
EKS.Mvar(...) | M|von | m.von | |
EKS.hole(...) | .hole ... | hole(...) hole(String db, SelectBuilder builder) hole(String db, String selektion) |
select(...) select(String db, SelectBuilder builder) select(String db, String selektion) |
EKS.lade(...) | .lade 1 ... | lade(...) lade(int puffer, String db, SelectBuilder builder) lade(int puffer, String db, String selektion) |
load(...) load(int puffer, String db, SelectBuilder builder) load(int puffer, String db, String selektion) |
EKS.formel(...) | .fo var = ... | fo(String variable, wert) | |
EKS.getValue(puffer, varName) | l1|von | l1.von ... l2.von ... usw... |
|
EKS.println(...) | println(...) | ||
EKS.box(...,...) | .box ... | box(...,...) | |
EKS.eingabe(...) | .eingabe ... | ein(...) | in(...) |
EKS.bringe(...) | .bringe ... | bringe(...) | rewrite(...) |
EKS.mache(...) | .mache ... | mache(...) | make() |
EKS.mache("maske zeile +O") | .mache maske zeile +O | plusZeile() | addRow() |
EKS.bringe("maske zeile -O") | .mache maske zeile -O | entfZeile() | removeRow() |
EKS.Dvar(...) | D|von | d.von | |
G|mehr | mehr | success or more | |
... | ... | ... | ... |
In jedem GroovyFO gibt es die Möglichkeit die Methoden onerror(Exception ex)
und always()
zu überschreiben.
onerror
wird immer dann ausgeführt, solange sich das GroovyFO übersetzen lässt und wenn eine unbehandelte Ausnahme im Code des GroovyFO auftritt.
always
wird, solange sich das GroovyFO übersetzen lässt, immer am Ende ausgeführt.
def onerror(def ex){
// was ist zutun wenn ein Fehler beim ausführen des GroovyFO auftritt?
}
def always(){
// am ende des GroovyFO, was soll immer gemacht werden?
// diese Methode wird auch nach einem Fehler ausgeführt
}
import groovyx.net.http.FromServer
import static java.nio.charset.StandardCharsets.UTF_8
// REST Beispiel für ABAS-BPM
def httpBin = HttpBuilder.configure {
request.uri = 'http://camundaserver:8088'
request.auth.basic 'name', 'passwort'
request.charset = UTF_8
request.contentType = "application/json"
}
//Prozess "Test" starten
response = httpBin.post {
request.uri.path = '/engine-rest/process-definition/key/Test/start'
request.body = [variables:[
test:[value:"Wert",type:"String"],
]]
response.success { FromServer fs, Object body ->
println 'ok'
}
response.failure { FromServer fs, Object body ->
println 'not ok'+body
}
}
Der SelectionBuilder ist eine Hilfsklasse um einfach Selektion definieren zu können.
// Artikel von a bis b
def selection1 = SelectionBuilder().normal("such2","A","B").database(2).group(1)
// im Matchcode auf den Namen in Bediensprache
def selection2 = SelectionBuilder().matchcode("namebspr","Schif*fahrt")
...
Die Klasse Infosystemcall ruft mittels edpinfosys.sh Infosystem auf und stellt das Ergebnis des Aufrufes in Variablen bereit
def result = Infosystemcall.build("VKZENTRALE")
.addTableOutputField("ttrans")
.addTableOutputField("tdate")
.addTableOutputField("tkuli")
.addTableOutputField("tklname")
.addTableOutputField("teprice")
.setHeadParameter("vktyp", "Rechnung")
.setHeadParameter("ablageart", "abgelegt")
.setHeadParameter("ynurger", "ja")
.setHeadParameter("datef", "-30")
.setHeadParameter("datet", ".")
.setHeadParameter("bstart", "1")
.execute()
for(def row: result.table){
println row.ttrans
println row.tdate
println row.tkuli
println row.tklname
println row.teprice
}
Eine Klasse zum erzeugen von Charts
// Liniendiagramm erzeugen
ChartGenerator gen = ChartGenerator.create(ChartType.LINES);
// Titel setzen
gen.setChartTitle("Hello World");
gen.setMarkerx("first", "second", "third", "fourth", "fifth")
gen.setAnglex(45)
// neue Datenserie definieren
DataSeries series = new DataSeries();
series.setTitle("Series 1");
series.addValue(Value.create(1));
series.addValue(Value.create(2));
series.addValue(Value.create(3));
series.addValue(Value.create(4));
series.addValue(Value.create(5));
// weiter Serie
DataSeries series2 = new DataSeries();
series2.setTitle("Series 2");
series2.addValue(Value.create(5));
series2.addValue(Value.create(4));
series2.addValue(Value.create(3));
series2.addValue(Value.create(2));
series2.addValue(Value.create(1));
gen.setOptions(true)
// neue Datenserie dem Chart bekannt machen
gen.addDataseries(series);
gen.addDataseries(series2);
// eigentliche generien des Charts im abas
// ychart ist im Kopfbereich ein Chartfeld
gen.generate("ychart");
Ergebnis: