Batchinput

From Sapwiki

Jump to: navigation, search

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
Persönliche Werkzeuge