[ABAP] Warenbewegungen buchen

TYPES: BEGIN OF ty_s_material,
         matnr         TYPE mara-matnr,                            " Materialnummer
         erfmg         TYPE mseg-erfmg,                            " Menge in Erfassungsmengeneinheit (mseg-erfmg) / Menge (mseg-menge)
         entry_uom_iso TYPE bapi2017_gm_item_create-entry_uom_iso, " ISO-Code Maßeinheit
       END OF ty_s_material.

TYPES: ty_it_material TYPE STANDARD TABLE OF ty_s_material WITH KEY matnr.

PARAMETERS: p_test AS CHECKBOX DEFAULT 'X'.

START-OF-SELECTION.

  DATA(it_material) = VALUE ty_it_material( ( matnr = '0815' erfmg = '1' entry_uom_iso = 'PCE' )
                                            ( matnr = '0816' erfmg = '2' entry_uom_iso = 'PCE' )
                                          ).

* Header
  DATA(lv_header) = VALUE bapi2017_gm_head_01( pstng_date    = sy-datum " Buchungsdatum im Beleg
                                               doc_date      = sy-datum " Belegdatum im Beleg
                                               pr_uname      = sy-uname " Benutzername
                                               gr_gi_slip_no = '12345'  " Warenbegleitscheinnummer
                                               header_txt    = 'Text1'  " Belegkopftext
                                               ref_doc_no    = 'Refdoc' " Nummer des externen Materialscheins
                                             ).

* gm_code (siehe auch Tabelle T158G)
* 01  MB01 (Wareneingang zur Bestellung buchen)
* 02  MB31 (Wareneingang zum Fertigungsauftrag)
* 03  MB1A (Warenentnahme)
* 04  MB1B (Umbuchung)
* 05  MB1C (Wareneingang Sonstige)
* 06  MB11 (Warenbewegung)
* 07  MB04 (Nachverrechnung von Beistellmaterial)
  DATA(lv_mvt_code) = VALUE bapi2017_gm_code( gm_code = '03' ). " Zuordnung Code zu Transaktion für BAPI Warenbewegung

* Items für Bewegungsdaten füllen
  DATA(it_items_to_move) = VALUE bapi2017_gm_item_create_t( FOR <m> IN it_material
                                                            (
                                                              material  = CONV #( <m>-matnr ) " 18-stellige Materialnummer
                                                              plant     = '10'                " Werk
                                                              stge_loc  = '01'                " Lagerort
                                                              move_type = '262'               " Bewegungsart (Bestandsführung)
* KZBEW	(Bewegungskennzeichen)
* ' '  Warenbewegung ohne Referenz
*  B  Warenbewegung zur Bestellung
*  F  Warenbewegung zum Auftrag
*  L  Warenbewegung zum Lieferschein
*  K  Warenbewegung zur Kanban-Anforderung (Nur WM intern)
*  O  Nachverrechnung von Beistellmaterial
*  W  Nachverrechnung von Anteils-/Produkt ME Material
                                                              mvt_ind       = ' '                     " Bewegungskennzeichen (Warenbewegung ohne Referenz)
                                                              entry_qnt     = CONV #( <m>-erfmg )     " Menge in Erfassungsmengeneinheit
                                                              entry_uom_iso = <m>-entry_uom_iso       " ISO-Code Maßeinheit
                                                              gl_account    = ''                      " Nummer des Sachkontos
                                                              gr_rcpt       = 'ABC'                   " Warenempfänger
                                                              costcenter    = '100200'                " Kostenstelle
                                                              orderid       = ''                      " Auftragsnummer
                                                              wbs_elem      = ''                      " Projektstrukturplanelement (PSP-Element)
                                                            )
                                                          ).
  DATA(lv_headret) = VALUE bapi2017_gm_head_ret( ).
  DATA(it_return) = VALUE bapiret2_t( ).

  CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
    EXPORTING
      goodsmvt_header  = lv_header
      goodsmvt_code    = lv_mvt_code
      testrun          = p_test
    IMPORTING
      goodsmvt_headret = lv_headret
    TABLES
      goodsmvt_item    = it_items_to_move
      return           = it_return.

* Fehlerauswertung: E - Error, A - Abort
  LOOP AT it_return ASSIGNING FIELD-SYMBOL(<e>).
    WRITE: / |RETURN [{ <e>-type } { <e>-number }]: { <e>-message }|.
  ENDLOOP.

  DATA(lv_return) = VALUE bapiret2( ).

  IF lines( it_return ) > 0.
* Rollback bei Fehler
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
      IMPORTING
        return = lv_return.

    WRITE: / |ROLLBACK [{ lv_return-type } { lv_return-number }]: { lv_return-message }|.
  ELSE.
* Daten verbuchen
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait   = abap_true
      IMPORTING
        return = lv_return.

    WRITE: / |COMMIT [{ lv_return-type } { lv_return-number }]: { lv_return-message }|.
  ENDIF.

Links

[ABAP] Popup-Dialog zur Anzeige von BAPI-Meldungen

DATA(it_bapi_ret) = VALUE bapiret2_t( ( type       = 'S'
                                        id         = '01'
                                        number     = '319'
                                        message_v1 = 'Test'
                                      )
                                      ( type       = 'S'
                                        id         = '01'
                                        number     = '319'
                                        message_v1 = 'Test2'
                                      )
                                    ).

