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.
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]