*---------------------------------------------------------------------*
*                        Z _ B J H _ M I G O                          *
*                                                                     *
*                 Autor: Bernd Haase (BJH Software)                   *
*---------------------------------------------------------------------*
* Beispielprogramm für das Verbuchen einer Warenbewegung. Im Programm *
* wird eine Position verbucht, wie => einstellbar über die Bewegungs- *
* art. Minimalausführung für die Werteversorgung. Nach Durchlauf der  *
* Funktion Ergebnisanzeige und wenn gewünscht auch Ausdruck. Storno   *
* ist integriert, ausführbar über die Materialbelegsnummer            *
*---------------------------------------------------------------------*
* Selektions-Bildschirm mit Subscreen, Reiter und Pushbutton          *
* FB 'MB_CREATE_GOODS_MOVEMENT'                                       *
*---------------------------------------------------------------------*
* 25.05.2004 BHaa: Programm erstellt. Ausgaberoutinen                 *
* 27.05.2004 BHaa: Storno integriert (für alle Bewegungsarten)        *
* 25.08.2004 BHaa: Selektions-Bildschirm über Reitertechnik           *
*---------------------------------------------------------------------*
REPORT  z_bjh_migo                 .

INCLUDE .

TABLES:
 emkpf,  "MMIM: Outputstruktur für allgemeinen FB Warenbewegung buchen
 emseg,  "MMIM: Outputstruktur für allgemeinen FB Warenbewegung buchen
 imkpf,  "MMIM: Inputstruktur für allgemeinen FB Warenbewegung buchen
 imseg,  "MMIM: Inputstruktur für allgemeinen FB Warenbewegung buchen
 mara,   "Allgemeine Materialdaten
 mseg.   "Belegsegment Material

TABLES:
 sscrfields.    "Felder auf Selektionsbildern

DATA:
 wa_mseg LIKE mseg,

* Übergabestruktur Kopfdaten an den Bapi
 vom_bapi LIKE emkpf,
* Rückgabestruktur Kopfdaten vom Bapi
 zum_bapi LIKE imkpf,

* Zwischenvariable für die Ausgabe von Meldungen
 zw_text(70) TYPE c,
 anzahl(5) TYPE n,

* Bewegungsart (numerisch) für die Berechnung der Storno-Bewegungsart
 num_bwart(3) TYPE n.

DATA:
* Positionsstruktur interne Tabelle zum Verbuchen für den Bapi
 BEGIN OF itab_hinein OCCURS 0.
       INCLUDE STRUCTURE imseg.
DATA:
 END OF itab_hinein.

DATA:
* Ausgabe der Positionen als interne Tabelle nach dem Bapi-Durchlauf
 BEGIN OF itab_heraus OCCURS 0.
       INCLUDE STRUCTURE emseg.
DATA:
 END OF itab_heraus.

***********************************************************************
*                   A U S W A H L B I L D S C H I R M                 *
*                                                                     *
*                   Subscreens für TAB-Reiter-Methodik                *
***********************************************************************
SELECTION-SCREEN BEGIN OF SCREEN 1101 AS SUBSCREEN .
SELECTION-SCREEN: BEGIN OF BLOCK a2 WITH FRAME TITLE text-902.
* Daten für die Verbuchung / Warenbewegung
PARAMETERS:
 pm_migo  RADIOBUTTON GROUP grp1 DEFAULT 'X', "Verbuchen ausführen
 pm_menge LIKE imseg-menge,
 pm_aufnr LIKE imseg-aufnr,                   "Auftragsnummer
 pm_kostl LIKE imseg-kostl DEFAULT '11704'.   "Sachkonto

SELECTION-SCREEN ULINE.

* nur bei Storno. Materialbelegnummer des zu stornierenden Beleges
PARAMETERS:
 pmstorno RADIOBUTTON GROUP grp1,         "Stornierung ausführen
 pm_mblnr LIKE mseg-mblnr,                "Materialbelegnummer
 pm_mjahr LIKE mseg-mjahr.                "Geschäftsjahr
SELECTION-SCREEN: END OF BLOCK a2.
SELECTION-SCREEN END OF SCREEN 1101.

*********************
* zweiter Subscreen *
*********************
SELECTION-SCREEN BEGIN OF SCREEN 1102 AS SUBSCREEN .
* zusätzliche Daten, sind aber nicht erforderlich für die Buchung
SELECTION-SCREEN: BEGIN OF BLOCK a3 WITH FRAME TITLE text-903.
PARAMETERS:
* Externe Identifikation des Lieferscheins
 pm_lifex LIKE imkpf-lifex.                   "Lieferscheinnummer
