Beispiel: Werte in SAP-Spoollisten vergleichen
SAP-Spoollisten zeigen Druckaufträge an, die noch nicht an ein Gerät übertragen wurden. Die zum Drucken oder zur Ausgabe auf einem Gerät benötigten Daten werden bis sie aufgerufen werden vorübergehend in einem Zwischenformat gespeichert. Die Werte solcher Spool-Aufträge in den jeweiligen Listen können mittels -SAP-Jobs verglichen werden.
Spool-Auftragswerte vergleichen - Workflow
Erstellen Sie einen Workflow mit zwei SAP-Jobobjekten. Jeder Job erzeugt eine Spoolliste. Ein drittes Jobobjekt wird dazu verwendet, die Zahlen der Spool-Listenwerte zu vergleichen.
Sind beide Jobs abgeschlossen, werden die Werte aus den Spool-Listen extrahiert und an den dritten Job im Workflow übergeben.
Der Status des Workflows wird gemäß dem Vergleich festgelegt:
Zahlen sind gleich ==> ENDED_OK
Zahlen sind ungleich ==> ENDED_NOT_OK
Spool-Listeninhalt in den Job-Report übertragen
Nachfolgend finden Sie ein Beispiel für einen der beiden SAP-Jobs im Workflow, die jeweils aus zwei Schritten bestehen:
Ein Beispiel-Scripting auf der Seite Prozess ist unten gezeigt.
R3 ACTIVATE_REPORT REPORT="Z_LIST_TEST"
R3_GET_JOB_SPOOL FILE="(REPORT,REP)"
Im ersten Schritt wird das Programm ausgeführt und im zweiten Schritt wird der Inhalt der Spoolliste dem Report hinzugefügt.
Der Job-Report sieht so aus:
Er enthält das Job-Protokoll von SAP gefolgt von der Spoolliste.
Werte extrahieren
Job 1
Um den Wert aus der Spoolliste zu extrahieren, wird folgendes Automation Engine-Script auf der Seite Post-Prozess des Jobs verwendet.
Dieses Script wird nach Beendigung des Jobs ausgeführt. Es verarbeitet den Report und extrahiert die Werte:
Ein Beispiel-Script von der Seite Post-Prozess ist unten gezeigt.
:set &HND* = PREP_PROCESS_REPORT("JOBS', ,"REP", "*|*")
:process &HNO#
:set &RET# = GET_PROCESS_LINE(&HND#)
:endprocess
:set &LEN* = STR_LNG(&RET#)
:SET &LEN* = &LEN# - 1
:SET &RET* = SUBSTR(&RET#, 1, &LEN*)
:SET &RET* = STR_TRIM(&RET*)
:SET &POS* = STR_FINO_REVERSE(&RET*, ' ')
:SET &POS* = &POS* + 1
:SET &RET* = SUBSTR(&RET#, &POS*)
:PSET &JOB1_SUMME# = &RET#
Die Funktion PREP_PROCESS_REPORT filtert alle Zeilen, die ein "|"-Zeichen enthalten.
Es werden dabei nur diese Werte zurückgegeben:
| USD 123.456.789,01 | 1.234.567,89 | |
| BEF 12.345.678.901 | 123.456.789 | |
| KUD 123.456.789,01 | 365.413.243,87 | |
- Die letzte Zeile wird dann in der Variablen &RET# gespeichert
- Mit STR_LNG kann die Länge der Zeile ermittelt werden. Mithilfe der Funktion SUBSTR kann dann das nachgestellte "|" entfernt werden. Mit STR_TRIM werden die nachfolgenden Leerzeichen entfernt.
- Das Ergebnis wird in der Variablen &RET# gespeichert und lautet jetzt:
| KUD 123.456.789,01 | 365.413.243,87 |
- Die Funktion STR_FIND_REVERSE ruft die Position des letzten Leerzeichens in dieser Zeile ab.
- Schließlich wird die Funktion SUBSTR verwendet, um "365.413.243,87" zu erhalten und in der Variablen &RET# zu speichern.
Mit PSET wird die Objektvariable &JOB1_SUMME# des Workflows aktualisiert.
Der Workflow enthält außerdem eine zweite Variable, &JOB2_SUMME#, die vom zweiten SAP-Job gesetzt wird.
Job 2
Der Report des zweiten Jobs sieht so aus:
Auch in diesem Fall wird ein Automation Engine-Script verwendet, um den Wert zu erhalten:
Ein Beispiel-Script von der Seite Post-Prozess ist unten gezeigt.
:set &rowFilter# = 'SQ'
:set &column* = 5
:set &HND# = PREP_PROCESS_REPORT("JOBS", , "REP", "&rowFilter#*", "COL=DELIMITER", "DELINITER=1*|*))
:process &HND#
:set &RET# = GET_PROCESS_LINE(&HND#,&column#)
:endprocess
:set &RET* = STR_TRIM(&RET#)
:pset &JOB2_SUMME# = &ret#
Dieses Script filtert nach allen Zeilen, die das Wort "SQ" enthalten. Das Ergebnis ist eine Zeile:
|SQ| 26|28.02.1995|365.413.243,86 | |DC-10-10| 380 | 2 |1.684,00 | 0 | 0 | 0 | 0 |
Das Zeichen "|" ist als Trennzeichen für Spalten definiert. Daher kann der Wert 5 (Variable &column#) direkt verwendet werden, um 365.413.243,86 aus dem Report zu erhalten.
STR_TRIM wird verwendet, um Leerzeichen zu entfernen. Das Ergebnis wird als &JOB2_SUMME#veröffentlicht
Jobs vergleichen
Beide Jobs müssen beendet sein, bevor der Vergleichsjob gestartet werden kann:
Er hat Zugriff auf die Variablen &JOB1_SUMME# und &JOB2_SUMME#.
Hinweis: Bei diesem Job ist auf der Seite Attribute die Einstellung Aufgabe generieren zur: Laufzeit aktiviert.
In diesem Beispiel startet er ein SAP-Programm mit Parametern, die vom Ergebnis des Vergleichs abhängen.
Ein Beispiel-Scripting auf der Seite Prozess ist unten gezeigt.
:if &JOB1_SUMME# <> &JOB2_SUMME#
R3_SET_SELECT_OPTION SELNAME="TEXT1",KIND="P",LOW="Job1=&JOB1_SUMME#"
R3_SET_SELECT_OPTION SELNAME="TEXT2",KIND="P",LOW="Job2=&JOB2_SUMME#"
R3_SET_SELECT_OPTION SELNAME="TEXT3",KIND="P",LOW="Summierungen sind unterschiedlich."
R3 ACTIVATE_REPORT REPORT="Z_INFO"
:else
R3_SET_SELECT_OPTION SELNAME="TEXT1",KIND="P",LOW="Summierungen sind gleich."
R3_SET_SELECT_OPTION SELNAME="SUCCESS",KIND="P",LOW="X"
R3_ACTIVATE_REPORT REPORT="Z_INFO"
:endif
Das einfache Programm Z_INFO verwendet MESSAGE des Typs I oder E, je nach SUCCESS-Parameter:
REPORT Z_INFO.
parameter text1 type string.
parameter text2 type string.
parameter text3 type string.
parameter success type c.
if success is initial.
MESSAGE I002(SY) WITH text1.
MESSAGE I002(SY) WITH text2.
MESSAGE E002(SY) WITH text3.
else.
MESSAGE I002(SY) WITH text1.
endif.
Der Workflow kann auf ENDED_NOT_OK gesetzt werden, wenn die Vergleichsjobs fehlschlagen:
Kommentare
Der spezielle Parameterwert (REPORT,REP) für den FILE-Parameter im Befehl R3_GET_JOB_SPOOL ist nicht dokumentiert, existiert jedoch seit v9.
Normalerweise kann der Befehl R3_GET_JOB_SPOOL nur Dateien schreiben. Der SAP-Agent kann diese jedoch nicht lesen. Ein OS-Agent müsste die Werte mit PREP_PROCESS_FILE extrahieren und die alten Dateien löschen, wenn sie nicht mehr benötigt werden. Dies ist zwar möglich, jedoch komplexer als die hier beschriebene Lösung.