Variante 1 (cl_rmsl_message)

cl_rmsl_message=>display( it_bapi_ret ).

Variante 2 (cl_tex_message_handler)

cl_tex_message_handler=>display_bapiret2( it_bapi_ret ).

Variante 3 (C14ALD_BAPIRET2_SHOW)

* EHS: Anzeige einer BAPI-Fehlermeldungstabelle (BAPIRET2)
CALL FUNCTION 'C14ALD_BAPIRET2_SHOW'
  TABLES
    i_bapiret2_tab = it_bapi_ret.

Variante 4 (BSSP2_MESSAGE_POPUP)

DATA: lv_ef_continue TYPE boolean.

DATA(it_message) = VALUE bssp_t_message( ( msgid = 'SY' msgty = 'E' msgno = 100 msgv1 = 'Text1' msgv2 = '' msgv3 = '' msgv4 = '' row = 0 fieldname = '' )
                                         ( msgid = 'SY' msgty = 'W' msgno = 101 msgv1 = 'Text2' msgv2 = '' msgv3 = '' msgv4 = '' row = 0 fieldname = '' )
                                         ( msgid = 'SY' msgty = 'i' msgno = 102 msgv1 = 'Text3' msgv2 = '' msgv3 = '' msgv4 = '' row = 0 fieldname = '' ) ).

CALL FUNCTION 'BSSP2_MESSAGE_POPUP'
  EXPORTING
    it_message        = it_message
    if_save_necessary = abap_true
  IMPORTING
    ef_continue       = lv_ef_continue.

IF lv_ef_continue = abap_true.
* Sichern
ELSE.
* Abbrechen
ENDIF.

Variante 5 (C14Z_MESSAGES_SHOW_AS_POPUP)

DATA(it_messages) = VALUE esp1_message_tab_type( ( msgid = 'SY' msgno = '002' msgty = 'I' msgv1 = |Text1| lineno = 1 )
                                                 ( msgid = 'SY' msgno = '002' msgty = 'I' msgv1 = |Text2| lineno = 2 )
                                               ).

* EHS: eine oder mehrere Nachrichten in einem Popup anzeigen
CALL FUNCTION 'C14Z_MESSAGES_SHOW_AS_POPUP'
  TABLES
    i_message_tab = it_messages.

Variante 6 (cf_reca_message_list / RECA_GUI_MSGLIST_POPUP)

* Message-Collector Objekt
DATA(o_msg_list) = cf_reca_message_list=>create( ).

TRY.
* Division durch Null provozieren
    DATA(lv_div) = 1 / 0.
  CATCH cx_root INTO DATA(e_txt).
* Exception an den Collector übergeben
    o_msg_list->add_from_exception( e_txt ).
ENDTRY.

* Protokoll als Applikation bzw. Popup anzeigen
CALL FUNCTION 'RECA_GUI_MSGLIST_POPUP'
  EXPORTING
    io_msglist = o_msg_list.

Links

[ABAP] Binärdaten per RFC aus dem Archiv (Content-Repository) lesen

* System-ID
PARAMETERS: p_rfc TYPE sy-sysid DEFAULT 'XYZ'.
* Content-Repository
PARAMETERS: p_rep TYPE saearchivi DEFAULT 'AR'.
* ARC_DOC_ID
PARAMETERS: p_arc TYPE saeardoid DEFAULT '1402EC8FAAB21EC888CA63622402D29F'.

START-OF-SELECTION.

  DATA: lv_message TYPE bapiret2.
  DATA: it_raw_1024 TYPE STANDARD TABLE OF tbl1024 WITH DEFAULT KEY.

* Binärdaten eines Dokumentes über RFC zurückgeben
  CALL FUNCTION 'ALINK_RFC_TABLE_GET' DESTINATION p_rfc
    EXPORTING
      im_docid              = p_arc
      im_crepid             = p_rep
    IMPORTING
      ex_message            = lv_message
    TABLES
      ex_document           = it_raw_1024
    EXCEPTIONS
      system_failure        = 1
      communication_failure = 2
      OTHERS                = 3.

  WRITE: / lv_message-message.

  IF sy-subrc = 0.
* weitere Schritte mit it_raw_1024

  ENDIF.

[ABAP] Alle ungesperrten Dialoguser auflisten

DATA: it_sel_range TYPE STANDARD TABLE OF bapiussrge.
DATA: it_users TYPE STANDARD TABLE OF bapiusname.
DATA: it_ret TYPE STANDARD TABLE OF bapiret2.

* ungesperrte Dialoguser ermitteln
INSERT VALUE #( parameter = 'LOGONDATA'
                field = 'USTYP'
                sign = 'I'
                option = 'EQ'
                low = 'A'
                high = '' ) INTO TABLE it_sel_range.

INSERT VALUE #( parameter = 'LOGONDATA'
                field = 'UFLAG'
                sign = 'I'
                option = 'EQ'
                low = '0'
                high = '' ) INTO TABLE it_sel_range.

CALL FUNCTION 'BAPI_USER_GETLIST'
  EXPORTING
    with_username   = abap_true
  TABLES
    selection_range = it_sel_range
    userlist        = it_users
    return          = it_ret.

LOOP AT it_users ASSIGNING FIELD-SYMBOL(<fs_line>).
  WRITE: / <fs_line>-username, <fs_line>-firstname, <fs_line>-lastname, <fs_line>-fullname.
ENDLOOP.