SELECTION-SCREEN: END OF BLOCK a3.

* Steuerung für die Meldungen
SELECTION-SCREEN: BEGIN OF BLOCK a4 WITH FRAME TITLE text-904.
PARAMETERS:
 pm_meld  AS CHECKBOX DEFAULT 'X',   "Meldung am Bildschirm erwünscht
 pm_druck AS CHECKBOX DEFAULT ' '.   "Ausdruck erwünscht
SELECTION-SCREEN: END OF BLOCK a4.

* Pushbuttons Position-in-Zeile(Länge)
SELECTION-SCREEN PUSHBUTTON 05(08) text-941
                      USER-COMMAND usmeld MODIF ID s41.
SELECTION-SCREEN PUSHBUTTON 15(08) text-942
                      USER-COMMAND usdruck MODIF ID s42.
SELECTION-SCREEN END OF SCREEN 1102.

*---------------------------------------------------------------------*
*                                                                     *
*                 A u s w a h l b i l d s c h i r m                   *
*                                                                     *
*---------------------------------------------------------------------*
* Selektionsdaten
SELECTION-SCREEN: BEGIN OF BLOCK a1 WITH FRAME TITLE text-901.
PARAMETERS:
 pm_bwart LIKE imseg-bwart DEFAULT '261',    "Bewegungsart
 pm_matnr LIKE imseg-matnr DEFAULT '80bjh000111',
 pm_werks LIKE imseg-werks DEFAULT '0101',   "Werk
 pm_lgort LIKE imseg-lgort DEFAULT '0001'.   "Lagerort im Werk
SELECTION-SCREEN: END OF BLOCK a1.

* Selektionsbildschirm mit TAB-Reiter-Methodik mit 10 Zeilen Höhe
SELECTION-SCREEN: BEGIN OF TABBED BLOCK tbbl FOR 10 LINES,
 TAB (20) scrtabs1 USER-COMMAND b1 DEFAULT SCREEN 1101,
 TAB (20) scrtabs2 USER-COMMAND b2 DEFAULT SCREEN 1102.
SELECTION-SCREEN: END OF BLOCK tbbl.

*---------------------------------------------------------------------*
INITIALIZATION.
* Texte für Reiter im Selection-Screen vergeben
 scrtabs1 = text-921.  "Warenbewegung
 scrtabs2 = text-922.  "Zusatzdaten

* Geschäftsvorfalljahr bei Storno vorbesetzen
 MOVE sy-datum(4) TO pm_mjahr.

* PBO-Modul für Selektions-Bildschirm. Hier keine Aktionen
AT SELECTION-SCREEN OUTPUT.

AT SELECTION-SCREEN.
* welche Taste oder Aktion wurde gedrückt
 CASE sscrfields-ucomm.
* Abfragen wenn Reiter gedrückt
   WHEN 'B1' OR 'B2'.
* sollten für den Subscreen besondere Anweisungen im PAI ausgeführt
* werden oder  spezielle Sachen bearbeitet oder eingelesen werden, so
* kann dieses hier geschehen. Im Beispiel ist nichts vorgesehen =>
* Leeranweisung
     CASE sy-dynnr.
       WHEN '1101'.
       WHEN '1102'.
     ENDCASE.
* Meldungen am Bildschirm an- oder ausschalten
   WHEN 'USMELD'.
     IF pm_meld = 'X'.
       MOVE ' ' TO pm_meld.
     ELSE.
       MOVE 'X' TO pm_meld.
     ENDIF.
     CLEAR sscrfields-ucomm.
* Drucken an- oder ausschalten
   WHEN 'USDRUCK'.
     IF pm_druck = 'X'.
       MOVE ' ' TO pm_druck.
     ELSE.
       MOVE 'X' TO pm_druck.
     ENDIF.
     CLEAR sscrfields-ucomm.
 ENDCASE.

* nicht generell den Aktionscode ucomm plattmachen, da sonst die
* Reitertechnik nicht mehr funktioniert

***********************************************************************
*                                                                     *
*                     P R O G R A M M S T A R T                       *
*                                                                     *
***********************************************************************
START-OF-SELECTION.
 IF pmstorno = 'X'.
   PERFORM upro-aufbau_storno.

   DESCRIBE TABLE itab_hinein LINES anzahl.
   IF anzahl < 1.
     WRITE: / icon_red_light,
              'Storno: Keine Daten gefunden.'.
   ELSE.
     PERFORM upro-aufbau_kopfdaten.
