Batchinput
From Sapwiki
Mit Batch-Inputs (manchmal wird das Wort Batchinput auch zusammen geschrieben) lassen sich orginal SAP Masken per Programm füllen und ausführen. Man sollte darauf achten, daß im Batch-Input übergebene Werte linksbündig dargestellt werden, da es sonst zum Fehler "Laenge des Eingabewertes ist groesser als das Dynprofeld" kommt. Den Fehler vermeidet man, indem Mengen- und Wertfelder beim Batch-Input als CHAR-Felder übergeben werden. Dazu werden sie zuerst mit WRITE in ein entsprechendes CHAR-Feld, und von dort aus ins Dynpro-Feld übertragen.
Transaktionsrecorder
Mit der Transaktion SHDB lassen sich Transaktionen für einen Batch-Input aufzeichen
Abspielmodus
- A
- Alle Dynpros werden angezeigt.
- E
- Im Fehlerfalle wird das Dynpro angezeigt, auf dem der Fehler aufgetreten ist. Nach Korrektur des Fehlers wird die Aufzeichnung bis zum nächsten Fehler wieder ohne Dialog abgespielt.
- N
- Die Aufzeichnung wird ohne Dialog abgespielt.
Beispielcode
1: Deklaration der Tabellen/Variablen
*Tabellendefinition
Tables: t100.
* abzuspielende Batch-Input-Mappe
DATA: BEGIN OF bdcdata OCCURS 10.
INCLUDE STRUCTURE bdcdata.
DATA: END OF bdcdata.
* Tabelle mit Meldungen aus dem Batch-Input
data begin of bdcmsgcoll occurs 50.
include structure bdcmsgcoll.
data end of bdcmsgcoll.
2: Aufruf im Hauptprogramm
************************************************************************ * HAUPTPROGRAMM ************************************************************************ ... perform IW41_BUCHEN. perform Ereignisprotokoll_ausgeben. ...
3: Funktionen zum Füllen der Batch-Input-Tabelle
************************************************************************ * neues Bild im Batch-Input beginnen * ************************************************************************ FORM bdc_dynpro USING program dynpro. CLEAR bdcdata. bdcdata-program = program. bdcdata-dynpro = dynpro. bdcdata-dynbegin = 'X'. APPEND bdcdata. ENDFORM. "BDC_DYNPRO ************************************************************************ * Feld im Batch-Input einfügen * ************************************************************************ FORM bdc_field USING fnam fval. CLEAR bdcdata. bdcdata-fnam = fnam. bdcdata-fval = fval. APPEND bdcdata. ENDFORM. "BDC_FIELD
4: Füllen der Batch-Input-Tabelle mit konkreten Daten
*&---------------------------------------------------------------------*
*& Form iw41_buchen
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM IW41_BUCHEN .
DATA: SAV_ISDD(12) TYPE C,
SAV_BUDAT(12) TYPE C,
SAV_PERNR(4) TYPE C,
SAV_RUECK(8) TYPE C,
SAV_ISMNW(8) TYPE C.
*Konvertierung des Punktes zum Komma
write ZBUCH-ISMNW to SAV_ISMNW.
*Führende Nullen entfernen
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
INPUT = ZBUCH-PERNR
IMPORTING
OUTPUT = SAV_PERNR.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
INPUT = ZBUCH-RUECK
IMPORTING
OUTPUT = SAV_RUECK.
* Datum konvertieren
CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL'
EXPORTING
DATE_INTERNAL = ZBUCH-BUDAT
IMPORTING
DATE_EXTERNAL = SAV_BUDAT
EXCEPTIONS
DATE_INTERNAL_IS_INVALID = 1
OTHERS = 2.
*Fehlerbehandlung
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL'
EXPORTING
DATE_INTERNAL = ZBUCH-ISDD
IMPORTING
DATE_EXTERNAL = SAV_ISDD
EXCEPTIONS
DATE_INTERNAL_IS_INVALID = 1
OTHERS = 2.
*Fehlerbehandlung
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* --------------- Transaktion IW41 vorbereiten ------------------------
* die eingegebenen Werte stammen teilweise aus der internen
* Tabelle ZBUCH, das Füllen dieser Tabelle ist in diesem Beispiel nicht
* enthalten
CLEAR BDCDATA.
REFRESH BDCDATA.
PERFORM BDC_DYNPRO USING 'SAPLCORU' '3000'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'CORUF-RUECK'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=ENTR'.
PERFORM BDC_FIELD USING 'CORUF-RUECK' SAV_RUECK.
PERFORM BDC_FIELD USING 'CORUF-AUFNR' ''.
PERFORM BDC_DYNPRO USING 'SAPLCORU' '3200'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'AFRUD-LTXA1'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=BU'.
* PERFORM BDC_FIELD USING 'AFRUD-ARBPL' TWS1.
* PERFORM BDC_FIELD USING 'AFRUD-WERKS' MET.
PERFORM BDC_FIELD USING 'AFRUD-PERNR' SAV_PERNR.
PERFORM BDC_FIELD USING 'AFRUD-ISMNW_2' SAV_ISMNW.
PERFORM BDC_FIELD USING 'AFRUD-ISMNU' ZBUCH-ISMNE.
* PERFORM BDC_FIELD USING 'AFRUD-LEARR' STGHT.
PERFORM BDC_FIELD USING 'AFRUD-BUDAT' SAV_BUDAT.
PERFORM BDC_FIELD USING 'AFRUD-ISDD' SAV_ISDD.
PERFORM BDC_FIELD USING 'AFRUD-LTXA1' ZBUCH-LTXA1.
* --------------- Transaktion IW41 ausführen ---------------------------
CLEAR BDCMSGCOLL.
REFRESH BDCMSGCOLL.
* Transaktion mit der Batch Input Mappe ohne Dialog abspielen
CALL TRANSACTION 'IW41' USING BDCDATA UPDATE 'S' MODE 'N'
MESSAGES INTO BDCMSGCOLL.
* sollten das Verbuchen nicht geklappt haben, ist an dieser Stelle SY-SUBRC = 4
* wurde die Verbuchung abgebrochen, oder hat sie funktioniert, so ist SY-SUBRC = 0
* diese beiden Fälle lassen sich nur anhand Nachrichten unterscheiden die in die Tabelle
* BDCMSGCOLL geschrieben wurden
ENDFORM. " iw41_buchen
5: Nachrichten ausgeben
************************************************************************
* FORM Ereignisprotokoll_ausgeben *
************************************************************************
form Ereignisprotokoll_ausgeben.
data: ftext(255) type c,
zmsgid type SY-MSGID,
zmsgnr type SY-MSGNO,
zmsgv1 type SY-MSGV1,
zmsgv2 type SY-MSGV2,
zmsgv3 type SY-MSGV3,
zmsgv4 type SY-MSGV4.
loop at bdcmsgcoll.
zmsgid = bdcmsgcoll-msgid.
zmsgnr = bdcmsgcoll-msgnr.
zmsgv1 = bdcmsgcoll-msgv1.
zmsgv2 = bdcmsgcoll-msgv2.
zmsgv3 = bdcmsgcoll-msgv3.
zmsgv4 = bdcmsgcoll-msgv4.
CALL FUNCTION 'CACS_CLOSE_TEXT_GET'
EXPORTING
I_LANGU = SY-LANGU
I_MSGID = zmsgid
I_MSGNO = zmsgnr
I_MSGV1 = zmsgv1
I_MSGV2 = zmsgv2
I_MSGV3 = zmsgv3
I_MSGV4 = zmsgv4
IMPORTING
E_MESSAGE_TEXT = ftext.
write: ftext.
new-line.
endloop.
endform. "Ereignisprotokoll_ausgeben

