Anwendung / Praxis

redo (GetBo mit anschliessendem redo)

Aufbau

# 1. Service definieren. Es sollen drei Adressen gelesen werden.
«XSER(MeinService:GetBo)»
«XSER(MeinService:args=Addr,Aarpol,ne,2,3,,,)»
#
# 2. Rückgabe definieren.
«XSER(MeinService:addArg=Addr.LastName,Addr.City)»
#
# 3. Service ausführen
«XSER(MeinService:execute>MeinServiceRes)\A»
#
# 4. Ausgeben des Ortes von der Zeile 3 des Resultats
Ort von Zeile drei des Resultats: «XRES(MeinServiceRes:Addr.City,3)\A»
#
# 5. Ausführen des "redo". Es werden erneut drei Adressen gelesen.
#    Achtung! Der "redo" wird auf dem Resultat ausgeführt.
«Redo(«XRES(MeinServiceRes:redo,n,,3)\A»)»
#
# 6. Ausgeben des Ortes von der Zeile 2 des neuen Resultates
Ort von Zeile zwei des neuen Resultats: «XRES(MeinServiceRes:Addr.City,2)\A»
Mit einem redo können also performanceoptimierte Listen programmiert werden. Man kann z.B. 100 BO's lesen, diese verarbeiten und dann wieder 100 BO's lesen. Die Auslastung des PC auf welchem das Script läuft wird weniger gross und es wird nicht dauernd auf den DB-Server zugegriffen.
Nachfolgend ein Beispiel eines redo in dem der Unterschied mit aktivem/passivem Parameter StartPositionIstOben aufgezeigt werden soll.

Beispiel 1

Redo als List ersatz in F-Script:
# List über Objekte
# Mit ne 10 Objekte über Index 1 holen
«XSER(getObjItem:GetBo)»
«XSER(getObjItem:addArg=ObjItem)»
«XSER(getObjItem:addArg=1)»
«XSER(getObjItem:addArg=ne)»
«XSER(getObjItem:addArg=1)»
«XSER(getObjItem:addArg=10)»
«XSER(getObjItem:addArg=)»
«XSER(getObjItem:addArg=)»
«XSER(getObjItem:addArg=ObjItem.Number)»
«nXSER(getObjItem:execute>getObjItemRes)\A»
#
# Mit Repeat/Loop die 10er Gruppen listen die der Redo zurückgibt
«NO(3,NULL)»
«REPEAT(3)»
«nNO(3)»
# Zweiter Repeat Loop um die einzelnen Segmente, Objekte auszulesen
«NO(2,NULL)»
«nz~NO(3,0)=1\N»«nNO(2)»
«REPEAT(4)»
«nNO(2)»«nX(FINISH=)»
# Prüfe ob noch weitere Objekte enthalten sind
«nz~XRES(getObjItemRes:ObjItem.Number,«NO(2,0)»)\I»«X(FINISH=1)»«GOTO(# KEIN-INHALT-OBJ)»
«zOBJ-OBJ-ACTIVE(«XRES(getObjItemRes:ObjItem.Number,«NO(2,0)»)»)\I»
Ausgabe Objekt: «OBJ-ID-NR»
#
# KEIN-INHALT-OBJ
«nzNO(2,0)<10\N»«LOOP(4)»
#
# Mit redo weitere 10 Datensätze auslesen. Dies endet, wenn die X-Variable FINISH inhalt hat.
«nXRES(getObjItemRes:redo,ne,,10)\A»
# So lange Loopen bis X(FINISH) auf 1 gesetzt ist und es keine Objekte mehr hat.
«nz~X(FINISH)\I»«LOOP(3)»
/ 

Beispiel 2

Ausgangslage:
Zwölf Adressen, die in folgender Reihenfolge stehen.
aid02.jpg
Nun wird im Script mit folgendem Code bei der Adresse mit Name "Abexim" aufgesetzt.
«XSER(MeinService:GetBo)»
«XSER(MeinService:args=Addr,Abexim,ne,2,3,,,)»
#
# Rückgabe definieren und Service ausführen.
«XSER(MeinService:addArg=Addr.LastName,Addr.City)»
«XSER(MeinService:execute>MeinServiceRes)\A»
#
# Ausgeben des Ortes von den Zeilen 1 - 3 des Resultates
# Zeile 4 wird leer ausgegeben um zu veranschaulichen, dass tatsächlich nur drei BO's gelesen wurden.
«Result-Objekt erste Zeile(«XRES(MeinServiceRes:Addr.City,1)\A»)»
«Result-Objekt zweite Zeile(«XRES(MeinServiceRes:Addr.City,2)\A»)»
«Result-Objekt dritte Zeile(«XRES(MeinServiceRes:Addr.City,3)\A»)»
«Result-Objekt vierte Zeile(«XRES(MeinServiceRes:Addr.City,4)\A»)» 

Ausgabe

Die Ausgabe des Ortes ergibt dann folgende Resultate:
Madetswil
Volketswil
Emmenbrücke
[leer]

Beispiel 3

Nun wird ein redo durchgeführt. Der Parameter StartPositionIstOben ist dabei passiv. (0 oder leer)
# So wird schön beim nächsten BO aufgesetzt
«Redo(«XRES(MeinServiceRes:redo,n,,3)\A»)»
#
# Ausgeben des Ortes von den Zeilen 1 - 3 des neuen Resultates
# Zeile 4 wird leer ausgegeben um zu veranschaulichen, dass tatsächlich nur drei BO's gelesen wurden.
«Result-Objekt redo erste Zeile(«XRES(MeinServiceRes:Addr.City,1)\A»)»
«Result-Objekt redo zweite Zeile(«XRES(MeinServiceRes:Addr.City,2)\A»)»
«Result-Objekt redo dritte Zeile(«XRES(MeinServiceRes:Addr.City,3)\A»)»
«Result-Objekt redo vierte Zeile(«XRES(MeinServiceRes:Addr.City,4)\A»)» 

Ausgabe

Die Ausgabe des Ortes ergibt dann folgende Resultate:
Basel
Bern
Hinwil
[leer]

Beispiel 4

Wäre der redo mit aktivem Parameter StartPositionIstOben ausgeführt worden, hätte das so ausgesehen:
# Setzt noch mal beim ersten BO des vorherigen Resultates auf und bringt die drei nächsten BOs ab dort.
«Redo(«XRES(MeinServiceRes:redo,n,1,3)\A»)»
#
# Ausgeben des Ortes von den Zeilen 1 - 3 des neuen Resultates
# Zeile 4 wir leer ausgegeben um zu veranschaulichen, dass tatsächlich nur drei BO's gelesen wurden.
«Result-Objekt redo erste Zeile(«XRES(MeinServiceRes:Addr.City,1)\A»)»
«Result-Objekt redo zweite Zeile(«XRES(MeinServiceRes:Addr.City,2)\A»)»
«Result-Objekt redo dritte Zeile(«XRES(MeinServiceRes:Addr.City,3)\A»)»
«Result-Objekt redo vierte Zeile(«XRES(MeinServiceRes:Addr.City,4)\A»)» 

Ausgabe

Die Ausgabe des Ortes ergibt dann folgende Resultate:
Volketswil
Emmenbrücke
Basel
[leer]