* Belegnummer als Referenz den Kopfdaten hinzufügen
     MOVE pm_mblnr TO zum_bapi-xblnr.

     PERFORM upro-function_migo.
   ENDIF.
 ELSE.
   PERFORM upro-aufbau_werte.

   PERFORM upro-function_migo.
 ENDIF.

END-OF-SELECTION.
 EXIT.

*---------------------------------------------------------------------*
*                      A U F B A U _ S T O R N O                      *
*---------------------------------------------------------------------*
* Stornierung eines Beleges. Alle Positionen des ausgewählten Beleges *
* werden komplett zurückgesetzt ... mit dem im Beleg genannten Mengen.*
* Die Bewegungsart ist die der normalen Warenbewegung + 1 => SAP      *
* ist das der dazugehörende Storno. Somit ist die Routine auch alle   *
* Aktionen anwendbar.                                                 *
*---------------------------------------------------------------------*
FORM upro-aufbau_storno.
* Übertabetabelle der Positionen initialisieren.
 REFRESH: itab_hinein, itab_heraus.

 IF pm_mblnr IS INITIAL
 OR pm_mjahr IS INITIAL.
* es ist keine Belegnummer eingegeben. Fehlermeldung
   WRITE: / icon_red_light,
            'Kein Beleg zum Stornieren eingegeben !'.
 ELSE.
* alle Positionen zum ausgewählten Beleg herausselektieren
* und in der Übergabetabelle intern speichern
   SELECT * FROM mseg INTO wa_mseg
   WHERE mblnr = pm_mblnr
   AND   mjahr = pm_mjahr.
     CLEAR itab_hinein.
     MOVE-CORRESPONDING wa_mseg TO itab_hinein.
* Bewegungsart +1 ist SAP interne immer Storno
     MOVE wa_mseg-bwart TO num_bwart.
     ADD 1 TO num_bwart.
     MOVE num_bwart TO itab_hinein-bwart.

     APPEND itab_hinein.
   ENDSELECT.
 ENDIF.

* sollten keine Daten gefunden werden, wird dieses in der übergeord-
* neten Routine behandelt, da dort auch im positiven falle die weitere
* Abarbeitung dort gehandelt wird.

ENDFORM.

*---------------------------------------------------------------------*
*                     A U F B A U _ W E R T E                         *
*---------------------------------------------------------------------*
* interne Strukturen und Tabellen befüllen für den Aufruf des BAPIs.  *
*---------------------------------------------------------------------*
FORM upro-aufbau_werte.

 PERFORM upro-aufbau_kopfdaten.

* Positionsdaten als Tabelle. Im Beispiel wird nur eine Position
* benötigt
 CLEAR:   itab_hinein, itab_heraus.
 REFRESH: itab_hinein, itab_heraus.

 MOVE pm_matnr TO itab_hinein-matnr.
 MOVE pm_werks TO itab_hinein-werks.
 MOVE pm_lgort TO itab_hinein-lgort.

 MOVE pm_menge TO itab_hinein-menge.

 MOVE pm_bwart TO itab_hinein-bwart.
 MOVE pm_kostl TO itab_hinein-kostl.
 MOVE pm_aufnr TO itab_hinein-aufnr.
 MOVE '00000000' TO itab_hinein-ps_psp_pnr.
 MOVE ' ' TO itab_hinein-kzbew.

* Basismengeneinheit auf der Materialtabelle einlesen
 SELECT SINGLE meins FROM mara INTO itab_hinein-meins
 WHERE matnr = pm_matnr.
 IF sy-subrc <> 0.
   CLEAR itab_hinein-meins.
 ENDIF.

* die Menge und die Mengeneinheit in die erfaßte Menge kopieren
 MOVE itab_hinein-menge TO itab_hinein-erfmg.
 MOVE itab_hinein-meins TO itab_hinein-erfme.

 APPEND itab_hinein.

ENDFORM.

*---------------------------------------------------------------------*
*                 A U F B A U _ K O P F D A T E N                     *
*---------------------------------------------------------------------*
* Materialbelegskopfdaten, die für die Verbuchung wie auch den Storno *
* gelten.                                                             *
*---------------------------------------------------------------------*
FORM upro-aufbau_kopfdaten.

* Kopfdaten
 CLEAR: zum_bapi, vom_bapi.

 MOVE sy-datlo TO zum_bapi-bldat.
 MOVE sy-datlo TO zum_bapi-budat.
 MOVE pm_druck TO zum_bapi-pr_print.
 MOVE pm_lifex TO zum_bapi-lifex.

ENDFORM.

