*---------------------------------------------------------------------*
* 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