Batch-Input

Aus SAP-Wiki
Wechseln zu: Navigation, Suche

Mittels Batch-Input kann ein Report oder Dialogprogramm mit den passenden Eingaben im Hintergrund (oder zum Testen im Vordergrund/hel)) ausgeführt werden. Die Variablen werden dem Batch-Input vom Rahmenprogramm mitgegeben.

Hier wird der Batch-Input am Beispiel der Transaktion VA03 (Kundenauftrag anzeigen) und die Batch-Input-Mappe am Beispiel der Transaktion FB01 (Anlage Buchhaltungbeleg) dargestellt.

CALL TRANSACTION 'VA03'
  USING lt_bdcdata             "Batch-Input Daten
    MODE lv_modus.             "A = Anzeige Hell, E = Einzelschritt nur bei Fehler
    UPDATE lv_update           "A = Asynchron, S = Synchron, ohne Angabe = Asynchron
    MESSAGES INTO lt_itab_msg. "Fehlertabelle

Programm, Felder und Transaktionscode für Batch-Input

Es gibt nur wenige notwendige Dinge, aus denen ein Batch-Input besteht

  • Name Programm und Dynpro-Nummer vom Einstiegsbildschirm
  • Namen und Feldwerte der zu füllenden Dynpro-Felder
  • OK-Codes, die einzelne Schritte im Batch-Input abschließen
  • Name vom ausführenden Transaktionscode

Aufzeichnung Batch-Input (Transaktion SHDB)

Die benötigten Objekte müssen nicht mühsam Feld für Feld mit der F1-Hilfe herausgefinden werden, sondern es lässt sich der Ablauf der Dypromasken einer Transaktion mit einem Batch-Input-Recorder aufzeichnen. Der Recorder lässt sich aus jeder SAP-Transaktion aus dem SAP-Menü aufrufen (oder Transaktionscode SHDB).

Batch-Input1.jpg


Es wird ein Name für die Aufzeichnung vergeben. Typischerweise nimmt man hier den Namen der Transaktion, die aufgezeichnet wird.

In der Einstiegsmaske muss der aufzuzeichnende Transaktionscode nicht eingetragen werden. Hier dient er der Selektion von bereits aufgezeichneten Batch-Inputs.

Batch-Input2.jpg


Der Transaktioncodes wird eingetragen und auf die Schaltfläche "Aufzeichnung starten" geklickt.

Batch-Input3.jpg


Der Recorder springt in die Anwendungstransaktion VA03 und der SAP-Prozess kann durchlaufen werden.

Batch-Input4.jpg


Batch-Input5.jpg


Batch-Input6b.jpg


Wenn man einen Schritt zurück geht (oder F3 drückt), wird die Aufzeichnung beendet und der Recorder zeigt die Aufzeichnung an. Dies ist dann die Grundlage für den Batch-Input. Hier sind alle nötigen Programmnamen, Dynpronummern, Feldnamen, Feldwerte und OK-Codes chronologisch aufgeführt.

Batch-Input7.jpg


Die letzten aufgezeichneten Schritte des Batch-Inputs kann man normalerweise löschen, da auch das Verlassen der Anwendung mit aufgezeichnet wird. Man erkennt es an den Funktionen Feldwert "=WB_BACK" oder "BACK" hinter dem Feldnamen BDC_OKCODE im in den Aufzeichnungsschritten.

Hier kann der Cursor auf die Zeile 11 mit dem Programmnamen gesetzt werden und dann auf "Zeile löschen" Button Entfernen.jpg klicken. Damit wird der gesamte Block mit den Zeilen 11 bis 15 gelöscht.

Batch-Input11.jpg

Parameter

Mode / Modus

Wenn ein Batch-Input entwickelt wird, wird das Coding in aller Regel nicht im ersten Entwurf perfekt sein.

Es hilft sich dann die Ausführung des Batch-Inputs Schritt für Schritt anzeigen zu lassen, um Fehler schneller zu finden. Dazu wird der MODE = 'A' gesetzt.

Der Batch-Input wird nun schrittweise durchlaufen und jeder Schritt muss hierbei mit ENTER bestätigt werden.

Data: lv_modus type c.

lv_modus = 'A'.

* Transaktion ausführen
  CALL TRANSACTION 'VA03'
    USING lt_bdcdata
     "E = Stoppen nur bei Error, A = Anzeige Hell (für Test), N = Anwendung wird durchlaufen, aber Fehler gespeichert in Fehlertabelle 
     MODE lv_modus
     MESSAGES INTO lt_itab_msg.  "Fehlertabelle