*---------------------------------------------------------------------*
*                     F U N C T I O N _ M I G O                       *
*---------------------------------------------------------------------*
* Aufruf der Funktion zur Verbuchung von Warenbewegungen. Nach Aufruf *
* Auswertung der Fehler und Anzeige wenn gebucht. Bei erfolgreichen   *
* Durchlauf der Funktion die Verbuchungsfunktion aufrufen, seit Re-   *
* lease 4.0 muß dieses so sein (s. FB-Dokumentation)                  *
*---------------------------------------------------------------------*
FORM upro-function_migo.

 CALL FUNCTION 'MB_CREATE_GOODS_MOVEMENT'
      EXPORTING
           imkpf         = zum_bapi  "Eingabedaten Materialbelegkopf
           xallp         = 'X'  "Alles oder nichts buchen
           xallr         = 'X'  "Alle Tabellen zurücksetzen
           ctcod         = 'MIGO'  "Transaktion
      IMPORTING
           emkpf         = vom_bapi  "Ausgabedaten Materialbelegkopf
      TABLES
           imseg         = itab_hinein  "Eingabedaten Materialbelegpos
           emseg         = itab_heraus  "Ausgabedaten Materialbelegpos
      EXCEPTIONS
           error_message = 1
           OTHERS        = 2.

* Fehler nach Durchlauf Bapi
 IF vom_bapi-subrc <> 1
 OR sy-subrc       <> 0
 OR NOT vom_bapi-xprob IS INITIAL.
* Fehlermeldung im Kopfbereich (sehr selten)
   IF NOT vom_bapi-msgid IS INITIAL.
* Meldung des Fehler in den Kopfdaten
     MESSAGE ID vom_bapi-msgid TYPE vom_bapi-msgty
             NUMBER vom_bapi-msgno
             WITH vom_bapi-msgv1 vom_bapi-msgv2
                  vom_bapi-msgv3 vom_bapi-msgv4
             INTO zw_text.
* vor jeden Fehlertext eine Ampel als grafische Auflockerung
     IF pm_meld = 'X'.
       CASE itab_heraus-msgty.
         WHEN 'S'.
           WRITE AT : /1 icon_green_light.
         WHEN 'I' OR 'W'.
           WRITE AT : /1 icon_yellow_light.
         WHEN OTHERS.
           WRITE AT : /1 icon_red_light.
       ENDCASE.
       WRITE AT: 6 zw_text.
     ENDIF.
   ENDIF.

* Fehlermeldung in den Positionen
   LOOP AT itab_heraus.
     IF NOT itab_heraus-msgid IS INITIAL.
* Fehler bei Bestandsbuchung anzeigen, wenn gewünscht
       MESSAGE ID itab_heraus-msgid TYPE itab_heraus-msgty
               NUMBER itab_heraus-msgno
               WITH itab_heraus-msgv1 itab_heraus-msgv2
                    itab_heraus-msgv3 itab_heraus-msgv4
               INTO zw_text.

       IF pm_meld = 'X'.
         CASE itab_heraus-msgty.
           WHEN 'S'.
             WRITE AT : /1 icon_green_light.
           WHEN 'I' OR 'W'.
             WRITE AT : /1 icon_yellow_light.
           WHEN OTHERS.
             WRITE AT : /1 icon_red_light.
         ENDCASE.
         WRITE AT: 6 zw_text.
       ENDIF.
     ENDIF.
   ENDLOOP.
 ELSE.
* Funktionsbaustein fehlerfrei durchlaufen, grüne Ampel
   IF pm_meld = 'X'.
     WRITE AT : /1 icon_green_light,
                 6 'Bapi GOODS_MOVEMENT erfolgreich durchlaufen'.
   ENDIF.
 ENDIF.

 IF vom_bapi-subrc <= 1.
* Verbuchungsfunktion aufrufen
   CALL FUNCTION 'MB_POST_GOODS_MOVEMENT'
        IMPORTING
             emkpf  = vom_bapi
        EXCEPTIONS
             OTHERS = 0.
   COMMIT WORK.

   IF pm_meld = 'X'.
     SKIP 1.
     WRITE AT : /1 icon_green_light,
                 6 'Beleg',
                12 vom_bapi-mblnr,
                23 'wurde generiert'.
   ENDIF.
 ELSE.
* Funktionsbaustein hatte einen Fehler, Aktion rückgängig machen
   ROLLBACK WORK.
   EXIT.
 ENDIF.

ENDFORM.

***** Ende *****
* Copyright BJH Software, Datei überarbeitet am: 26.5.2005