Batch-Input

Aus SAP-Wiki
Zur Navigation springenZur Suche springen

Siehe Kategorie: Schnittstelle.

Mittels Batch-Input kann ein Report oder Dialogprogramm mit den passenden Eingaben im Hintergrund ("dunkel") oder zum Testen im Vordergrund ("hell") ausgeführt werden. Die Variablen werden dem Batch-Input vom aufrufenden Programm mitgegeben.

Siehe Schlüsselbefehl call transaction.

Vor- und Nachteile 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 jedes mal gleich ist, ist Batch-Input gut geeignet.
  • Je mehr einzelne Dynpros eine Transaktion hat, umso zeitaufwendiger und unübersichtlicher wird die Erstellung des Batch-Inputs und umso höher wird die Gefahr, dass die Transaktion sich aufgrund der übergebenen Daten anders verhält als bei der Aufzeichnung des Batch-Inputs und man dies beim Batch-Input-Programm nicht berücksichtigt hat.
  • Wenn man daher z. B. das Anlegen eines Kundenauftrages (Transaktion VA01) oder Ändern eines Kundenauftrages (Tranaktion VA02) programmtechnisch abbilden will, sollte man dies nach Möglichkeit mit einem SAP-Standardfunktionsbausteinen (BAPIs). Der Funktionsbaustein bekommt alle benötigten Daten 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. Nur wenn der BAPI Anlage-/Änderungsdaten vom Kundenauftrag nicht berücksichtigt, sollte man auf einen Batch-Input zurückgreifen. Auch aus eigener Erfahrung kann ich bestätigen, dass Batch-Inputs bei der Kundenauftragsbearbeitung (VA02) sehr zeitaufwendig, schwierig zu warten und fehlerträchtig sind.

Programm, Felder, OK-Code und Transaktionscode für Batch-Input

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

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

Programmvorlage Batch-Input

Beispiel Batch-Input mit VA03

  • 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-Tabelle mit Dynpro-Programm, Feldern und OK-Codes
    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

Aufzeichnung Batch-Input (Transaktion SHDB)

  • Die benötigten Programminformationen 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ü "Dienste - Batch-Input - Recorder" oder mit dem Transaktionscode SHDB aufrufen.

Batch-Input1.jpg

Aufzeichnung

  • 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. Die Schritte werden dabei aufgezeichnet.

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

Bereinigung Aufzeichnung

  • 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.
  • Die Zeilen mit dem Feldnamen BDC_CURSOR

Batch-Input11.jpg

Parameter Batch-Input

Interne Tabelle der Struktur BDCDATA

Im Programm wird eine interne Tabelle vom Typ BDCDATA erzeugt.

Die interne Tabelle vom Struktur-Typ BDCDATA hat die folgenden Felder:

  • PROGRA = Programm
  • DYNPRO = Dynpro
  • DYNBEGIN = bei erstmaligen Dynpro-Aufruf
  • FNAM = Feldnamen
  • FVAL = Feldwert


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, wie z. B. nicht gefüllte Felder. Dazu wird der MODE = 'A' gesetzt.
  • Der Batch-Input wird nun schrittweise durchlaufen und jeder OK-Code-Schritt muss hierbei mit ENTER bestätigt werden.
  • Der Modus sollte in einer Variable gefüllt werden, um dann ggf. im Debugger diese Variable auf 'A' ändern zu können, ohne das eine Codingänderung nötig wird.
Data: lv_modus type c.

lv_modus = 'A'.

* Transaktion ausführen
  CALL TRANSACTION 'VA03'
    USING lt_bdcdata
     "E = Stoppen Error, A = Anzeige Hell (Test), N = Anwendung durchlaufen, Fehler 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

Funktionscode im Debugger

  • Löst man z. B. über das Drücken eines Buttons oder eines Menüeintrags einen Funktionscode aus, kann man den im Debugger sehen
  • in diesem Fall ist der Funktionscode SY-UCOMM = VA05 nach Drücken auf "Aufträge" in der Kundenauftragsbearbeitung VA02

Funktionscode1.JPG

Funktionscode2.JPG

Funktionscode beim Debuggen sehen

  • Wenn man z. B. auf einen Button oder einen Menüeintrag drückt im Dialog, wird ein Funktionscode ausgelöst
  • Den ausgelösten Funktionscode sieht man in der Variablen SY-UCOMM
  • Vor dem Auslösen des Funktionscodes aktiviert man das Debugging im Ok-Feld mit "/h". Anschließend löst man den Funktionscode aus
sy-ucomm = WBS

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.

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

Batch-Input-Mappe (Transaktion SM35)

  • Eine Batch-Input-Mappe unterscheidet sich nur wenig von einem Batch-Input. Während 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.
  • Eine Batch-Input-Mappe benötigt 3 Funktionsbausteinaufrufe
    • BDC_OPEN_GROUP = Öffnen der Mappe --> Hier in Form-Routine "OPEN_GROUP"
    • BDC_INSERT = Hinzufügen der Batch-Input-Daten --> Hier in Form-Routine "BDC_TRANSACTION"
    • BDC_CLOSE_GROUP = Schließen der Mappe --> Hier in Form-Routine "CLOSE_GROUP"
 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

Literatur