Insgesamt gibt es 4 mögliche Modi.

  • A = Ausführen im Vordergrund (Hell abspielen)
  • E = Ausführen im Hintergrund, aber Stoppen bei Fehler (dunkel abspielen, bei Fehler hell)
  • N = Ausführen im Hintergrund, sammeln Fehler in Fehlertabelle (dunkel abspielen), bei Break-Point Abbruch
  • P = Ausführen im Hintergrund, sammeln Fehler in Fehlertabelle (dunkel abspielen), bei Break-Point Sprung in Debugger

Update

Normalerweise wird ein Batch-Input asynchron ausgeführt. Die Ausführung des Batch-Inputs erfolgt also in einem separaten Workprozess. Manchmal wird das Rahmenprogramm jedoch auf das Ergebnis des Batch-Inputs angewiesen sein. Wenn z. B. Ein Beleg erzeugt wurde und die Belegnummer benötigt wird vom Rahmenprogramm.

Mögliche Updatestatus

  • A = Asynchron
  • S = Synchron
  • L = Lokale Verbuchung

Bearbeitung Aufzeichnung

Der letzte Schritt (wo der Batch-Input mit der F3-Taste verlassen wird, wird ebenfalls aufgeführt in der Batch-Input-Aufzeichnung und kann vernachlässigt werden. Ebenso sind in aller Regel die Befehle, in denen der Cursor in ein Dynprofeld gesetzt wird, nicht nötig. Will man die Batch-Input-Aufzeichnung sichern, dann sollte man die nicht notwendigen Batch-Input-Befehle vorher löschen mit dem Button Button Entfernen.jpg.

Das Beispiel behandelt eine Aufzeichnung der Transaktion VF03 (Ausgangsrechnung anzeigen).


Cursor auf die Zeile 6 setzen und auf den Button Button Entfernen.jpg klicken

Batch-Input8.jpg


Mit der Bestätigungsabfrage werden die Zeilen 6 bis 8 gelöscht

Batch-Input9.jpg


Die bereinigte Aufzeichnung kann nun gespeichert werden

Batch-Input10.jpg

Besonderheiten Batch-Input

Radiobutton

  • Etwas gewöhnungsbedürftig ist es, wenn man auf einen Screen mit Radiobuttons stösst, auf dem nicht aktive Felder ausgegraut sind. In diesem Fall reicht es nicht im Batch-input das Drücken des gewünschten Radiobuttons zu simulieren, um dazu passende Inhaltsfelder zu füllen. Das entsprechende Feld wird nur aktiv, wenn man den Initialbildschirm erneut mitgibt. Das macht auch Sinn, wenn man es sich überlegt, da hier letztlich der Bildschirm neu aufgebaut werden muss. Eine solche Transaktion ist z. B. SMARTFORMS.
  • In der Transaktion SE10 (Data-Dictionary) gibt es auch Radiobuttons, aber die Felder sind alle Eingabegerät. Daher muss hier der Initialbildschirm im Batch-Input nicht erneut aufgerufen werden.
  • Bei einer Maske mit einem Radiobutton sollte man bei der Aufzeichnung explizit auf einen anderen Radiobutton klicken und dann wieder auf den gewünschten Radiobutton. Steht ansonsten der Radiobutton schon auf dem gewünschten Radiobutton, würde dieser Radiobutton nicht aufgezeichnet. Würde dann im Produktivbetrieb des Programms zufällig ein anderer Radiobutton zuletzt ausgewählt sein, würde der Batch-Input nicht funktionieren, da sich das Programm den zuletzt ausgewählten Radiobutton merkt. Beim Coding des Batch-Inputs reicht es den gewünschten Radiobutton aufzuführen.

Drag & Drop

  • Es gibt keine Möglichkeit im Batch-Input einen Drag & Drop-Vorgang zu simulieren. Solche Transaktionen/Funktionen sind nicht für einen Batch-Input geeignet.

Blättern in Listen

  • Per Batch-Input kann man auch in Listen blättern per OK-CODE. Hier sollte man jedoch kritisch hinterfragen, ob dann hierbei auch immer die gewünschten Resultate herauskommen, wenn z. B die Liste unterschiedlich lang sein ist.

Beispielcoding Batch-Input / Programmvorlage

DATA: ls_bdcdata  TYPE bdcdata,
      lt_bdcdata  TYPE TABLE OF bdcdata,
      lt_itab_msg TYPE TABLE OF bdcmsgcoll,
      ls_itab_msg type BDCMSGCOLL,
      lv_modus    type c.

Data: lv_msgv1 type BALM-MSGV1,
      lv_msgv2 type BALM-MSGV2,
      lv_msgv3 type BALM-MSGV3,
      lv_msgv4 type BALM-MSGV4,
      lv_lines type i.

* Einstiegsbildschirm aufrufen
  ls_bdcdata-program = 'SAPMV45A'.
  ls_bdcdata-dynpro = '0102'.
  ls_bdcdata-dynbegin = 'X'.
  APPEND ls_bdcdata TO lt_bdcdata.
  CLEAR ls_bdcdata.

* Bildschirm füllen
  ls_bdcdata-fnam = 'VBAK-VBELN'.
  ls_bdcdata-fval = lv_vbeln.
  APPEND ls_bdcdata TO lt_bdcdata.
  CLEAR ls_bdcdata.

* OK-Code übergeben
  CLEAR ls_bdcdata.
  ls_bdcdata-fnam = 'BDC_OKCODE'.
  ls_bdcdata-fval = '/00'.
  APPEND ls_bdcdata TO lt_bdcdata.

lv_modus = 'N'.  "Sammeln Fehler

* Transaktion ausführen
  CALL TRANSACTION 'VA03'
    USING lt_bdcdata
     MODE lv_modus               "E = Stoppen nur bei Error, A = Anzeige (für Test)
     MESSAGES INTO lt_itab_msg.  "Fehlertabelle

  DESCRIBE TABLE lt_itab_msg lines lv_lines.

   if lv_lines > 0.
     read table lt_itab_msg into ls_itab_msg index lv_lines.
     if ls_itab_msg-MSGTYP = 'E'.

       lv_msgv1 = ls_itab_msg-MSGV1.
       lv_msgv2 = ls_itab_msg-MSGV2.
       lv_msgv3 = ls_itab_msg-MSGV3.
       lv_msgv4 = ls_itab_msg-MSGV4.

       CALL FUNCTION 'MESSAGE_PREPARE'
         EXPORTING
           LANGUAGE               = ls_itab_msg-msgspra
           msg_id                 = ls_itab_msg-msgid
           msg_no                 = ls_itab_msg-msgnr
           MSG_VAR1               = lv_MSGV1
           MSG_VAR2               = lv_MSGV2
           MSG_VAR3               = lv_MSGV3
           MSG_VAR4               = lv_MSGV4
         IMPORTING
           MSG_TEXT               = lv_err_msg
         EXCEPTIONS
           FUNCTION_NOT_COMPLETED = 1
           MESSAGE_NOT_FOUND      = 2
           OTHERS                 = 3.
       IF sy-subrc <> 0.
         MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

       else.
         message i531(0u) with lv_err_msg.
         return.
       ENDIF.

     endif.
   endif.

Kapselung Call Transaction Batch-Input in einer Globalen Methode

Eine sehr interessante Idee ist es, den Aufruf eines Batch-Inputs in einer globalen Klasse/Methode zu kapseln.

So könnte man in diese Methode einen Breakpoint setzen und jeder Batch-Input, der diese Methode verwendet, würde entsprechend hier im Debugger aufgerufen werden.

Desweiteren kann man auf diese Methode einen Verwendungsnachweis machen und bekommt so leicht eine Liste aller einzelnen Batch-Inputs.

BatchInputKlasse1.jpg

BatchInputKlasse2.jpg

BatchInputKlasse3.jpg

Durch diese Vorgehensweise kann man z. B sehr schnell im Debugger die aufrufenden Programme identifizieren.

BatchInputKlasse4.jpg

Kritische Würdigung Batch-Input

  • Mit Batch-Input lässt sich sehr häufig relativ leicht der Ablauf einer Transaktion simulieren, die Felder mit Werten versehen und OK-Codes auslösen. Für einfache Transaktionen, deren Dynproablauffolge auch jedes mal gleich ist, ist Batch-Input sehr gut geeignet.
  • Je mehr einzelne Dynpros eine Transaktion hat, umso zeitaufwendiger wird die Erstellung des Batch-Inputs und umso höher wird die Gefahr, dass die Transaktion sich aufgrund der speziell übergebenen Daten anders verhält als bei der Aufzeichnung des Batch-Inputs und man dies beim Batch-Input-Coding nicht berücksichtigt hat.
  • Wenn man daher z. B. das Anlegen eines Kundenauftrages (Transaktion VA01) programmtechnisch abbilden will, sollte man dies nicht mit Batch-Input machen, sondern mit einschlägigen SAP-Standardfunktionsbausteinen, die alle benötigten Daten bekommen und dann legt dieser Funktionsbaustein den Kundenauftrag an und gibt nur noch die neue Kundenauftragsnummer, bzw. ein Fehlerprotokoll an den Aufrufer des Funktionsbausteins zurück.

Batch-Input-Mappe (Transaktion SM35)

Eine Batch-Input-Mappe unterscheidet sich nur wenig von einem Batch-Input. Währung ein Batch-Input sofort durch das Rahmenprogramm ausgeführt wird, wird bei der Erstellung bei einer Batch-Input-Mappe ein Eintrag für eine neue Mappe in der Transaktion SM35 (Batch-Input: Mappenübersicht) erstellt. Diese Mappe kann dann später hell oder im Hintergrund abgespielt werden. Die Batch-Input-Mappe ist somit ein eigenes Entwicklungsobjekt.

Die Batch-Input-Mappe wird immer synchron ausgeführt.

Das Protokoll des Abspielen sieht man in dieser Transaktion und man sieht auch wieviele Datensätze erfolgreich und nicht erfolgreich eingespielt wurden und kann sich die nicht erfolgreichen Datensätze im Detail anschauen..

 Data: gt_bdcdata type STANDARD TABLE OF bdcdata.

 Parameters: p_bimapn type BDC_RECORD-GROUPID DEFAULT 'TEST-BIM'.

 perform batch_input_mappe.
*&---------------------------------------------------------------------*
*&      Form  BATCH_INPUT_MAPPE
*&---------------------------------------------------------------------*
*       Batch-Input-Mappe
*----------------------------------------------------------------------*
FORM BATCH_INPUT_MAPPE

* erzeugen BDC Mappe für ein Beleg
  perform open_group.

*******************************************
* Einstiegsfenster FB01 füllen            *
*******************************************
  perform bdc_dynpro      using 'SAPMF05A'            "Programm für Einstieg
                                '0100'.

  perform bdc_field       using 'BDC_OKCODE'          "OK-Code ENTER
                                '/00'.

  perform bdc_field       using 'BKPF-BLDAT'          "Belegdatum
                                pis_header-bldat.     "09.10.2015

 ...

***************************************
* Ausführen oder erzeugen in BI Mappe *
* und schließen der Mappe             *
***************************************
  PERFORM bdc_transaction
    USING 'FB01'.

* Mappe speichen/schließen
  perform close_group.

ENDFORM.                    " BATCH_INPUT_MAPPE
*----------------------------------------------------------------------*
*   erzeugen eine Batch Input Session                                  *
*   (nicht für Call Transaction Nutzung...)                            *
*----------------------------------------------------------------------*
FORM OPEN_GROUP.

  SKIP.
  WRITE: /(20) 'Erstellen Batch Input Mappen'(I01), p_bimapn.
  SKIP.
*   open batchinput group
  CALL FUNCTION 'BDC_OPEN_GROUP'
    EXPORTING
      CLIENT = SY-MANDT
      GROUP  = p_bimapn
      USER   = sy-uname
      KEEP   = true.
  " HOLDDATE = HOLDDATE.
  WRITE: /(30) 'BDC_OPEN_GROUP'(I02),
          (12) 'returncode:'(I05),
               SY-SUBRC.

ENDFORM.                    "OPEN_GROUP
*----------------------------------------------------------------------*
*        Start new screen                                              *
*----------------------------------------------------------------------*
FORM bdc_dynpro
  USING program type bdcdata-program "Programm
        dynpro  type bdcdata-dynpro. "Dynpro

  Data: ls_bdcdata type bdcdata.

  ls_bdcdata-program  = program.
  ls_bdcdata-dynpro   = dynpro.
  ls_bdcdata-dynbegin = 'X'.
  APPEND ls_bdcdata to gt_bdcdata.

ENDFORM.          
*----------------------------------------------------------------------*
*        Insert field                                                  *
*----------------------------------------------------------------------*
FORM bdc_field
  USING fnam type bdcdata-fnam "Feldname
        fval type any.         "Feldwert

  Data: ls_bdcdata type bdcdata.

  ls_bdcdata-fnam = fnam.
  ls_bdcdata-fval = fval.
  APPEND ls_bdcdata to gt_bdcdata.

ENDFORM.                    "BDC_FIELD
*----------------------------------------------------------------------*
*        Ausführung mit BDC oder CALL TRANSACTION                *
*----------------------------------------------------------------------*
FORM bdc_transaction
  USING tcode type tstc-tcode.

  DATA: lv_subrc type sy-subrc,
        ls_opt   type ctu_params,
        lv_mstring(480).

* erzeugen BI Mappe
  CALL FUNCTION 'BDC_INSERT'
    EXPORTING
      TCODE     = tcode
    TABLES
      DYNPROTAB = gt_bdcdata.

  IF p_log = true.
    WRITE: / 'BDC_INSERT'(I03),
             TCODE,
             'returncode:'(I05),
             SY-SUBRC,
             'RECORD:',
             SY-TABIX.  "Anzahl Datensätze in Batch-Input-Mappe
  ENDIF.

* muss löschen vor eine neue BDC Session
  REFRESH gt_BDCDATA.

ENDFORM.                    "BDC_TRANSACTION
*----------------------------------------------------------------------*
*   END Batch Input Session                                            *
*----------------------------------------------------------------------*
FORM CLOSE_GROUP.

  CALL FUNCTION 'BDC_CLOSE_GROUP'.
  WRITE: /(30) 'BDC_CLOSE_GROUP'(I04),
          (12) 'returncode:'(I05),
               SY-SUBRC.

ENDFORM.                    "CLOSE_GROUP

Web-Links