寄售和管道结算

REPORT ZRMVKON00 MESSAGE-ID M8 NO STANDARD PAGE HEADING.
*ENHANCEMENT-POINT RMVKON00_G4 SPOTS ES_RMVKON00 STATIC.
*ENHANCEMENT-POINT RMVKON00_G5 SPOTS ES_RMVKON00.
*ENHANCEMENT-POINT RMVKON00_G6 SPOTS ES_RMVKON00 STATIC.
*ENHANCEMENT-POINT RMVKON00_G7 SPOTS ES_RMVKON00.

*---------------------------------------------------------------------*
*   Historie
*---------------------------------------------------------------------*
* - zu Release 2.x: erste Version, nur Anzeige möglich
* - zu Release 3.0a: Abrechnen im Dialog möglich
* - zu Release 4.0a: Umstellung von BSEG auf RKWA, Anschluß an NaSt,
*                    Abrechnen im batch
* - zu Release 4.5a: Abrechnen mit nicht abzugsfähigen Steuern möglich
* - zu Release 4.6C: Liste mit ALV
* - Beleg wird direkt über RWIN gebucht AC_DOCUMENT_CREATE und _POST
*---------------------------------------------------------------------*
*   tables                                                            *
*---------------------------------------------------------------------*

TABLES:
* benutzt für SELECT
  RKWA,

* benutzt bei externem Perform
  BKPF,
  BSEG,
  BSET,
  ITXDAT,
  T001W.

TYPE-POOLSMRMSHLP.

INCLUDEMRM_CONST_COMMON,             "allgemeine Konstanten
         MRM_CONST_NAST,               " Nachrichten
         MRM_CONST_MRM,
         MRM_CONST_ME,                 "aus dem Einkauf
         MRM_CONST_MB,                 "aus der Bestandsführung
         MRM_CONST_FI.                 "aus dem FI

*---------------------------------------------------------------------*
*   Typen (TYP_*)
*---------------------------------------------------------------------*

* Meldung
TYPESBEGIN OF TYP_MSG,
         MSGID LIKE SY-MSGID,
         MSGTY LIKE SY-MSGTY,
         MSGNO LIKE SY-MSGNO,
         MSGV1 LIKE SY-MSGV1,
         MSGV2 LIKE SY-MSGV2,
         MSGV3 LIKE SY-MSGV3,
         MSGV4 LIKE SY-MSGV4,
       END OF TYP_MSG.

* Block von Warenentnahmen (zu Buchungskreis/Lieferant)
TYPESBEGIN OF TYP_BLOCK,
         BUKRS   LIKE RKWA-BUKRS,                           "key
         LIFNR   LIKE RKWA-LIFNR,                           "key
         BWAER   LIKE RKWA-BWAER,                           "key
         IT_RKWA LIKE RKWA    OCCURS 1"Warenentnahmen
         BSTAT   TYPE C,               "Status -> C_BSTAT_*
         BELNR   LIKE RKWA-BELNR,      "Rechnungsbeleg
         GJAHR   LIKE RKWA-GJAHR,      "Rechnungsbeleg
         MSGID   LIKE SY-MSGID,
         MSGTY   LIKE SY-MSGTY,
         MSGNO   LIKE SY-MSGNO,
         MSGV1   LIKE SY-MSGV1,
         MSGV2   LIKE SY-MSGV2,
         MSGV3   LIKE SY-MSGV3,
         MSGV4   LIKE SY-MSGV4,
       END OF TYP_BLOCK.

* zum Berechnen der Steuern
TYPESBEGIN OF TYP_BSET,
         WRBTR LIKE BSEG-WRBTR,        "CURR statt CHAR (Vorzeichen!)
         FWSTE LIKE BSET-FWSTE,        "CURR statt CHAR (Vorzeichen!)
         MWSKZ LIKE RBSET-MWSKZ,
         TXJCD LIKE T001W-TXJCD,
       END OF TYP_BSET.

* Puffer für MWSKZ/TXJCD Abhängigkeit von Material, Lieferant und Werk
TYPESBEGIN OF TYP_TAX,
         MATNR LIKE BSEG-MATNR,                             "key
         WERKS LIKE T001W-WERKS,                            "key
         LIFNR LIKE VF_KRED-LIFNR,                          "key
         MWSKZ LIKE RBSET-MWSKZ,
         TXJCD LIKE T001W-TXJCD,
       END OF TYP_TAX.

* Tabellentypen (TYP_TAB_*)
TYPESTYP_TAB_BKPF  LIKE BKPF      OCCURS 1,
       TYP_TAB_BSEG  LIKE BSEG      OCCURS 1,
       TYP_TAB_BSET  LIKE BSET      OCCURS 1,
       TYP_TAB_RKWA  LIKE RKWA      OCCURS 1,
       TYP_TAB_BLOCK TYPE TYP_BLOCK OCCURS 1,
       TYP_TAB_TAX   TYPE TYP_TAX   OCCURS 1,
       TYP_TAB_RBWS  LIKE RBWS      OCCURS 1.

DATAS_VARIANT LIKE  DISVARIANT,
      S_VAR_USR LIKE  DISVARIANT.

*---------------------------------------------------------------------*
*   Konstanten (C_*)                                                  *
*---------------------------------------------------------------------*

CONSTANTS:

  C_SAVE(1)      TYPE  C               VALUE  'A',
  C_REPID        TYPE  SY-REPID        VALUE  'ZRMVKON00',
  C_TOP_OF_LIST  TYPE  SLIS_FORMNAME   VALUE  'TOP_OF_LIST',
  C_DOKCLASS_NA  TYPE  DSYSH-DOKCLASS  VALUE  'NA',

* Transaktionscodes
  C_TCODE_MRKO   LIKE SY-TCODE VALUE 'MRKO',

* RKWA-Status
  C_STATUS_NINV  LIKE RKWA-STATUS VALUE '00',   "nicht abgerechnet
  C_STATUS_INV   LIKE RKWA-STATUS VALUE '01',    "abgerechnet

* Block-Abrechnungs-Status
  C_BSTAT_NULL   TYPE VALUE SPACE,   "nicht verarbeitet
  C_BSTAT_OK     TYPE VALUE '1',     "abgerechnet
  C_BSTAT_FEHLER TYPE VALUE '2',     "Fehler bei Abrechnung

* Sonstiges
  C_STYPE_N      LIKE BBKPF-STYPE VALUE 'N'"batch-input: no



*---------------------------------------------------------------------*
*   globale Felder (G_*, GT_*)
*---------------------------------------------------------------------*

* GT_BLOCK enthält alle Blöcke, GT_BLOCK selber ist sortiert nach
* Buchungskreis und Lieferant.
* Ein Block enthält alle Warenentnahmen zu einem Buch.kreis/Lieferanten.
* Die WE in einem Block sind sortiert nach Matbelegnr und -Position.
DATAGT_BLOCK TYPE TYP_BLOCK OCCURS 1.

*---------------------------------------------------------------------*
*   globale Felder, lokal genutzt (L_*, LT_*)
*---------------------------------------------------------------------*
TYPESBEGIN OF TY_CON_ALV.
        INCLUDE STRUCTURE RKWA.
TYPES:   BOX     TYPE C,
         COLINFO TYPE SLIS_T_SPECIALCOL_ALV,
         MSGTY   LIKE MESG-MSGTY,
         TEXT    LIKE MESG-TEXT,
         ARBGB   LIKE MESG-ARBGB,
         TXTNR   LIKE MESG-TXTNR,
         MSGV1   LIKE MESG-MSGV1,
         MSGV2   LIKE MESG-MSGV2,
         MSGV3   LIKE MESG-MSGV3,
         MSGV4   LIKE MESG-MSGV4,
         END OF TY_CON_ALV.
* alle selektierten Warenentnahmen (temporär benutzt)
DATALT_RKWA    LIKE RKWA OCCURS 1,
      T_ALV_LIST TYPE TABLE OF TY_CON_ALV" ALV-Ausgabeliste

*---------------------------------------------------------------------*
*  Ranges
*---------------------------------------------------------------------*

RANGESR_STATUS FOR RKWA-STATUS OCCURS 1,
        R_SOBKZ  FOR RKWA-SOBKZ  OCCURS 1.

*---------------------------------------------------------------------*
*   Select-options & Parameter
*---------------------------------------------------------------------*

* Rahmen "Auswahl"
SELECTION-SCREEN BEGIN OF BLOCK AUSWAHL WITH FRAME
                                        TITLE TEXT-001.
SELECT-OPTIONS:
  SO_BUKRS FOR RKWA-BUKRS OBLIGATORY MEMORY ID BUK,
  SO_LIFNR FOR RKWA-LIFNR MATCHCODE OBJECT KRED,
  SO_WERKS FOR RKWA-WERKS,
  SO_MATNR FOR RKWA-MATNR MATCHCODE OBJECT MAT1,
  SO_BLDAT FOR RKWA-BLDAT,
  SO_BUDAT FOR RKWA-BUDAT,
  SO_MBLNR FOR RKWA-MBLNR.

SELECTION-SCREEN SKIP.

PARAMETERS:
  PA_XKONS LIKE RM08REP0-KONS_XKONS DEFAULT 'X',
  PA_XPIPE LIKE RM08REP0-KONS_XPIPE DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK AUSWAHL.

* Rahmen "Verarbeitung"
* SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF BLOCK VERARBEITUNG WITH FRAME
                                             TITLE TEXT-002.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERSPA_XANZ LIKE RM08REP0-KONS_XANZ
            RADIOBUTTON GROUP MOD DEFAULT 'X' USER-COMMAND KLICK.
SELECTION-SCREEN COMMENT 3(20TEXT-005 FOR FIELD PA_XANZ.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERSPA_XABR LIKE RM08REP0-KONS_XABR
            RADIOBUTTON GROUP MOD.
SELECTION-SCREEN COMMENT 3(20TEXT-006 FOR FIELD PA_XABR.

SELECTION-SCREEN END OF LINE.
PARAMETERS:
  P_BUDAT LIKE BKPF-BUDAT DEFAULT SY-DATLO OBLIGATORY,
  P_BLDAT LIKE BKPF-BLDAT DEFAULT SY-DATLO OBLIGATORY,
  P_XBLNR LIKE BKPF-XBLNR.
SELECTION-SCREEN END OF BLOCK VERARBEITUNG.

* Rahmen "Anzeigen"
* SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF BLOCK ANZEIGEN WITH FRAME
                                         TITLE TEXT-003.
PARAMETERS:
  PA_XNINV LIKE RM08REP0-KONS_XNINV DEFAULT 'X' MODIF ID K,
  PA_XINV  LIKE RM08REP0-KONS_XINV  DEFAULT SPACE MODIF ID K.
SELECT-OPTIONS:
  SO_BELNR FOR RKWA-BELNR MODIF ID K.
* Protokoll der Nachrichtenfindung
PARAMETERS:
* Anzeigevariante
  PA_VARIA LIKE DISVARIANT-VARIANT MODIF ID K.
SELECTION-SCREEN END OF BLOCK ANZEIGEN.

*---------------------------------------------------------------------**
* Initialization.
*---------------------------------------------------------------------**
INITIALIZATION.

* Schalter Varianten benutzerspezifisch/allgemein speicherbar setzen
  PERFORM VARIANT_INIT.
* Get default variant
  S_VAR_USR S_VARIANT.
  CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET'
    EXPORTING
      I_SAVE     C_SAVE
    CHANGING
      CS_VARIANT S_VAR_USR
    EXCEPTIONS
      NOT_FOUND  2.
  IF SY-SUBRC 0.
    PA_VARIA =  S_VAR_USR-VARIANT.
  ENDIF.


************************************************************************
*   Ereignis AT SELECTION-SCREEN
***********************************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR PA_VARIA.
  PERFORM F4_VARIA CHANGING PA_VARIA.

AT SELECTION-SCREEN.

* Selektion unsinnig?
  IF PA_XKONS SPACE AND
       PA_XPIPE SPACE )
  OR PA_XINV  SPACE AND
       NOT SO_BELNR IS INITIAL )
  OR PA_XANZ AND
       PA_XINV IS INITIAL AND PA_XNINV IS INITIAL ).
    MESSAGE W736.
  ENDIF.

  IF NOT PA_VARIA IS INITIAL.
    MOVE S_VARIANT TO S_VAR_USR.
    MOVE PA_VARIA TO S_VAR_USR-VARIANT.
    CALL FUNCTION 'REUSE_ALV_VARIANT_EXISTENCE'
      EXPORTING
        I_SAVE     C_SAVE
      CHANGING
        CS_VARIANT S_VAR_USR.
    S_VARIANT S_VAR_USR.
  ELSE.
    PERFORM VARIANT_INIT.
  ENDIF.

***********************************************************************
*   Reportablauf
***********************************************************************
START-OF-SELECTION.

* R_STATUS füllen
  CLEAR R_STATUS[].
  IF PA_XNINV ).                 "nicht abgerechnete
    R_STATUS-SIGN   'I'.
    R_STATUS-OPTION 'EQ'.
    R_STATUS-LOW    C_STATUS_NINV.
    R_STATUS-HIGH   SPACE.
    APPEND R_STATUS.
  ENDIF.

  IF PA_XINV ).                  "abgerechnete
    R_STATUS-SIGN   'I'.
    R_STATUS-OPTION 'EQ'.
    R_STATUS-LOW    C_STATUS_INV.
    R_STATUS-HIGH   SPACE.
    APPEND R_STATUS.
  ENDIF.

* R_SOBKZ füllen
  CLEAR R_SOBKZ[].
  IF PA_XKONS ).
    R_SOBKZ-SIGN   'I'.
    R_SOBKZ-OPTION 'EQ'.
    R_SOBKZ-LOW    C_SOBKZ_KONS.                          "K
    R_SOBKZ-HIGH   SPACE.
    APPEND R_SOBKZ.
  ENDIF.

  IF PA_XPIPE ).
    R_SOBKZ-SIGN   'I'.
    R_SOBKZ-OPTION 'EQ'.
    R_SOBKZ-LOW    C_SOBKZ_PIPE.                          "P
    R_SOBKZ-HIGH   SPACE.
    APPEND R_SOBKZ.
  ENDIF.

* SELECT von RKWA
  CLEAR LT_RKWA.
  IF PA_XANZ ).
    SELECT FROM RKWA INTO TABLE LT_RKWA
             WHERE BUKRS  IN SO_BUKRS
               AND LIFNR  IN SO_LIFNR
               AND WERKS  IN SO_WERKS
               AND MATNR  IN SO_MATNR
               AND BLDAT  IN SO_BLDAT
               AND BUDAT  IN SO_BUDAT
               AND MBLNR  IN SO_MBLNR
               AND SOBKZ  IN R_SOBKZ
               AND STATUS IN R_STATUS  "Anzeigeoption
               AND BELNR  IN SO_BELNR"Anzeigeoption
  ELSE.
    SELECT FROM RKWA INTO TABLE LT_RKWA
             WHERE BUKRS  IN SO_BUKRS
               AND LIFNR  IN SO_LIFNR
               AND WERKS  IN SO_WERKS
               AND MATNR  IN SO_MATNR
               AND BLDAT  IN SO_BLDAT
               AND BUDAT  IN SO_BUDAT
               AND MBLNR  IN SO_MBLNR
               AND SOBKZ  IN R_SOBKZ
               AND STATUS C_STATUS_NINV.  "nur nicht abgerechnete!
  ENDIF.

  PERFORM RKWA_PARTITIONIEREN TABLES   LT_RKWA    "--->
                                       GT_BLOCK.  "<---
  CLEAR LT_RKWA.



***********************************************************************
*   Ereignis END-OF-SELECTION
***********************************************************************
END-OF-SELECTION.

* keine Warenentnahme selektiert?
  IF GT_BLOCK IS INITIAL ).
    MESSAGE S702.                    "es wurden keine Belege selektiert
    IF SY-BATCH ).
      LEAVE PROGRAM.                   "LEAVE TO TA ist nicht erlaubt
    ELSE.
      EXIT.
    ENDIF.
  ENDIF.

  IF PA_XANZ ).
    PERFORM ALV_LIST_PREPARE TABLES GT_BLOCK T_ALV_LIST.
    PERFORM ALV_LIST TABLES T_ALV_LIST.
  ELSE.                                " pa_xabr = x
    PERFORM ABRECHNEN TABLES GT_BLOCK.
    PERFORM ALV_LIST_PREPARE TABLES GT_BLOCK T_ALV_LIST.
    PERFORM ALV_LIST TABLES T_ALV_LIST.
  ENDIF.


***********************************************************************
*    allgemeine Form-Routinen
***********************************************************************
*---------------------------------------------------------------------*
*       FORM ALV_LIST_PREPARE
*---------------------------------------------------------------------*
* Ausgabeliste für ALV aus der Tabelle GT_BLOCK bilden                *
*---------------------------------------------------------------------*
FORM ALV_LIST_PREPARE TABLES PTI_BLOCK     TYPE TYP_TAB_BLOCK
                             PTX_ALV_LIST  LIKE T_ALV_LIST.

  DATAS_BLOCK TYPE TYP_BLOCK.
  DATAS_RKWA LIKE RKWA.

  CLEAR:   PTX_ALV_LISTS_BLOCKS_RKWA.
  REFRESHPTX_ALV_LIST.

  LOOP AT PTI_BLOCK INTO S_BLOCK.
    CLEARS_RKWA.
    LOOP AT S_BLOCK-IT_RKWA INTO S_RKWA.
      MOVE-CORRESPONDINGS_BLOCK TO PTX_ALV_LIST.
      MOVE-CORRESPONDINGS_RKWA TO PTX_ALV_LIST.
      PTX_ALV_LIST-ARBGB S_BLOCK-MSGID.
      PTX_ALV_LIST-TXTNR S_BLOCK-MSGNO.
      IF PA_XANZ 'X'.
        IF S_RKWA-STATUS C_STATUS_INV.
          PTX_ALV_LIST-TEXT TEXT-010.
        ELSEIF S_RKWA-STATUS C_STATUS_NINV.
          PTX_ALV_LIST-TEXT TEXT-012.
        ENDIF.
      ENDIF.
      APPENDPTX_ALV_LIST.
      CLEARS_RKWA.
    ENDLOOP.
    CLEARS_BLOCK.
  ENDLOOP.

ENDFORM.                    "alv_list_prepare
*eject
*---------------------------------------------------------------------*
*       FORM EVENTTAB_BUILD                                           *
*---------------------------------------------------------------------*
* Dem ALV-Baustein bekannt geben, daß es zwei Routinen für die        *
* Ausgabe der Listüberschriften:                                      *
* TOP_OF_LIST Überschrift wird einmal am Anfang der Liste ausgegeben  *
*---------------------------------------------------------------------*
FORM EVENTTAB_BUILD USING IT_EVENTS TYPE SLIS_T_EVENT.

  DATAL_EVENT TYPE SLIS_ALV_EVENT.

  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
    EXPORTING
      I_LIST_TYPE 0
    IMPORTING
      ET_EVENTS   IT_EVENTS.

  READ TABLE IT_EVENTS WITH KEY NAME =  SLIS_EV_TOP_OF_LIST
                           INTO L_EVENT.
  IF SY-SUBRC 0.
    MOVE C_TOP_OF_LIST TO L_EVENT-FORM.
    APPEND L_EVENT TO IT_EVENTS.
  ENDIF.
ENDFORM.                    "eventtab_build
*eject
*---------------------------------------------------------------------*
*       FORM MSG_FUELLEN_SYSVAR                                       *
*---------------------------------------------------------------------*
* <---  S_MSG                                                         *
*---------------------------------------------------------------------*
FORM MSG_FUELLEN_SYSVAR CHANGING S_MSG TYPE TYP_MSG.

  CLEAR S_MSG.
  S_MSG-MSGID SY-MSGID.
  S_MSG-MSGTY SY-MSGTY.
  S_MSG-MSGNO SY-MSGNO.
  S_MSG-MSGV1 SY-MSGV1.
  S_MSG-MSGV2 SY-MSGV2.
  S_MSG-MSGV3 SY-MSGV3.
  S_MSG-MSGV4 SY-MSGV4.

ENDFORM.                    "msg_fuellen_sysvar
*---------------------------------------------------------------------*
*      Form RKWA_PARTITIONIEREN
*---------------------------------------------------------------------*
*      Teilt die alle Warenentnahmen in IT_RKWA auf.
*      Die Blöcke werden in IT_BLOCK abgelegt.
* ---> IT_RKWA
* <--- IT_BLOCK
*---------------------------------------------------------------------*
FORM RKWA_PARTITIONIEREN TABLES IT_RKWA  TYPE TYP_TAB_RKWA
                                IT_BLOCK TYPE TYP_TAB_BLOCK.

  DATAS_BLOCK TYPE TYP_BLOCK,
        S_RKWA  LIKE RKWA,
        IDX     LIKE SY-TABIX,
        WRBTR   LIKE RKWA-WRBTR,
        S_MSG   TYPE TYP_MSG.
  DATAF_WAERS  TYPE WAERS,
        F_OBJECT TYPE OBJECT_CURRO.
  DATAF_KURSF LIKE BKPF-KURSF.
  F_OBJECT 'BKPF'.

* baue IT_BLOCK auf (sortiert nach BUKRS/LIFNR)
  CLEAR IT_BLOCK.

* Currency expired --> S_RKWA contains new currency (e.g. EUR) -------*
  LOOP AT IT_RKWA INTO S_RKWA.
    CALL FUNCTION 'CURRENCY_EXPIRATION_CHECK'
      EXPORTING
        CURRENCY      S_RKWA-BWAER
        DATE          SY-DATLO
        OBJECT        F_OBJECT
        BUKRS         S_RKWA-BUKRS
      IMPORTING
        CURRENCY_NEW  F_WAERS
      EXCEPTIONS
        ERROR_MESSAGE 4.
    IF SY-SUBRC 0.
      F_WAERS S_RKWA-BWAER.
    ELSEIF F_WAERS IS INITIAL.
      MESSAGE E607 WITH 'RKWA_PARTITIONIEREN'.
    ENDIF.
    IF S_RKWA-BWAER NE F_WAERS.
      CLEARF_KURSF.
      CALL FUNCTION 'READ_EXCHANGE_RATE'
        EXPORTING
          DATE             SY-DATLO
          FOREIGN_CURRENCY S_RKWA-BWAER
          LOCAL_CURRENCY   F_WAERS
        IMPORTING
          EXCHANGE_RATE    F_KURSF
        EXCEPTIONS
          ERROR_MESSAGE    1.

      IF SY-SUBRC <> ).
        MESSAGE ID SY-MSGID TYPE 'E'
        NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.

      CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
        EXPORTING
          FOREIGN_CURRENCY S_RKWA-BWAER
          LOCAL_CURRENCY   F_WAERS
          FOREIGN_AMOUNT   S_RKWA-WRBTR
          RATE             F_KURSF
          DATE             SY-DATLO
        IMPORTING
          LOCAL_AMOUNT     S_RKWA-WRBTR
        EXCEPTIONS
          ERROR_MESSAGE    1.

      IF SY-SUBRC <> ).
        MESSAGE ID SY-MSGID TYPE 'E'
        NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.

      IF NOT S_RKWA-NAVNW IS INITIAL.
        CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
          EXPORTING
            FOREIGN_CURRENCY S_RKWA-BWAER
            LOCAL_CURRENCY   F_WAERS
            FOREIGN_AMOUNT   S_RKWA-NAVNW
            RATE             F_KURSF
            DATE             SY-DATLO
          IMPORTING
            LOCAL_AMOUNT     S_RKWA-NAVNW
          EXCEPTIONS
            ERROR_MESSAGE    1.

        IF SY-SUBRC <> ).
          MESSAGE ID SY-MSGID TYPE 'E'
          NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
        ENDIF.
      ENDIF.
    ENDIF.
    S_RKWA-BWAER F_WAERS.

    READ TABLE IT_BLOCK INTO S_BLOCK
                        WITH KEY BUKRS S_RKWA-BUKRS
                                 LIFNR S_RKWA-LIFNR
                                 BWAER S_RKWA-BWAER
                        BINARY SEARCH.
    IDX SY-TABIX.
    IF SY-SUBRC <> ).              "Block noch nicht vorhanden
      CLEAR S_BLOCK.
      S_BLOCK-BSTAT C_BSTAT_NULL.
      S_BLOCK-BUKRS S_RKWA-BUKRS.
      S_BLOCK-LIFNR S_RKWA-LIFNR.
      S_BLOCK-BWAER S_RKWA-BWAER.
      APPEND S_RKWA TO S_BLOCK-IT_RKWA.
      INSERT S_BLOCK INTO IT_BLOCK INDEX IDX.  "Tab. bleibt sortiert!
    ELSE.                              "Block bereits vorhanden
      APPEND S_RKWA TO S_BLOCK-IT_RKWA.
      MODIFY IT_BLOCK FROM S_BLOCK INDEX IDX.
    ENDIF.
  ENDLOOP.

* rkwa_pruefen
  LOOP AT IT_BLOCK INTO S_BLOCK.
    CLEARS_RKWA.
    LOOP AT S_BLOCK-IT_RKWA INTO S_RKWA.
      IF S_RKWA-SOBKZ <> C_SOBKZ_KONS AND
     S_RKWA-SOBKZ <> C_SOBKZ_PIPE ).
        CLEAR S_MSG.
        S_MSG-MSGID C_MSGID_M8.
        S_MSG-MSGTY C_MSGTY_ERROR.
        S_MSG-MSGNO '008'.
        S_MSG-MSGV1 'RKWA_PARTITIONIEREN'.
        EXIT.
      ENDIF.
    ENDLOOP.
    MOVE-CORRESPONDING S_MSG TO S_BLOCK.
    MODIFY IT_BLOCK FROM S_BLOCK.
  ENDLOOP.

* Partitionen sortieren
  LOOP AT IT_BLOCK INTO S_BLOCK.
    SORT S_BLOCK-IT_RKWA BY MJAHR MBLNR ZEILE.
    MODIFY IT_BLOCK FROM S_BLOCK.
  ENDLOOP.

ENDFORM.                    "rkwa_partitionieren
*eject
*---------------------------------------------------------------------*
*       FORM LONG_MESSAGE_SHOW                                        *
*---------------------------------------------------------------------*
*   Langtext der Meldungen in der Ausgabeliste anzeigen               *
*---------------------------------------------------------------------*
FORM LONG_TEXT_MESSAGE_SHOW USING I_ALV_LIST TYPE MRM_CON_ALV.

  DATA:    T_DUMMY LIKE TLINE OCCURS 1,
           DOKNAME LIKE DOKIL-OBJECT,                       "CHAR60
           TITLE   LIKE DSYST-DOKTITLE,
           DYNNR   LIKE HELP_INFO-DYNPRO,
           PFKEY   LIKE HELP_INFO-PFKEY.

* System-Felder kopieren/konvertieren
  TITLE SY-TITLE.
  DYNNR SY-DYNNR.
  PFKEY SY-PFKEY.

* Dokumentname konstuieren
  CALL FUNCTION 'DOCU_OBJECT_NAME_CONCATENATE'
    EXPORTING
      DOCU_ID  C_DOKCLASS_NA
      ELEMENT  I_ALV_LIST-ARBGB
      ADDITION I_ALV_LIST-TXTNR
    IMPORTING
      OBJECT   DOKNAME.

* Aufruf Popup mit dem Langtext der Meldung
  CALL FUNCTION 'HELP_OBJECT_SHOW'
    EXPORTING
      DOKCLASS          C_DOKCLASS_NA
      DOKNAME           DOKNAME
      DOKTITLE          TITLE
      CALLED_BY_PROGRAM C_REPID
      CALLED_BY_DYNP    DYNNR
      MSG_VAR_1         I_ALV_LIST-MSGV1
      MSG_VAR_2         I_ALV_LIST-MSGV2
      MSG_VAR_3         I_ALV_LIST-MSGV3
      MSG_VAR_4         I_ALV_LIST-MSGV4
      CALLED_BY_CUAPROG C_REPID
      CALLED_BY_CUASTAT PFKEY
    TABLES
      LINKS             T_DUMMY.

ENDFORM.                    "long_text_message_show

*---------------------------------------------------------------------*
*       FORM LONG_TEXT_MESSAGE_PREPARE                                *
*---------------------------------------------------------------------*
*  ermittelt den Text zu einer von einem Funktionsbaustein zurückge-  *
*  lieferten Fehlermeldung                                            *
*---------------------------------------------------------------------*
* Parameter:                                                          *
* <-> px_mesg: Struktur MESG; enthält die aufzubereitende Fehlermel-  *
*              dung; im Fehlerfall wird eine Default-Meldung abgelegt *
*---------------------------------------------------------------------*
FORM LONG_TEXT_MESSAGE_PREPARE CHANGING I_MESG STRUCTURE MESG.

  DATAH_MTEXT LIKE SY-LISEL,
        H_MSGNO LIKE SY-MSGNO.

  MOVE I_MESG-TXTNR TO H_MSGNO.

  CALL FUNCTION 'RPY_MESSAGE_COMPOSE'
    EXPORTING
      MESSAGE_ID        I_MESG-ARBGB
      MESSAGE_NUMBER    H_MSGNO
      MESSAGE_VAR1      I_MESG-MSGV1
      MESSAGE_VAR2      I_MESG-MSGV2
      MESSAGE_VAR3      I_MESG-MSGV3
      MESSAGE_VAR4      I_MESG-MSGV4
    IMPORTING
      MESSAGE_TEXT      H_MTEXT
    EXCEPTIONS
      MESSAGE_NOT_FOUND 1
      OTHERS            2.

  IF SY-SUBRC 0.
    MOVE H_MTEXT(73TO I_MESG-TEXT.
  ELSE.
    CALL FUNCTION 'RPY_MESSAGE_COMPOSE'
      EXPORTING
        MESSAGE_ID        SY-MSGID
        MESSAGE_NUMBER    SY-MSGNO
        MESSAGE_VAR1      SY-MSGV1
        MESSAGE_VAR2      SY-MSGV2
        MESSAGE_VAR3      SY-MSGV3
        MESSAGE_VAR4      SY-MSGV4
      IMPORTING
        MESSAGE_TEXT      H_MTEXT
      EXCEPTIONS
        MESSAGE_NOT_FOUND 1
        OTHERS            2.
    IF SY-SUBRC EQ 0.
      I_MESG-TEXT H_MTEXT(73).
    ELSE.
* Ooops, no text!.
*   message x062 with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ?
      CLEAR I_MESG-TEXT .
    ENDIF.
  ENDIF.

ENDFORM.                               "LONG_TEXT_MESSAGE_PREPARE
***********************************************************************
*    Form-Routinen zur Ausgabe
***********************************************************************

*---------------------------------------------------------------------*
*       FORM ALV_LIST                                                 *
*---------------------------------------------------------------------*
* Protokoll in Form von ALV-Liste ausgeben                            *
*---------------------------------------------------------------------*
* Parameter:                                                          *
* <-> T_ALV_LIST                                                    *
*---------------------------------------------------------------------*
FORM ALV_LIST TABLES T_ALV_LIST LIKE T_ALV_LIST.

  DATATAB_FIELDCAT TYPE  SLIS_T_FIELDCAT_ALV,     " Feldkatalog
        TAB_SORT     TYPE  SLIS_T_SORTINFO_ALV,
        S_LAYOUT     TYPE  SLIS_LAYOUT_ALV,
        TAB_EVENTS   TYPE  SLIS_T_EVENT,
        S_MESG       LIKE  MESG.

  CONSTANTS:
    C_PF_STATUS_SET TYPE SLIS_FORMNAME VALUE 'PF_STATUS_SET',
    C_USER_COMMAND  TYPE SLIS_FORMNAME VALUE 'USER_COMMAND'.

  S_LAYOUT-COLWIDTH_OPTIMIZE 'X'.
  S_LAYOUT-ZEBRA             'X'.
  S_LAYOUT-BOX_FIELDNAME     'BOX'.
  S_LAYOUT-GROUP_CHANGE_EDIT 'X'.
  S_LAYOUT-F2CODE            'DISPLAY'.

  PERFORM FIELD_CATALOG_BUILD TABLES TAB_FIELDCAT.
  PERFORM EVENTTAB_BUILD USING TAB_EVENTS.

*-- Meldungstexte in Segtab-text aufbauen -----*
  LOOP AT T_ALV_LIST WHERE TEXT IS INITIAL.
    MOVE-CORRESPONDING T_ALV_LIST TO S_MESG.
    PERFORM LONG_TEXT_MESSAGE_PREPARE CHANGING S_MESG.
    T_ALV_LIST-TEXT S_MESG-TEXT.
    MODIFY T_ALV_LIST.
  ENDLOOP.

*-- Bei Gutschrift Menge und Betrag mit Vorzeichen darstellen --*
  LOOP AT T_ALV_LIST WHERE SHKZG C_SHKZG_SOLL.
    T_ALV_LIST-WRBTR T_ALV_LIST-WRBTR.
    T_ALV_LIST-BSTMG T_ALV_LIST-BSTMG.
    MODIFY T_ALV_LIST.
  ENDLOOP.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_BUFFER_ACTIVE          SPACE
      I_CALLBACK_PROGRAM       C_REPID
      I_CALLBACK_PF_STATUS_SET C_PF_STATUS_SET
      I_CALLBACK_USER_COMMAND  C_USER_COMMAND
      I_STRUCTURE_NAME         'T_ALV_LIST'
      IT_FIELDCAT              TAB_FIELDCAT[]
      IT_SORT                  TAB_SORT[]
      IS_LAYOUT                S_LAYOUT
      I_SAVE                   C_SAVE
      IS_VARIANT               S_VARIANT
      IT_EVENTS                TAB_EVENTS[]
    TABLES
      T_OUTTAB                 T_ALV_LIST.

ENDFORM.                               "ALV_LIST
*eject

***********************************************************************
*    Form-Routinen zum ABRECHNEN
***********************************************************************


*---------------------------------------------------------------------*
*      Form ABRECHNEN
*---------------------------------------------------------------------*
*      Rechnet alle selektierten Warenentnahmen ab.
* ---> IT_BLOCK
*---------------------------------------------------------------------*
FORM ABRECHNEN TABLES IT_BLOCK TYPE TYP_TAB_BLOCK.

  DATAS_BLOCK  TYPE TYP_BLOCK,
        S_MSG    TYPE TYP_MSG,
        BLART    LIKE T169F-BLART,
        X_FEHLER TYPE C.

  PERFORM BELEGART_BESTIMMEN CHANGING BLART
                                      S_MSG
                                      X_FEHLER.

  IF X_FEHLER X.
    LOOP AT IT_BLOCK INTO S_BLOCK.
      MOVE-CORRESPONDING S_MSG TO S_BLOCK.
      MODIFY IT_BLOCK FROM S_BLOCK.
    ENDLOOP.
    EXIT.
  ENDIF.

  LOOP AT IT_BLOCK INTO S_BLOCK.
    PERFORM BLOCK_ABRECHNEN TABLES S_BLOCK-IT_RKWA   "--->
                             USING S_BLOCK-BUKRS     "--->
                                   S_BLOCK-BWAER     "--->
                          CHANGING S_MSG
                                   X_FEHLER          "<---
                                   BLART
                                   S_BLOCK-LIFNR
                                   S_BLOCK-BELNR     "<---
                                   S_BLOCK-GJAHR.    "<---
*   Block-Status setzen
    IF X_FEHLER ).
      S_BLOCK-BSTAT C_BSTAT_FEHLER.
      CLEARS_BLOCK-BELNRS_BLOCK-GJAHR.
      MOVE-CORRESPONDING S_MSG TO S_BLOCK.
      ROLLBACK WORK.
    ELSE.
      CLEAR S_MSG.
      S_BLOCK-MSGID C_MSGID_M8.
      S_BLOCK-MSGTY C_MSGTY_SUCCESS.
      S_BLOCK-MSGNO '327'.
      S_BLOCK-BSTAT C_BSTAT_OK.
      COMMIT WORK.
    ENDIF.

    MODIFY IT_BLOCK FROM S_BLOCK.
  ENDLOOP.

ENDFORM.                    "abrechnen

*---------------------------------------------------------------------*
*       FORM BELEGART_BESTIMMEN                                       *
*---------------------------------------------------------------------*
*       bestimmt Belegart des Rechnungsbeleges anhand der Transaktion *
*---------------------------------------------------------------------*
*  <--- BLART Belegart
*---------------------------------------------------------------------*
FORM BELEGART_BESTIMMEN CHANGING BLART    LIKE T169F-BLART
                                 S_MSG    TYPE TYP_MSG
                                 X_FEHLER TYPE C.
  DATAS_T169F LIKE T169F.

* lese Belegart aus T169F
  CALL FUNCTION 'MRM_DBTAB_T169F_READ'
    EXPORTING
      I_TCODE       C_TCODE_MRKO
    IMPORTING
      E_T169F       S_T169F
    EXCEPTIONS
      ERROR_MESSAGE 1.

  IF SY-SUBRC <> ).
    PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
    X_FEHLER X.
    EXIT.
  ENDIF.
  BLART S_T169F-BLART.

ENDFORM.                    "belegart_bestimmen

*---------------------------------------------------------------------*
*      Form BLOCK_ABRECHNEN
*---------------------------------------------------------------------*
*      Bucht für einen 'Block' von Warenentnahmen genau eine
*      Rechnung. Alle WEs befinden sich in IT_RKWA.
*      Alle WEs sind demselben Buchungskreis/Kreditor BUKRS/LIFNR
*      zugeordnet.
*      Auf die RKWA wird ein DB-Update durchgeführt (-> MR01)
* ---> BUKRS, LIFNR, BWAER: Block
*      BLART:        Belegart
* <--> IT_RKWA:      Warenentnahmen (es werden BELNR und BUZEI gefüllt)
* <--- IT_MSG:       Meldungen
*      BELNR, GJAHR: Rechnungsbeleg
*---------------------------------------------------------------------*
FORM BLOCK_ABRECHNEN TABLES IT_RKWA  TYPE TYP_TAB_RKWA  "<-->
                      USING BUKRS    LIKE RKWA-BUKRS    "--->
                            BWAER    LIKE RKWA-BWAER    "--->
                   CHANGING S_MSG    TYPE TYP_MSG
                            X_FEHLER TYPE C
                            BLART    LIKE T169F-BLART
                            LIFNR    LIKE RKWA-LIFNR
                            BELNR    LIKE RKWA-BELNR    "<---
                            GJAHR    LIKE RKWA-GJAHR.   "<---

  DATATAB_BKPF      TYPE TYP_TAB_BKPF,
        TAB_BSEG      TYPE TYP_TAB_BSEG,
        TAB_BSET      TYPE TYP_TAB_BSET,
        IT_TAX        TYPE TYP_TAB_TAX,
        TAB_RBWS      TYPE TYP_TAB_RBWS,
        S_BKPF        LIKE BKPF,
        S_BSEG        LIKE BSEG,
        S_RKWA        LIKE RKWA,
        S_TAX         TYPE TYP_TAX,
        S_T001        LIKE T001,
        GSBER         LIKE BSEG-GSBER,
        SGTXT         LIKE RBSEG-SGTXT,
        WRBTR_TMP     LIKE BSEG-WRBTR"temporär benutzter Betrag
        X_UEBERNEHMEN TYPE C,
        F_MONAT       LIKE BKPF-MONAT,
        S_T003        LIKE T003,
        LIFNR_RKWA    LIKE RKWA-LIFNR.

*----- Vorbereitungen -------------------------------------------------

  PERFORM LOCK_RKWA TABLES    IT_RKWA
                    CHANGING  X_FEHLER
                              S_MSG.

  IF X_FEHLER EQ 'X'.
    EXIT.
  ENDIF.

* re-read RKWA after the lock was set
* Is the RKWA entry still not settled?
  LOOP AT IT_RKWA INTO S_RKWA.
    SELECT SINGLE FROM RKWA
      WHERE MBLNR S_RKWA-MBLNR
        AND MJAHR S_RKWA-MJAHR
        AND ZEILE S_RKWA-ZEILE
        AND STATUS C_STATUS_NINV"not settled
    IF SY-SUBRC NE 0.
      IF 2.
        MESSAGE E863(M8).
*       The material document is already settled.
      ENDIF.
      CLEAR S_MSG.
      S_MSG-MSGID C_MSGID_M8.
      S_MSG-MSGTY C_MSGTY_ERROR.
      S_MSG-MSGNO '863'.
      S_MSG-MSGV1 S_RKWA-MBLNR.
      S_MSG-MSGV2 S_RKWA-MJAHR.
      X_FEHLER X.
      EXIT.
    ENDIF.
  ENDLOOP.

  IF X_FEHLER EQ 'X'.
    EXIT.
  ENDIF.

* bestimme Währungsschlüssel aus T001
  CALL FUNCTION 'FI_COMPANY_CODE_DATA'
    EXPORTING
      I_BUKRS BUKRS
    IMPORTING
      E_T001  S_T001
    EXCEPTIONS
      OTHERS  1.
  IF SY-SUBRC <> ).
    PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
    X_FEHLER X.
    EXIT.                              "---------->
  ENDIF.

* table IT_TAX fill
  PERFORM MWSKZ_TXJCD_PREFETCH TABLES IT_RKWA   "--->
                                      IT_TAX    "<---
                                USING LIFNR     "--->
                             CHANGING X_FEHLER  "<---
                                      S_MSG.    "<---
  IF X_FEHLER ).
    EXIT.                              "---------->
  ENDIF.


*----- Rechnungsdaten füllen -------------------------------------------

  CLEARTAB_BKPF,
         TAB_BSEG,
         TAB_BSET,
         TAB_RBWS,
         S_T003,
         LIFNR_RKWA.

  LIFNR_RKWA LIFNR.                  " for update in table RKWA

* in user-exit change document type and vendor
  PERFORM BADI_HEADERDATA_MODIFY TABLES IT_RKWA
                                 USING BUKRS
                              CHANGING BLART
                                       LIFNR
                                       X_FEHLER
                                       S_MSG.

  IF X_FEHLER ).
    EXIT.
  ENDIF.


*--- check Document type
  PERFORM DOCUMENT_TYPE_CHECK USING BLART
                           CHANGING S_T003
                                    X_FEHLER
                                    S_MSG.

  IF X_FEHLER ).
    EXIT.
  ENDIF.

* header data
  PERFORM HEADER_DATA_FILL TABLES TAB_BKPF
                            USING BLART
                                  BUKRS
                                  BWAER
                                  S_T001
                         CHANGING GJAHR
                                  F_MONAT.

* item data
  PERFORM ITEM_DATA_FILL TABLES TAB_BKPF
                                TAB_BSEG
                                TAB_BSET
                                IT_RKWA
                                IT_TAX
                                TAB_RBWS
                          USING BUKRS
                                GJAHR
                                LIFNR_RKWA
                                BWAER
                                S_T001
                                S_T003
                       CHANGING X_FEHLER
                                S_MSG
                                LIFNR" Zentrale als Rechnungssteller

  IF X_FEHLER ).
    EXIT.
  ENDIF.

* per user-exit Daten verändern
  PERFORM USER_EXIT001_AUFRUFEN TABLES TAB_BKPF    "<-->
                                       TAB_BSEG    "<-->
                                       TAB_BSET    "<-->
                                       IT_RKWA     "--->
                                 USING BUKRS       "--->
                                       LIFNR       "--->
                              CHANGING X_FEHLER
                                       S_MSG
                                       GJAHR
                                       F_MONAT.

  IF X_FEHLER ).
    EXIT.
  ENDIF.

*----- buche Rechnung --------------------------------------------------

* per user-exit das Customer-Include der RKWA füllen
  PERFORM USER_EXIT002_AUFRUFEN TABLES  IT_RKWA
                                CHANGING X_FEHLER
                                         S_MSG.

  IF X_FEHLER ).
    EXIT.
  ENDIF.

  PERFORM VENDOR_TAXNUM_CHECK TABLES IT_RKWA
                               USING S_T001
                                     LIFNR
                            CHANGING X_FEHLER
                                     S_MSG.

  IF X_FEHLER ).
    EXIT.
  ENDIF.

  PERFORM NULL_LINES_CHECK TABLES TAB_BSEG
                         CHANGING X_FEHLER
                                  S_MSG.

  IF X_FEHLER ).
    EXIT.
  ENDIF.

  PERFORM INVOICE_POST TABLES TAB_BKPF
                              TAB_BSEG
                              TAB_BSET
                              IT_RKWA
                              IT_TAX
                              TAB_RBWS
                        USING BLART
                              GJAHR
                              F_MONAT
                              BUKRS
                              LIFNR_RKWA
                              S_T003
                     CHANGING BELNR
                              X_FEHLER
                              S_MSG.

  IF X_FEHLER ).
    EXIT.
  ENDIF.

ENDFORM.                    "block_abrechnen


*---------------------------------------------------------------------*
*       FORM EKORG_BESTIMMEN                                          *
*---------------------------------------------------------------------*
*  -->  LIFNR, WERKS, MATNR, SOBKZ (Sonderbestandskennzeichen)
*  <--  EKORG: ermittelte Einkaufsorganisation,
*              wurde keines ermittelt, so ist es SPACE
*---------------------------------------------------------------------*
FORM EKORG_BESTIMMEN USING WERKS LIKE RKWA-WERKS
                           SOBKZ LIKE RKWA-SOBKZ
                  CHANGING EKORG LIKE EINE-EKORG.

  DATAX_KONSI TYPE C,                "->ME_PRICING_TAX_INDICATOR
        X_PIPEL TYPE C.                "dito

  IF SOBKZ C_SOBKZ_KONS ).
    X_KONSI X.
    X_PIPEL SPACE.
  ELSE.
    X_KONSI SPACE.
    X_PIPEL X.
  ENDIF.

* berechne EKORG
  CALL FUNCTION 'ME_SELECT_EKORG_FOR_PLANT'
    EXPORTING
      I_WERKS          WERKS
      I_PIPEL          X_PIPEL
      I_KONSI          X_KONSI
    IMPORTING
      E_EKORG          EKORG
    EXCEPTIONS
      NO_ENTRY_FOUND   1
      NO_DEFAULT_FOUND 2.

  IF SY-SUBRC <> ).
    CLEAR EKORG.
  ENDIF.

ENDFORM.                    "ekorg_bestimmen
*eject
*---------------------------------------------------------------------*
*       FORM FIELD_CATALOG_BUILD                                      *
*---------------------------------------------------------------------*
*   FELDKATALOG FÜR AUSGABE DER LISTE AUFBAUEN                        *
*   HIER WIRD DEM ALV-BAUSTEIN BEKANNT GEGEBEN WIE DIE SPALTEN DER    *
*   LISTE AUSSEHEN SOLLEN                                             *
*---------------------------------------------------------------------*
FORM FIELD_CATALOG_BUILD TABLES
                            T_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.

*-- Fieldcatalog create automatically --------------------------------*

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      I_PROGRAM_NAME     C_REPID
      I_INTERNAL_TABNAME 'RKWA'
      I_STRUCTURE_NAME   'ZCONALV'
    CHANGING
      CT_FIELDCAT        T_FIELDCAT[].

  LOOP AT T_FIELDCAT.
    CASE T_FIELDCAT-FIELDNAME.

      WHEN 'BSTME'.
        T_FIELDCAT-SELTEXT_L TEXT-116.
        T_FIELDCAT-SELTEXT_M TEXT-116.
        T_FIELDCAT-SELTEXT_S TEXT-116.
        T_FIELDCAT-REPTEXT_DDIC TEXT-116.

      WHEN 'BSTMG'.
        T_FIELDCAT-SELTEXT_L TEXT-115.
        T_FIELDCAT-SELTEXT_M TEXT-115.
        T_FIELDCAT-SELTEXT_S TEXT-115.
        T_FIELDCAT-REPTEXT_DDIC TEXT-115.

      WHEN 'BUKRS'.                    " Kopffeld andere Farbe
        T_FIELDCAT-EMPHASIZE 'X'.

      WHEN 'LIFNR'.                    " Kopffeld andere Farbe
        T_FIELDCAT-EMPHASIZE 'X'.

      WHEN 'TEXT'.

        T_FIELDCAT-SELTEXT_L TEXT-007"Informationstext
        T_FIELDCAT-SELTEXT_M TEXT-008"Infotext
        T_FIELDCAT-SELTEXT_S TEXT-008.
        T_FIELDCAT-REPTEXT_DDIC TEXT-008.

      WHEN 'WRBTR'.

        T_FIELDCAT-SELTEXT_L TEXT-117.
        T_FIELDCAT-SELTEXT_M TEXT-117.
        T_FIELDCAT-SELTEXT_S TEXT-117.
        T_FIELDCAT-REPTEXT_DDIC TEXT-117.
      WHEN 'ZZJSJE'.
        T_FIELDCAT-EDIT 'X'.

      WHEN 'BELNR'.

        T_FIELDCAT-HOTSPOT 'X'.

      WHEN 'MBLNR'.

        T_FIELDCAT-HOTSPOT 'X'.

    ENDCASE.
    MODIFY T_FIELDCAT.

  ENDLOOP.

ENDFORM.                    "field_catalog_build
*eject
*---------------------------------------------------------------------*
*       FORM MWSKZ_BESTIMMEN                                          *
*---------------------------------------------------------------------*
*       Bestimmt das Steuerkennzeichen über den Einkaufsinfosatz      *
*---------------------------------------------------------------------*
*  -->  LIFNR, WERKS, MATNR, SOBKZ (Sonderbestandskennzeichen)
*  <--  MWSKZ: ermitteltes SteuerKz, wurde keines ermittelt, so ist
*              es SPACE
*---------------------------------------------------------------------*
FORM MWSKZ_BESTIMMEN USING LIFNR LIKE RKWA-LIFNR
                           WERKS LIKE RKWA-WERKS
                           MATNR LIKE RKWA-MATNR
                           SOBKZ LIKE RKWA-SOBKZ
                           EKORG LIKE EINE-EKORG
                  CHANGING MWSKZ LIKE EINE-MWSKZ.

  DATAS_MEICO LIKE MEICO,
        S_EINE  LIKE EINE,
        ESOKZ   LIKE EINE-ESOKZ.       "Typ des Infosatzes

  IF SOBKZ C_SOBKZ_KONS ).
    ESOKZ C_ESOKZ_KONS.
  ELSE.
    ESOKZ C_ESOKZ_PIPE.
  ENDIF.

* Konsi-/Pipeline-Infosatz lesen
  CLEAR S_MEICO.
  S_MEICO-ESOKZ ESOKZ.
  S_MEICO-EKORG EKORG.
  S_MEICO-WERKS WERKS.
  S_MEICO-LIFNR LIFNR.
  S_MEICO-MATNR MATNR.
  S_MEICO-ONLYE SPACE.               "sonst geht's nicht!

*{   INSERT
*Note 663537: Variants don't have info records! Look for generic article
  PERFORM WRF_READ_INFORECORD_SA_PREPARE CHANGING S_MEICO.
*}   INSERT

  CALL FUNCTION 'ME_READ_INFORECORD'
    EXPORTING
      INCOM         S_MEICO
    IMPORTING
      EINEDATEN     S_EINE
    EXCEPTIONS
      ERROR_MESSAGE 1          "nicht auswerten!
      OTHERS        2.

  IF SY-SUBRC ).
    MWSKZ S_EINE-MWSKZ.
  ELSE.
    CLEAR MWSKZ.
  ENDIF.

ENDFORM.                    "mwskz_bestimmen


*---------------------------------------------------------------------*
*   Form MWSKZ_TXJCD_PREFETCH
*---------------------------------------------------------------------*
*   berechne vorsorglich SteuerKz & Tax Jurisdiction Code für alle
*   vorkommenden Kombinationen von Material, Werk & Lieferant.
*   Die StKz werden in IT_tax abgelegt
*   ---> BUKRS, LIFNR, IT_RKWA: Block
*   <--- IT_TAX:   Steuerkennzeichen
*        X_FEHLER: Fehler aufgetreten?
*        S_MSG:    Meldung
*---------------------------------------------------------------------*
FORM MWSKZ_TXJCD_PREFETCH TABLES IT_RKWA  TYPE TYP_TAB_RKWA
                                 IT_TAX   TYPE TYP_TAB_TAX
                           USING LIFNR    LIKE BSEG-LIFNR
                        CHANGING X_FEHLER TYPE C
                                 S_MSG    TYPE TYP_MSG.

  DATAS_T001W LIKE T001W,
        S_RKWA  LIKE RKWA,
        S_TAX   TYPE TYP_TAX,
        EKORG   LIKE EINE-EKORG.

  X_FEHLER SPACE.
  CLEAR IT_TAX.

* für alle RKWA-Einträge: bestimme StKz + TaxJcd
  LOOP AT IT_RKWA INTO S_RKWA.

    CLEAR S_TAX.
    S_TAX-MATNR S_RKWA-MATNR.
    S_TAX-WERKS S_RKWA-WERKS.
    S_TAX-LIFNR LIFNR.

*   bestimme Tax Jurisdiction Code über das Werk
    CALL FUNCTION 'LOCATION_SELECT_PLANT'
      EXPORTING
        I_WERKS       S_RKWA-WERKS
      IMPORTING
        O_T001W       S_T001W
      EXCEPTIONS
        ERROR_MESSAGE 1
        OTHERS        2.

    IF SY-SUBRC <> ).
      PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
      X_FEHLER X.
      EXIT.                            "---------->
    ENDIF.
    S_TAX-TXJCD S_T001W-TXJCD.

*   bestimme Steuerkennzeichen ...
    IF S_RKWA-MWSKZ IS INITIAL.        "vor 4.5A nicht in der RKWA
*   ... über Infosatz
      PERFORM EKORG_BESTIMMEN USING S_RKWA-WERKS
                                    S_RKWA-SOBKZ
                           CHANGING EKORG.

      IF EKORG SPACE ).
        S_TAX-MWSKZ SPACE.
      ELSE.
        PERFORM MWSKZ_BESTIMMEN USING LIFNR
                                      S_RKWA-WERKS
                                      S_RKWA-MATNR
                                      S_RKWA-SOBKZ
                                      EKORG
                             CHANGING S_TAX-MWSKZ.
      ENDIF.

      IF S_TAX-MWSKZ SPACE ).      "kein StKz bestimmt
        CLEAR S_MSG.
        S_MSG-MSGID C_MSGID_M8.
        S_MSG-MSGTY C_MSGTY_ERROR.
        S_MSG-MSGNO '732'.
        S_MSG-MSGV1 LIFNR.
        S_MSG-MSGV2 S_RKWA-MATNR.
        S_MSG-MSGV3 S_RKWA-WERKS.
        S_MSG-MSGV4 EKORG.
        X_FEHLER X.
        EXIT.                          "---------->
      ENDIF.
      S_RKWA-MWSKZ S_TAX-MWSKZ.
      MODIFY IT_RKWA FROM S_RKWA TRANSPORTING MWSKZ.
    ELSE.
*   ... über Eintrag in der RKWA
      S_TAX-MWSKZ S_RKWA-MWSKZ.      "ab 4.5A in der RKWA
    ENDIF.

    COLLECT S_TAX INTO IT_TAX.
  ENDLOOP.                             "at it_rkwa

ENDFORM.                    "mwskz_txjcd_prefetch
*---------------------------------------------------------------------*
*       FORM PF_STATUS_SET                                            *
*---------------------------------------------------------------------*
*  Status der Liste setzen                                            *
*---------------------------------------------------------------------*
FORM PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.

  CLEAR RT_EXTAB.

  SET PF-STATUS '0001' EXCLUDING RT_EXTAB.

ENDFORM.                    "pf_status_set
*eject
*---------------------------------------------------------------------*
*       Form  USER_COMMAND                                            *
*---------------------------------------------------------------------*
*   Reaktion auf Funktionscodes:                                      *
*    Bestellung anzeigen                                              *
*    Rechnungsbeleg anzeigen                                          *
*    Zeilen aus dem ERS ausschließen                                  *
*    Langtext der Meldungen anzeigen                                  *
*---------------------------------------------------------------------*
FORM USER_COMMAND USING F_UCOMM LIKE SY-UCOMM
                  I_SELFIELD TYPE SLIS_SELFIELD.            "#EC CALLED

  DATAF_ANSWER,
        F_EKORG    LIKE EINE-EKORG,
        F_ESOKZ    LIKE EINE-ESOKZ,
        S_ALV_LIST TYPE MRM_CON_ALV.

  CLEARS_ALV_LIST.

  READ TABLE T_ALV_LIST INDEX I_SELFIELD-TABINDEX INTO S_ALV_LIST.

  CASE F_UCOMM.

    WHEN 'FB03'.                       " Buchhaltungsbeleg anzeigen
      CHECK NOT S_ALV_LIST-BELNR IS INITIAL.
      SET PARAMETER ID 'BLN' FIELD S_ALV_LIST-BELNR.
      SET PARAMETER ID 'GJR' FIELD S_ALV_LIST-GJAHR.
      SET PARAMETER ID 'BUK' FIELD S_ALV_LIST-BUKRS.
      CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.

    WHEN 'MB03'.
      SET PARAMETER ID 'MBN' FIELD S_ALV_LIST-MBLNR.
      SET PARAMETER ID 'MJA' FIELD S_ALV_LIST-MJAHR.
      CALL FUNCTION 'MIGO_DIALOG'
        EXPORTING
          I_ACTION            'A04'
          I_REFDOC            'R02'
          I_NOTREE            'X'
          I_SKIP_FIRST_SCREEN 'X'
          I_DEADEND           'X'
          I_MBLNR             S_ALV_LIST-MBLNR
          I_MJAHR             S_ALV_LIST-MJAHR.

    WHEN 'ME13'.                       " Infosatz anzeigen

      PERFORM EKORG_BESTIMMEN USING S_ALV_LIST-WERKS
                                    S_ALV_LIST-SOBKZ
                           CHANGING F_EKORG.

      IF S_ALV_LIST-SOBKZ C_SOBKZ_KONS.
        F_ESOKZ C_ESOKZ_KONS.
      ELSE.
        F_ESOKZ C_ESOKZ_PIPE.
      ENDIF.

      SET PARAMETER ID 'ESO' FIELD F_ESOKZ.
      SET PARAMETER ID 'LIF' FIELD S_ALV_LIST-LIFNR.
      SET PARAMETER ID 'MAT' FIELD S_ALV_LIST-MATNR.
      SET PARAMETER ID 'EKO' FIELD F_EKORG.
      SET PARAMETER ID 'WRK' FIELD S_ALV_LIST-WERKS.
      CALL TRANSACTION 'ME13' AND SKIP FIRST SCREEN.

    WHEN 'MELD'.                       " Langtext der Meldung anzeigen
      PERFORM LONG_TEXT_MESSAGE_SHOW USING S_ALV_LIST.

    WHEN 'MM03'.                       " Materialstammsatz anzeigen
      SET PARAMETER ID 'MAT' FIELD S_ALV_LIST-MATNR.
      SET PARAMETER ID 'WRK' FIELD S_ALV_LIST-WERKS.
      CALL TRANSACTION 'MM03'.         "AND SKIP FIRST SCREEN.

    WHEN 'MK03'.                       " Kreditor anzeigen
      SET PARAMETER ID 'LIF' FIELD S_ALV_LIST-LIFNR.
      SET PARAMETER ID 'KDY' FIELD '/110'.
      CALL TRANSACTION 'MK03' AND SKIP FIRST SCREEN.

    WHEN 'MR91'.                       " Nachrichten anzeigen
      SET PARAMETER ID 'NAC' FIELD C_KSCHL_KONS.
      SET PARAMETER ID 'BLN' FIELD S_ALV_LIST-BELNR.
      CALL TRANSACTION 'MR91'.         "AND SKIP FIRST SCREEN.

    WHEN 'DISPLAY'.                    " Auf Doppelklick reagierien
      CASE I_SELFIELD-SEL_TAB_FIELD.
        WHEN 'RKWA-MBLNR'.
          SET PARAMETER ID 'MBN' FIELD S_ALV_LIST-MBLNR.
          SET PARAMETER ID 'MJA' FIELD S_ALV_LIST-MJAHR.
          CALL FUNCTION 'MIGO_DIALOG'
            EXPORTING
              I_ACTION            'A04'
              I_REFDOC            'R02'
              I_NOTREE            'X'
              I_SKIP_FIRST_SCREEN 'X'
              I_DEADEND           'X'
              I_MBLNR             S_ALV_LIST-MBLNR
              I_MJAHR             S_ALV_LIST-MJAHR.

        WHEN 'RKWA-MATNR'.
          SET PARAMETER ID 'MAT' FIELD S_ALV_LIST-MATNR.
          SET PARAMETER ID 'WRK' FIELD S_ALV_LIST-WERKS.
          CALL TRANSACTION 'MM03'.     "AND SKIP FIRST SCREEN.

        WHEN 'RKWA-LIFNR'.
          SET PARAMETER ID 'LIF' FIELD S_ALV_LIST-LIFNR.
          SET PARAMETER ID 'KDY' FIELD '/110'.
          CALL TRANSACTION 'MK03' AND SKIP FIRST SCREEN.

        WHEN 'RKWA-BELNR'.
          CHECK NOT S_ALV_LIST-BELNR IS INITIAL.
          SET PARAMETER ID 'BLN' FIELD S_ALV_LIST-BELNR.
          SET PARAMETER ID 'GJR' FIELD S_ALV_LIST-GJAHR.
          SET PARAMETER ID 'BUK' FIELD S_ALV_LIST-BUKRS.
          CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.

        WHEN 'RKWA-TEXT'.
          PERFORM LONG_TEXT_MESSAGE_SHOW USING S_ALV_LIST.

      ENDCASE.
  ENDCASE.
ENDFORM.                               "USER_COMMAND
*eject

*---------------------------------------------------------------------*
*   Form USER_EXIT001_AUFRUFEN
*---------------------------------------------------------------------*
*   Der Kunde kann einige Daten vor Aufruf der RW-Schnittstelle       *
*   noch abändern.
*   ---> ...
*   <--- X_FEHLER: Fehler aufgetreten?
*        SMSG: Meldung bei Fehler
*---------------------------------------------------------------------*
FORM USER_EXIT001_AUFRUFEN TABLES IT_BKPF TYPE TYP_TAB_BKPF
                                  IT_BSEG TYPE TYP_TAB_BSEG
                                  IT_BSET TYPE TYP_TAB_BSET
                                  IT_RKWA TYPE TYP_TAB_RKWA
                            USING BUKRS    LIKE BKPF-BUKRS
                                  LIFNR    LIKE BSEG-LIFNR
                         CHANGING X_FEHLER TYPE C
                                  S_MSG    TYPE TYP_MSG
                                  E_GJAHR  TYPE GJAHR
                                  E_MONAT  TYPE MONAT.

  DATATAB_BSET TYPE TYP_TAB_BSET,
        TAB_RKWA TYPE TYP_TAB_RKWA.
  DATAF_GJAHR TYPE GJAHR,
        F_MONAT TYPE MONAT.

  DATAS_BSEG TYPE BSEGS_BKPF TYPE BKPF.

  CLEARX_FEHLER,
         TAB_BSET,
         TAB_RKWA.

  TAB_BSET[] IT_BSET[].
  TAB_RKWA[] IT_RKWA[].
  DATAS_BSET TYPE BSET.
  DATAF_BSET_GJAHR TYPE BSET-GJAHR.
  IF NOT IT_BSET[] IS INITIAL.
    READ TABLE IT_BSET INDEX INTO S_BSET.
    F_BSET_GJAHR S_BSET-GJAHR.
  ENDIF.

  SY-SUBRC 0.
  CALL CUSTOMER-FUNCTION '001'
    EXPORTING
      I_BUKRS BUKRS
      I_LIFNR LIFNR
    TABLES
      T_BKPF  IT_BKPF
      T_BSEG  IT_BSEG
      T_BSET  TAB_BSET
      T_RKWA  TAB_RKWA
    EXCEPTIONS
      ERROR   1.

  IF SY-SUBRC <> ).
    PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
    X_FEHLER X.
    EXIT.                              "---------->
  ENDIF.

  READ TABLE IT_BKPF INTO S_BKPF INDEX 1.
  IF SY-SUBRC 0.
    IF NOT S_BKPF-BUKRS IS INITIAL.
      CALL FUNCTION 'FI_PERIOD_DETERMINE'
        EXPORTING
          I_BUDAT S_BKPF-BUDAT
          I_BUKRS S_BKPF-BUKRS
          I_MONAT S_BKPF-MONAT
        IMPORTING
          E_GJAHR F_GJAHR
          E_MONAT F_MONAT.
      IF F_GJAHR S_BKPF-GJAHR AND F_MONAT S_BKPF-MONAT.
        E_GJAHR F_GJAHR.
        E_MONAT F_MONAT.
      ELSE.
        CLEAR S_MSG.
        S_MSG-MSGID C_MSGID_M8.
        S_MSG-MSGTY C_MSGTY_ERROR.
        S_MSG-MSGNO '008'.
        S_MSG-MSGV1 'user_exit001_aufrufen'.
        X_FEHLER X.
        EXIT.                            "---------->
      ENDIF.

      LOOP AT IT_BSEG INTO S_BSEG WHERE GJAHR <> S_BKPF-GJAHR.
      ENDLOOP.
      IF SY-SUBRC 0.
        CLEAR S_MSG.
        S_MSG-MSGID C_MSGID_M8.
        S_MSG-MSGTY C_MSGTY_ERROR.
        S_MSG-MSGNO '008'.
        S_MSG-MSGV1 'user_exit001_aufrufen'.
        X_FEHLER X.
        EXIT.
      ENDIF.
    ENDIF.
  ELSE.
    CLEAR S_MSG.
    S_MSG-MSGID C_MSGID_M8.
    S_MSG-MSGTY C_MSGTY_ERROR.
    S_MSG-MSGNO '008'.
    S_MSG-MSGV1 'user_exit001_aufrufen'.
    X_FEHLER X.
    EXIT.
  ENDIF.
  IF NOT IT_BSET[] IS INITIAL.
    IF S_BKPF-GJAHR <> F_BSET_GJAHR.
      LOOP AT IT_BSET INTO S_BSET.
        S_BSET-GJAHR S_BKPF-GJAHR.
        MODIFY IT_BSET FROM S_BSET.
      ENDLOOP.
    ENDIF.
  ENDIF.

ENDFORM.                    "user_exit001_aufrufen


*---------------------------------------------------------------------*
*   Form USER_EXIT002_AUFRUFEN
*---------------------------------------------------------------------*
*   Der Kunde kann vor dem Update auf die RKWA das Customer-Include   *
*   CI_RKWA füllen.
*   ---> IT_RKWA
*   <--- X_FEHLER: Fehler aufgetreten?
*        S_MSG:   Meldung bei Fehler
*---------------------------------------------------------------------*
FORM USER_EXIT002_AUFRUFEN TABLES IT_RKWA  TYPE TYP_TAB_RKWA
                         CHANGING X_FEHLER TYPE C
                                  S_MSG    TYPE TYP_MSG.

  DATAS_RKWA_IN   LIKE RKWA,
        S_RKWA_OUT  LIKE RKWA,
        S_RKWA_KEY  LIKE RKWA_KEY,
        S_RKWA_DATA LIKE RKWA_DATA,
        X_CHECK     TYPE C.

  CLEAR X_FEHLER.

  LOOP AT IT_RKWA INTO S_RKWA_IN.
*   SAP-Daten merken
    MOVE-CORRESPONDING S_RKWA_IN TO S_RKWA_KEY.
    MOVE-CORRESPONDING S_RKWA_IN TO S_RKWA_DATA.

*   Aufruf User-Exit
    SY-SUBRC 0.
    X_CHECK SPACE.
    CALL CUSTOMER-FUNCTION '002'
      EXPORTING
        I_RKWA        S_RKWA_IN
      IMPORTING
        E_CHECK       X_CHECK
        E_RKWA        S_RKWA_OUT
      EXCEPTIONS
        ERROR         1
        ERROR_MESSAGE 1.

    IF SY-SUBRC ).
      IF X_CHECK ).              "Erweiterung wird genutzt
*       Kundenänderungen an SAP-Daten rückgängig machen
        MOVE-CORRESPONDING S_RKWA_KEY  TO S_RKWA_OUT.
        MOVE-CORRESPONDING S_RKWA_DATA TO S_RKWA_OUT.

        MODIFY IT_RKWA FROM S_RKWA_OUT.
      ENDIF.

    ELSE.   "in Erweiterung wurde Fehlermeldung ausgegeben
      PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
      X_FEHLER X.
      EXIT.                            "---------->
    ENDIF.
  ENDLOOP.

ENDFORM.                    "user_exit002_aufrufen

*---------------------------------------------------------------------*
*       FORM TOP_OF_LIST                                              *
*---------------------------------------------------------------------*
* Listüberschriften am Anfang der Gesamtliste                         *
*---------------------------------------------------------------------*
FORM TOP_OF_LIST.

  DATATAB_LIST_OF_LIST TYPE SLIS_T_LISTHEADER"Überschriftstabelle
        S_LINE           TYPE SLIS_LISTHEADER.

  CLEARTAB_LIST_OF_LISTS_LINE.
  REFRESHTAB_LIST_OF_LIST.

  S_LINE-TYP  'S'.
  S_LINE-INFO TEXT-009.              " Protokoll
  APPEND S_LINE TO TAB_LIST_OF_LIST.
  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      IT_LIST_COMMENTARY TAB_LIST_OF_LIST.
ENDFORM.                    "top_of_list

*&---------------------------------------------------------------------*
*&      Form  INVOICE_POST
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM INVOICE_POST TABLES    TI_BKPF  TYPE TYP_TAB_BKPF
                            TI_BSEG  TYPE TYP_TAB_BSEG
                            TI_BSET  TYPE TYP_TAB_BSET
                            TI_RKWA  TYPE TYP_TAB_RKWA
                            TI_TAX   TYPE TYP_TAB_TAX
                            TI_RBWS TYPE TYP_TAB_RBWS
                   USING    I_BLART  LIKE T169F-BLART
                            I_GJAHR  LIKE RKWA-GJAHR
                            I_MONAT  LIKE BKPF-MONAT
                            I_BUKRS  LIKE RKWA-BUKRS
                            I_LIFNR_RKWA  LIKE RKWA-LIFNR
                            S_T003   LIKE T003
                   CHANGING E_BELNR  LIKE RKWA-BELNR
                            X_FEHLER TYPE C
                            S_MSG    TYPE TYP_MSG.

  DATATAB_ACCHD       LIKE ACCHD OCCURS WITH HEADER LINE,
        TAB_ACCIT       LIKE ACCIT OCCURS WITH HEADER LINE,
        TAB_ACCCR       LIKE ACCCR OCCURS WITH HEADER LINE,
        TAB_ACCBSET     LIKE ACCBSET OCCURS WITH HEADER LINE,
        TAB_ACCIT_WT    LIKE ACCIT_WT OCCURS WITH HEADER LINE,
        S_BSET          LIKE BSET,
        S_ACCBSET       LIKE ACCBSET,
        LS_RKWA_KEY     TYPE RKWA_KEY,                      "1731546
        LS_RKWA_KEY_OLD TYPE RKWA_KEY,                      "1731546
        F_ZEILE         TYPE ACCTIT-ZEILE,                  "1731546
        F_LENGTH        TYPE I,                             "1731546
        F_AWTYP         LIKE ACCHD-AWTYP,
        F_AWREF         LIKE ACCHD-AWREF,
        F_AWORG         LIKE ACCHD-AWORG,
        F_AWSYS         LIKE ACCHD-AWSYS,
        F_HWAE1         LIKE BOOLE,
        F_VENDOR_LINE   TYPE C.
*ENHANCEMENT-POINT RMVKON00_02 SPOTS ES_RMVKON00.

* convert document into accounting structure
* hier werden nur Zeilen mit Curtp = 00 Belegwährung erzeugt *
* die restlichen Währungszeilen wie Hauswärhung werden durch *
* ac_doc_create erzeugt
  CALL FUNCTION 'FI_DOC_TO_ACC_TRANSFORM'
    EXPORTING
      X_HWAE1      F_HWAE1
    TABLES
      T_BKPF       TI_BKPF
      T_BSEG       TI_BSEG
      T_BSET       TI_BSET                                    "2054048
      T_ACCHD      TAB_ACCHD
      T_ACCIT      TAB_ACCIT
      T_ACCCR      TAB_ACCCR
    EXCEPTIONS
      SYSTEM_ERROR 1.

  IF SY-SUBRC <> 0.
    PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
    X_FEHLER X.
    EXIT.
  ENDIF.

* Fill ZEILE in TAB_ACCIT in order to enable the FI document split in
* subroutine DOCUMENT_SPLIT_INVOICE_RECEIPT (include LFACIFSP).
* The document split is performed for the following account types:
* material (M), G/L accounts (S) and Assets (A).
  LOOP AT TAB_ACCIT WHERE KOART CA 'MSA'                    "1731546
                    AND   ZUONR IS NOT INITIAL              "1731546
                    AND   SGTXT IS NOT INITIAL.             "1731546

    LS_RKWA_KEY-MBLNR TAB_ACCIT-ZUONR(10).                "1731546
    LS_RKWA_KEY-MJAHR TAB_ACCIT-ZUONR+10(4).              "1731546

*   Last 4 character of SGTXT contain RKWA-ZEILE
    F_LENGTH STRLENTAB_ACCIT-SGTXT 4.               "1731546
    LS_RKWA_KEY-ZEILE TAB_ACCIT-SGTXT+F_LENGTH(4).        "1731546

*   Check whether the material document reference is valid      "1731546
    READ TABLE TI_RKWA WITH KEY MJAHR LS_RKWA_KEY-MJAHR   "1818133
                                MBLNR LS_RKWA_KEY-MBLNR   "1818133
                                ZEILE LS_RKWA_KEY-ZEILE   "1731546
                                BINARY SEARCH               "1731546
                       TRANSPORTING NO FIELDS.              "1731546
    IF SY-SUBRC 0.                                        "1731546
      IF LS_RKWA_KEY NE LS_RKWA_KEY_OLD.                    "1731546
        LS_RKWA_KEY_OLD LS_RKWA_KEY.                      "1731546
        F_ZEILE F_ZEILE + 1.                              "1731546
      ENDIF.                                                "1731546
      TAB_ACCIT-ZEILE TAB_ACCIT-URZEILE F_ZEILE.        "1731546
      MODIFY TAB_ACCIT TRANSPORTING ZEILE URZEILE.          "1731546
    ENDIF.                                                  "1731546
  ENDLOOP.                                                  "1731546

* convert tax data into accounting structure
  LOOP AT TI_BSET INTO S_BSET.
    MOVE-CORRESPONDING S_BSET TO S_ACCBSET.
    S_ACCBSET-MONAT I_MONAT.
    S_ACCBSET-BLART I_BLART.
    CLEARS_ACCBSET-HWBAS,
           S_ACCBSET-HWSTE.
    APPEND S_ACCBSET TO TAB_ACCBSET.
  ENDLOOP.

  LOOP AT TAB_ACCIT WHERE POSNR 1.
*-- withholding tax flag in table accit
    IF NOT TI_RBWS[] IS INITIAL.
      TAB_ACCIT-WT_KEY '000001'.
    ENDIF.

    MODIFY TAB_ACCIT.
  ENDLOOP.

  PERFORM WITHHOLDING_TAX_CREATE TABLES TAB_ACCIT_WT
                                        TI_RBWS.

* alle Information aus den Sachkonten, Stammsätzen, Customizingseins
* tellungen werden hier abgeleitet, wir brauchen es nicht zu machen

  CALL FUNCTION 'AC_DOCUMENT_CREATE'
    TABLES
      T_ACCHD       TAB_ACCHD
      T_ACCIT       TAB_ACCIT
      T_ACCCR       TAB_ACCCR
      T_ACCTX       TAB_ACCBSET
      T_ACCWT       TAB_ACCIT_WT
    EXCEPTIONS
      ERROR_MESSAGE 1.

  IF SY-SUBRC <> 0.
    PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
    X_FEHLER X.
    EXIT.
  ENDIF.

  PERFORM DOCUMENT_NUMBER_GET USING I_BLART
                                    I_BUKRS
                                    I_GJAHR
                                    S_T003
                           CHANGING E_BELNR
                                    X_FEHLER
                                    S_MSG.

  CALL FUNCTION 'FI_REFERENCE_CREATE'
    EXPORTING
      I_AWTYP 'BKPFF'
      I_BUKRS I_BUKRS
      I_GJAHR I_GJAHR
      I_BELNR E_BELNR
    IMPORTING
      E_AWTYP F_AWTYP
      E_AWREF F_AWREF
      E_AWORG F_AWORG
      E_AWSYS F_AWSYS.


  CALL FUNCTION 'AC_DOCUMENT_POST'
    EXPORTING
      I_AWTYP       F_AWTYP
      I_AWREF       F_AWREF
      I_AWORG       F_AWORG
      I_AWSYS       F_AWSYS
    EXCEPTIONS
      ERROR_MESSAGE 1.

  IF SY-SUBRC <> 0.
    PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
    X_FEHLER X.
    EXIT.
  ENDIF.

  READ TABLE TI_BSEG WITH KEY KOART C_KOART_KRED.
  IF TI_BSEG-WRBTR > 0.
    F_VENDOR_LINE X.
  ELSE.
    CLEAR F_VENDOR_LINE.
  ENDIF.

  PERFORM RKWA_UPDATE TABLES    TI_RKWA
                                TI_TAX
                       USING    E_BELNR
                                I_GJAHR
                                I_LIFNR_RKWA
                                F_VENDOR_LINE
                       CHANGING X_FEHLER
                                S_MSG.

  IF X_FEHLER X.
    EXIT.
  ENDIF.

  PERFORM HEAD_MESSAGE_CREATE TABLES TI_BKPF
                                     TI_BSEG
                            USING    I_BLART
                                     E_BELNR
                                     I_BUKRS
                            CHANGING X_FEHLER
                                     S_MSG.

  IF X_FEHLER X.
    EXIT.
  ENDIF.

ENDFORM.                               " INVOICE_POST

*&---------------------------------------------------------------------*
*&      Form  DOCUMENT_NUMBER_GET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM DOCUMENT_NUMBER_GET USING I_BLART  LIKE T169F-BLART
                               I_BUKRS  LIKE RKWA-BUKRS
                               I_GJAHR  LIKE RKWA-GJAHR
                               S_T003   LIKE T003
                      CHANGING E_BELNR  LIKE RKWA-BELNR
                               X_FEHLER TYPE C
                               S_MSG    TYPE TYP_MSG.


  CALL FUNCTION 'RF_GET_DOCUMENT_NUMBER'
    EXPORTING
      COMPANY         I_BUKRS
      RANGE           S_T003-NUMKR
      YEAR            I_GJAHR
    IMPORTING
      DOCUMENT_NUMBER E_BELNR.

  IF SY-DBSYS NE 'ORACLE'.
    CALL FUNCTION 'ENQUEUE_EFBKPF'
      EXPORTING
        BELNR          E_BELNR
        BUKRS          I_BUKRS
        GJAHR          I_GJAHR
      EXCEPTIONS
        FOREIGN_LOCK   1
        SYSTEM_FAILURE 2.
    CASE SY-SUBRC.

*------- Beleg von anderem Benutzer gesperrt ---------------------------
      WHEN 1.
*        MESSAGE A127 WITH E_BELNR I_BUKRS.
        PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
        X_FEHLER X.
        EXIT.

*------- Systemfehler --------------------------------------------------
      WHEN 2.
*        MESSAGE A128 WITH E_BELNR I_BUKRS.
        PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
        X_FEHLER X.
        EXIT.
    ENDCASE.
  ENDIF.

ENDFORM.                               " DOCUMENT_NUMBER_GET
*&---------------------------------------------------------------------*
*&      Form  HEADER_DATA_FILL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM HEADER_DATA_FILL TABLES TI_BKPF  TYPE TYP_TAB_BKPF
                       USING I_BLART  LIKE T169F-BLART
                             I_BUKRS  LIKE RKWA-BUKRS
                             I_BWAER  LIKE RKWA-BWAER
                             S_T001   LIKE T001
                    CHANGING E_GJAHR  LIKE RKWA-GJAHR
                             E_MONAT  LIKE BKPF-MONAT.


  DATAS_BKPF LIKE BKPF.

  CLEARS_BKPF.
  S_BKPF-MANDT SY-MANDT.
  S_BKPF-BLART I_BLART.
  S_BKPF-BUKRS I_BUKRS.
  S_BKPF-TCODE TCODE_MRKO.
  S_BKPF-WAERS I_BWAER.
  S_BKPF-HWAER S_T001-WAERS.
  S_BKPF-XMWST 'X'.                  "Steuer rechnen
  S_BKPF-BLDAT P_BLDAT.             "lokales Datum
  S_BKPF-BUDAT P_BUDAT.             "lokales Datum
  S_BKPF-WWERT P_BUDAT.             "lokales Datum
  S_BKPF-XBLNR P_XBLNR.
  S_BKPF-AWTYP C_AWTYP_BKPFF.
  S_BKPF-GLVOR C_AWTYP_RMRP.
  S_BKPF-USNAM SY-UNAME.
  S_BKPF-XSNET 'X'.

* month, year get
  IF NOT S_BKPF-BUKRS IS INITIAL.

    CALL FUNCTION 'FI_PERIOD_DETERMINE'
      EXPORTING
        I_BUDAT S_BKPF-BUDAT
        I_BUKRS S_BKPF-BUKRS
        I_MONAT S_BKPF-MONAT
      IMPORTING
        E_GJAHR S_BKPF-GJAHR
        E_MONAT S_BKPF-MONAT.

  ENDIF.

  E_GJAHR S_BKPF-GJAHR.
  E_MONAT S_BKPF-MONAT.

*-------- Steuerkurs -------------------------------------------------*
  CALL FUNCTION 'FI_TAX_GET_TXKRS'
    EXPORTING
      I_BUKRS      I_BUKRS
      I_CURR_FORGN I_BWAER
      I_CURR_LOCAL S_T001-WAERS
      I_BLDAT      SY-DATLO
      I_BUDAT      SY-DATLO
*     i_vatdate    = ????                                   "N1023317
    IMPORTING
      E_TXKRS      S_BKPF-TXKRS.

  APPEND S_BKPF TO TI_BKPF.

ENDFORM.                               " HEADER_DATA_FILL

*&---------------------------------------------------------------------*
*&      Form  ITEM_DATA_FILL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM ITEM_DATA_FILL TABLES TI_BKPF TYPE TYP_TAB_BKPF
                           TI_BSEG TYPE TYP_TAB_BSEG
                           TI_BSET TYPE TYP_TAB_BSET
                           TI_RKWA TYPE TYP_TAB_RKWA
                           TI_TAX  TYPE TYP_TAB_TAX
                           TE_RBWS TYPE TYP_TAB_RBWS
                     USING I_BUKRS LIKE RKWA-BUKRS
                           I_GJAHR LIKE RKWA-GJAHR
                           I_LIFNR_RKWA LIKE RKWA-LIFNR
                           I_BWAER LIKE RKWA-BWAER
                           S_T001 LIKE T001
                           S_T003 LIKE T003
                  CHANGING X_FEHLER TYPE C
                           S_MSG  TYPE TYP_MSG
                           E_LIFNR LIKE RKWA-LIFNR.

  DATAT_BSEGT           LIKE BSEGT OCCURS 0,
        S_BSEGT           LIKE BSEGT,
        S_BSEG            LIKE BSEG,
        S_BSET            LIKE BSET,
        S_RKWA            LIKE RKWA,
        S_TAX             TYPE TYP_TAX,
        S_BKPF            LIKE BKPF,
        S_T169            LIKE T169,
        H_SGTXT           LIKE BSEG-SGTXT,
        H_GSBER           LIKE RKWA-GSBER,
        F_BUZEI           LIKE BSEG-BUZEI,
        F_FWSTE           LIKE ITXDAT-FWSTE,
        F_WRBTR           LIKE RKWA-WRBTR,
        F_ISPS_NOT_ACTIVE LIKE FMISPS-PS_ACTIVE.
  F_BUZEI 1.

  CONSTANTSC_T169(4)    VALUE 'T169'.

  CLEARX_FEHLER.
  CLEARS_MSG.

* selections
  SELECT SINGLE FROM T169 INTO S_T169
                  WHERE TCODE C_TCODE_MRKO.
  IF SY-SUBRC NE 0.
    MESSAGE E100 WITH C_T169 C_TCODE_MRKO.
  ENDIF.

* check if IS-PS active
  CALL FUNCTION 'FM00_CHECK_ISPS'
    IMPORTING
      E_FLG_ISPS_NOT_ACTIVE F_ISPS_NOT_ACTIVE.

* header data
  READ TABLE TI_BKPF INDEX INTO S_BKPF.

* bseg fill vendor line
  CLEARS_BSEGS_RKWAF_WRBTR.
  LOOP AT TI_RKWA INTO S_RKWA.
    IF S_RKWA-SHKZG C_SHKZG_HABEN.
      F_WRBTR F_WRBTR + S_RKWA-WRBTR S_RKWA-NAVNW ).
    ELSE.
      F_WRBTR F_WRBTR S_RKWA-WRBTR S_RKWA-NAVNW ).
    ENDIF.
  ENDLOOP.

  S_BSEG-MANDT SY-MANDT.
  S_BSEG-BUKRS I_BUKRS.
  S_BSEG-GJAHR S_BKPF-GJAHR.
  S_BSEG-BUZEI C_BUZEI_KRED.
  S_BSEG-LIFNR E_LIFNR.
  S_BSEG-ZFBDT SY-DATLO.
  S_BSEG-WRBTR ABSF_WRBTR ).

* posting key
  IF F_WRBTR >= 0.
    S_BSEG-BSCHL C_BSLKH.
  ELSE.
    S_BSEG-BSCHL C_BSLKS.
  ENDIF.
  PERFORM POSTING_KEY_DATA_GET USING    S_T003
                                        S_BSEG-BSCHL
                               CHANGING S_BSEG-SHKZG
                                        S_BSEG-KOART
                                        X_FEHLER
                                        S_MSG.
  IF X_FEHLER ).
    EXIT.
  ENDIF.

  PERFORM VENDOR_DATA_GET USING    I_BUKRS
                                   E_LIFNR
                          CHANGING X_FEHLER
                                   S_MSG
                                   S_BSEG-LIFNR
                                   S_BSEG-FILKD
                                   S_BSEG-ZTERM
                                   S_BSEG-QSSKZ.

  IF X_FEHLER ).
    EXIT.
  ENDIF.
  E_LIFNR S_BSEG-LIFNR.
  PERFORM BUZID_GET USING    S_T169-VGART
                             S_BSEG-KOART
                    CHANGING S_BSEG-BUZID
                             S_BSEG-BUSTW.

  PERFORM KTOSL_GET USING    S_BSEG-BUSTW
                    CHANGING S_BSEG-KTOSL.

  PERFORM PAYMENT_CONDITIONS_GET USING    S_BSEG-ZTERM
                                          S_BKPF-BLDAT
                                          S_BKPF-BUDAT
                                 CHANGING S_BSEG-ZFBDT
                                          S_BSEG-ZLSPR
                                          S_BSEG-ZLSCH
                                          S_BSEG-ZBD1T
                                          S_BSEG-ZBD1P
                                          S_BSEG-ZBD2T
                                          S_BSEG-ZBD2P
                                          S_BSEG-ZBD3T
                                          X_FEHLER
                                          S_MSG.
  IF X_FEHLER ).
    EXIT.
  ENDIF.

  APPEND S_BSEG TO TI_BSEG.

*   withholding tax initialization
  IF TE_RBWS[] IS INITIAL.
    CALL FUNCTION 'FI_WT_ERS_INITIALIZATION'
      EXPORTING
        I_BUKRS S_BKPF-BUKRS
        I_GJAHR S_BKPF-GJAHR
        I_BLDAT S_BKPF-BLDAT
        I_BUDAT S_BKPF-BUDAT
        I_WWERT S_BKPF-WWERT
        I_WAERS S_BKPF-WAERS
        I_KURSF S_BKPF-KURSF
        I_SHKZG S_BSEG-SHKZG
        I_LIFNR S_BSEG-LIFNR
      TABLES
        I_RBWS  TE_RBWS.
  ENDIF.

* bseg fill (goods extract)
  LOOP AT TI_RKWA INTO S_RKWA.
    F_BUZEI F_BUZEI + 1.
    READ TABLE TI_TAX INTO S_TAX
                      WITH KEY MATNR S_RKWA-MATNR
                               WERKS S_RKWA-WERKS
                               MWSKZ S_RKWA-MWSKZ
                               LIFNR I_LIFNR_RKWA.
    IF SY-SUBRC <> ).
      S_MSG-MSGID 'XX'.
      S_MSG-MSGTY =  C_MSGTY_ERROR.
      S_MSG-MSGNO '300'.             "Verbuchungsabbruch
      S_MSG-MSGV1 TEXT-300.
      X_FEHLER X.
      EXIT.
    ENDIF.

    CLEAR S_BSEG.
    S_BSEG-MANDT SY-MANDT.
    S_BSEG-BUKRS I_BUKRS.
    S_BSEG-GJAHR S_BKPF-GJAHR.
    S_BSEG-BUZEI F_BUZEI.
    S_BSEG-VORGN C_AWTYP_RMRP.
    S_BSEG-BUZID C_BUZID_SACH.
    S_BSEG-MWSKZ S_TAX-MWSKZ.
    S_BSEG-TXJCD S_TAX-TXJCD.
    S_BSEG-SAKNR S_RKWA-HKONT.
    S_BSEG-HKONT S_RKWA-HKONT.
    S_BSEG-GSBER S_RKWA-GSBER.
    S_BSEG-PRCTR S_RKWA-PRCTR.       "ab 4.5A Eintrag in der RKWA
    S_BSEG-MENGE S_RKWA-BSTMG.
    S_BSEG-MEINS S_RKWA-BSTME.
    S_BSEG-MATNR S_RKWA-MATNR.   " matnr and werks are important for
    S_BSEG-WERKS S_RKWA-WERKS.       " external tax system

* posting key in
    IF S_RKWA-SHKZG C_SHKZG_HABEN.
      S_BSEG-BSCHL C_BSLSS.
    ELSEIF S_RKWA-SHKZG C_SHKZG_SOLL.
      S_BSEG-BSCHL C_BSLSH.
    ENDIF.

    PERFORM POSTING_KEY_DATA_GET USING    S_T003
                                          S_BSEG-BSCHL
                                 CHANGING S_BSEG-SHKZG
                                          S_BSEG-KOART
                                          X_FEHLER
                                          S_MSG.
    IF X_FEHLER ).
      EXIT.
    ENDIF.

    PERFORM BUZID_GET USING    S_T169-VGART
                               S_BSEG-KOART
                      CHANGING S_BSEG-BUZID
                               S_BSEG-BUSTW.

    PERFORM KTOSL_GET USING    S_BSEG-BUSTW
                      CHANGING S_BSEG-KTOSL.

*   ZuordnungsNr: aus MaterialBelegnr + Jahr zusammenbauen
    CONCATENATE S_RKWA-MBLNR S_RKWA-MJAHR INTO S_BSEG-ZUONR.
*ENHANCEMENT-POINT RMVKON00_01 SPOTS ES_RMVKON00.
*   Fill XREF3 if IS-PS is active
    IF F_ISPS_NOT_ACTIVE IS INITIAL.
      MOVE S_BSEG-ZUONR TO S_BSEG-XREF3.
    ENDIF.
*   Positionstext: 'Abrechnung zu Materialbeleg &1 &2'
    H_SGTXT TEXT-011.
    REPLACE '&1' WITH S_RKWA-MBLNR INTO H_SGTXT.
    REPLACE '&2' WITH S_RKWA-ZEILE INTO H_SGTXT.
    S_BSEG-SGTXT H_SGTXT.

*   Steuerbetrag ist Null
    S_BSEG-WMWST 0.
*   Rechnungsbetrag
    S_BSEG-WRBTR S_RKWA-WRBTR S_RKWA-NAVNW.
    S_BSEG-TXBFW S_BSEG-WRBTR.
    S_BSEG-REWWR S_BSEG-WRBTR.
    S_BSEG-NAVFW S_RKWA-NAVNW.

* if EA-PS is active take over account assignments
    PERFORM FM_ACCOUNT_ASSIGNMENT_GET USING S_RKWA
                                   CHANGING S_BSEG
                                            X_FEHLER
                                            S_MSG.
    IF X_FEHLER ).
      EXIT.
    ENDIF.

    APPEND S_BSEG TO TI_BSEG.
    CLEAR S_RKWA.
  ENDLOOP.


* tax data
  PERFORM BSET_FILL TABLES   TI_BKPF
                             TI_BSEG
                             TI_BSET
                    USING    I_BUKRS
                    CHANGING S_MSG
                             X_FEHLER.

  IF X_FEHLER ).
    EXIT.
  ENDIF.

* bseg fill (tax line)
  CALL FUNCTION 'CREATE_TAX_ITEM'
    TABLES
      T_BSEGT T_BSEGT.

  LOOP AT T_BSEGT INTO S_BSEGT.
    S_BSEGT-HWBAS ABSS_BSEGT-HWBAS ).
    S_BSEGT-FWBAS ABSS_BSEGT-FWBAS ).

    CLEARS_BSEG.
    MOVE-CORRESPONDING S_BSEGT TO S_BSEG.
    S_BSEG-VORGN C_AWTYP_RMRP.
    S_BSEG-BUZID C_BUZID_TAX.
    S_BSEG-KOART 'S'.

    APPEND S_BSEG TO TI_BSEG.
  ENDLOOP.

  PERFORM NAV_VERTEILEN TABLES TI_BSEG.

  PERFORM BSEG_LINES_NUMBERING CHANGING TI_BSEG[].

ENDFORM.                               " ITEM_DATA_FILL

*&---------------------------------------------------------------------*
*&      Form  POSTING_KEY_GET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM POSTING_KEY_DATA_GET USING    S_T003  LIKE T003
                                   E_BSCHL  LIKE BSEG-BSCHL
                          CHANGING E_SHKZG  LIKE BSEG-SHKZG
                                   E_KOART  LIKE BSEG-KOART
                                   X_FEHLER TYPE C
                                   S_MSG  TYPE TYP_MSG.

  DATAS_TBSL  LIKE TBSL,
        S_TBSLT LIKE TBSLT.

  CALL FUNCTION 'FI_POSTING_KEY_DATA'
    EXPORTING
      I_BSCHL E_BSCHL
    IMPORTING
      E_TBSL  S_TBSL
      E_TBSLT S_TBSLT.

  IF S_T003-KOARS NA S_TBSL-KOART.
    CLEAR S_MSG.
    S_MSG-MSGID C_MSGID_M8.
    S_MSG-MSGTY C_MSGTY_ERROR.
    S_MSG-MSGNO '161'.
    X_FEHLER X.
    EXIT.
  ELSE.
    E_SHKZG S_TBSL-SHKZG.
    E_KOART S_TBSL-KOART.
  ENDIF.

ENDFORM.                               " POSTING_KEY_DATA_GET

*&---------------------------------------------------------------------*
*&      Form  VENDOR_DATA_GET
*&---------------------------------------------------------------------*
FORM VENDOR_DATA_GET USING    I_BUKRS LIKE RKWA-BUKRS
                              I_LIFNR LIKE RKWA-LIFNR
                     CHANGING X_FEHLER TYPE C
                              S_MSG TYPE TYP_MSG
                              E_LIFNR LIKE BSEG-LIFNR
                              E_FILKD LIKE BSEG-FILKD
                              E_ZTERM LIKE BSEG-ZTERM
                              E_QSSKZ LIKE BSEG-QSSKZ.

  DATAS_KRED LIKE VF_KRED.
  CLEARS_KRED.

*- read the vendor data
  CALL FUNCTION 'FI_VENDOR_DATA'
    EXPORTING
      I_BUKRS       I_BUKRS
      I_LIFNR       I_LIFNR
    IMPORTING
      E_KRED        S_KRED
    EXCEPTIONS
      ERROR_MESSAGE 01.

  IF SY-SUBRC NE 0.
    PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
    X_FEHLER X.
    EXIT.
  ENDIF.

  E_QSSKZ S_KRED-QSSKZ.
  E_ZTERM S_KRED-ZTERM.

  IF NOT S_KRED-LNRZE IS INITIAL.      " headquater
    E_LIFNR S_KRED-LNRZE.
    E_FILKD I_LIFNR.
    CLEARS_KREDE_QSSKZE_ZTERM.

    CALL FUNCTION 'FI_VENDOR_DATA'
      EXPORTING
        I_BUKRS       I_BUKRS
        I_LIFNR       E_LIFNR
      IMPORTING
        E_KRED        S_KRED
      EXCEPTIONS
        ERROR_MESSAGE 01.

    IF SY-SUBRC NE 0.
      PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
      X_FEHLER X.
      EXIT.
    ENDIF.
    E_QSSKZ S_KRED-QSSKZ.
    E_ZTERM S_KRED-ZTERM.
  ENDIF.

  IF S_KRED-BEGRU NE SPACE.
    PERFORM AUTHORITY_CHECK USING 'BEK' 'BRGRU' S_KRED-BEGRU
                            CHANGING S_MSG
                                     X_FEHLER.
    IF X_FEHLER X.
      EXIT.
    ENDIF.
  ENDIF.

  IF S_KRED-BEGRU_B NE SPACE.
    PERFORM AUTHORITY_CHECK USING 'BEK' 'BRGRU' S_KRED-BEGRU_B
                            CHANGING S_MSG
                                     X_FEHLER.
    IF X_FEHLER X.
      EXIT.
    ENDIF.
  ENDIF.

ENDFORM.                               " VENDOR_DATA_GET

*&---------------------------------------------------------------------*
*&      Form  BUZID_GET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM BUZID_GET USING    I_VGART
                        I_KOART
               CHANGING E_BUZID
                        E_BUSTW.

*------- Buchungsstring ermitteln, BUZID setzen ----------------------*
  CALL FUNCTION 'MR_STRING_DETERMINE'
    EXPORTING
      I_KNTTP ' '
      I_KOART I_KOART
      I_PSTYP ' '
      I_VGART I_VGART
    IMPORTING
      E_BUSTW E_BUSTW
      E_BUZID E_BUZID.

ENDFORM.                               " BUZID_GET

*&---------------------------------------------------------------------*
*&      Form  KTOSL_GET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM KTOSL_GET USING    I_BUSTW
               CHANGING E_KTOSL.

  DATATAB_T169C LIKE T169C OCCURS 0,
        S_T169C   LIKE T169C,
        S_SGNBU   LIKE SGNBU.

  CALL FUNCTION 'MR_POSTING_GENERATE'
    EXPORTING
      I_BUSTW I_BUSTW
      I_SGNBU S_SGNBU
    TABLES
      T_T169C TAB_T169C.


  LOOP AT TAB_T169C INTO S_T169C
                    WHERE BUSTW I_BUSTW.
    E_KTOSL S_T169C-VORSL.
  ENDLOOP.


ENDFORM.                               " KTOSL_GET

*&---------------------------------------------------------------------*
*&      Form  PAYMENT_CONDITIONS_GET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM PAYMENT_CONDITIONS_GET USING    I_ZTERM LIKE BSEG-ZTERM
                                     I_BLDAT LIKE BKPF-BLDAT
                                     I_BUDAT LIKE BKPF-BUDAT
                            CHANGING E_ZFBDT LIKE BSEG-ZFBDT
                                     E_ZLSPR LIKE BSEG-ZLSPR
                                     E_ZLSCH LIKE BSEG-ZLSCH
                                     E_ZBD1T LIKE BSEG-ZBD1T
                                     E_ZBD1P LIKE BSEG-ZBD1P
                                     E_ZBD2T LIKE BSEG-ZBD2T
                                     E_ZBD2P LIKE BSEG-ZBD2P
                                     E_ZBD3T LIKE BSEG-ZBD3T
                                     X_FEHLER TYPE C
                                     S_MSG  TYPE TYP_MSG.

  DATAS_T052  LIKE T052,
        S_SKLIN LIKE SKLIN.

  CONSTANTSC_T052(4VALUE 'T052'.

* ZTERM (*) is needed for substitution paymnt term from headquater
  CHECK I_ZTERM NE '*'.

  CALL FUNCTION 'FI_FIND_PAYMENT_CONDITIONS'
    EXPORTING
      I_ZTERM       I_ZTERM
      I_BLDAT       I_BLDAT
      I_BUDAT       I_BUDAT
    IMPORTING
      E_T052        S_T052
      E_ZFBDT       E_ZFBDT
      E_SKLIN       S_SKLIN
    EXCEPTIONS
      ERROR_MESSAGE 1.

  IF SY-SUBRC NE 0.
    PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
    X_FEHLER X.
    EXIT.
  ELSE.

*------- Zahlungsschlüssel und Zahlungssperre vorschlagen --------------
    E_ZLSPR S_T052-ZSCHF.
    E_ZLSCH S_T052-ZLSCH.

*----------- Tage und Prozente setzen ----------------------------------
    E_ZBD1T S_SKLIN-ZTAG1.
    E_ZBD1P S_SKLIN-ZPRZ1.
    E_ZBD2T S_SKLIN-ZTAG2.
    E_ZBD2P S_SKLIN-ZPRZ2.
    E_ZBD3T S_SKLIN-ZTAG3.
  ENDIF.

ENDFORM.                               " PAYMENT_CONDITIONS_GET


*&---------------------------------------------------------------------*
*&      Form  BSET_FILL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM BSET_FILL TABLES   TI_BKPF  TYPE TYP_TAB_BKPF
                        TI_BSEG  TYPE TYP_TAB_BSEG
                        TI_BSET  TYPE TYP_TAB_BSET
               USING    I_BUKRS  LIKE RKWA-BUKRS
               CHANGING S_MSG    TYPE TYP_MSG
                        X_FEHLER TYPE C.

  DATAT_DBSEG  LIKE DBSEG OCCURS WITH HEADER LINE,
        S_BSEG   LIKE BSEG,
        S_DBSEG  LIKE DBSEG,
        S_BKPF   LIKE BKPF,
        TAB_BKPF LIKE BKPF OCCURS WITH HEADER LINE,
        F_KALSM  LIKE T005-KALSM.

  READ TABLE TI_BKPF INDEX INTO S_BKPF.

  S_BKPF-AWTYP C_AWTYP_RMRP.
  APPEND S_BKPF TO TAB_BKPF.

* dbseg fill for cash discount
  LOOP AT TI_BSEG INTO S_BSEG.
    IF S_BSEG-KOART C_KOART_KRED.
      T_DBSEG-XSKFB X.
    ELSE.
      T_DBSEG-XSKFB SPACE.
    ENDIF.
    APPEND T_DBSEG.
  ENDLOOP.

  CALL FUNCTION 'FIND_TAX_SPREADSHEET'
    EXPORTING
      BUCHUNGSKREIS I_BUKRS
    IMPORTING
      SCHEMA        F_KALSM
    EXCEPTIONS
      ERROR_MESSAGE 1.

  IF SY-SUBRC NE 0.
    PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
    X_FEHLER X.
    EXIT.
  ENDIF.

  CALL FUNCTION 'CALCULATE_TAX_DOCUMENT'
    EXPORTING
      I_BUKRS       I_BUKRS
    IMPORTING
      E_ITXDAT      ITXDAT
    TABLES
      T_BKPF        TAB_BKPF
      T_BSEG        TI_BSEG
      T_DBSEG       T_DBSEG
    EXCEPTIONS
      ERROR_MESSAGE 1.

  IF SY-SUBRC NE 0.
    PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
    X_FEHLER X.
    EXIT.
  ENDIF.
* amount eligible for cash discount
  LOOP AT TI_BSEG INTO S_BSEG WHERE BUZID C_BUZID_KRED.
    READ TABLE T_DBSEG INDEX INTO S_DBSEG.
    S_BSEG-SKFBT S_DBSEG-SKFBT.
    MODIFY TI_BSEG FROM S_BSEG.
  ENDLOOP.

* bseg fill
  CALL FUNCTION 'CREATE_BSET_ITEM'
    TABLES
      T_BKPF TI_BKPF
      T_BSEG TI_BSEG
      T_BSET TI_BSET.

* vendor amount incl. taxes
  CLEARS_BSEG.
  LOOP AT TI_BSEG INTO S_BSEG WHERE BUZID C_BUZID_KRED.
    IF S_BSEG-SHKZG 'S' AND ITXDAT-SHKZG 'S' )
    OR S_BSEG-SHKZG 'H' AND ITXDAT-SHKZG 'H' ).
      S_BSEG-WRBTR S_BSEG-WRBTR ITXDAT-FWSTE.
    ELSE.
      S_BSEG-WRBTR S_BSEG-WRBTR + ITXDAT-FWSTE.
    ENDIF.
    S_BSEG-REWWR S_BSEG-WRBTR.
    S_BSEG-TXBFW S_BSEG-WRBTR.
    MODIFY TI_BSEG FROM S_BSEG.
    CLEAR S_BSEG.
  ENDLOOP.

ENDFORM.                               " BSET_FILL

*&---------------------------------------------------------------------*
*&      Form  RKWA_UPDATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM RKWA_UPDATE TABLES TI_RKWA TYPE TYP_TAB_RKWA
                        TI_TAX  TYPE TYP_TAB_TAX
                  USING I_BELNR LIKE RKWA-BELNR
                        I_GJAHR LIKE RKWA-GJAHR
                        I_LIFNR LIKE RKWA-LIFNR
                        I_VENDOR_LINE TYPE C
               CHANGING X_FEHLER TYPE C
                        S_MSG    TYPE TYP_MSG.

  DATAS_RKWA LIKE RKWA,
        S_TAX  TYPE TYP_TAX.


  LOOP AT TI_RKWA INTO S_RKWA.
    S_RKWA-STATUS '01'.
    S_RKWA-BELNR  I_BELNR.
    S_RKWA-GJAHR  I_GJAHR.
    IF NOT I_VENDOR_LINE IS INITIAL.
      S_RKWA-BUZEI  SY-TABIX + 1.   "erste Zeile ist Kreditorenzeile
    ELSE.
      S_RKWA-BUZEI  SY-TABIX.
    ENDIF.

* sales tax flag
    READ TABLE TI_TAX INTO S_TAX
                      WITH KEY MATNR S_RKWA-MATNR
                               WERKS S_RKWA-WERKS
                               LIFNR I_LIFNR.
    IF SY-SUBRC NE 0.
      CLEAR S_MSG.
      S_MSG-MSGID C_MSGID_M8.
      S_MSG-MSGTY C_MSGTY_ERROR.
      S_MSG-MSGNO '008'.
      S_MSG-MSGV1 'RKWA_UPDATE'.
      X_FEHLER X.
      EXIT.
    ENDIF.

    IF S_RKWA-MWSKZ IS INITIAL.        "ab 4.5A Eintrag in der RKWA
      S_RKWA-MWSKZ S_TAX-MWSKZ.
    ENDIF.

    MODIFY TI_RKWA FROM S_RKWA.
  ENDLOOP.

*------ Abrechnung Konsi-Verbindlichkeiten ---------------------------*
  DESCRIBE TABLE TI_RKWA LINES SY-TFILL.
  IF SY-TFILL GT 0.

    CALL FUNCTION 'MR_RKWA_UPDATE' IN UPDATE TASK
      EXPORTING
        I_UPDKZ 'U'
      TABLES
        T_RKWA  TI_RKWA.
  ENDIF.

ENDFORM.                               " RKWA_UPDATE

*&---------------------------------------------------------------------*
*&      Form  VARIANT_INIT
*&---------------------------------------------------------------------*
FORM VARIANT_INIT.

  CLEAR S_VARIANT.
  S_VARIANT-REPORT C_REPID.

ENDFORM.                               " VARIANT_INIT
*&---------------------------------------------------------------------*
*&      Form  F4_VARIA
*&---------------------------------------------------------------------*
FORM F4_VARIA CHANGING CF_VARIA LIKE DISVARIANT-VARIANT.

  DATAF_EXIT(1)   TYPE C.

  PERFORM VARIANT_INIT.

  CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
    EXPORTING
      IS_VARIANT S_VARIANT
      I_SAVE     C_SAVE
    IMPORTING
      E_EXIT     F_EXIT
      ES_VARIANT S_VAR_USR
    EXCEPTIONS
      NOT_FOUND  2.

  IF SY-SUBRC 2.
    MESSAGE ID SY-MSGID TYPE 'S'      NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ELSE.
    IF F_EXIT SPACE.
      CF_VARIA S_VAR_USR-VARIANT.
    ENDIF.
  ENDIF.

ENDFORM.                                                    " F4_VARIA
*&---------------------------------------------------------------------*
*&      Form HEAD_MESSAGE_CREATE
*&---------------------------------------------------------------------*
FORM HEAD_MESSAGE_CREATE TABLES   TI_BKPF TYPE TYP_TAB_BKPF
                                   TI_BSEG TYPE TYP_TAB_BSEG
                          USING    I_BLART LIKE T169F-BLART
                                   I_BELNR LIKE RKWA-BELNR
                                   I_BUKRS LIKE RKWA-BUKRS
                          CHANGING X_FEHLER TYPE C
                                   S_MSG    TYPE TYP_MSG.


  DATALF_UPDATE   LIKE  BOOLE-BOOLE.

  DATAH_RBKPV    TYPE MRM_RBKPV,
        LS_KOMKBMR LIKE  KOMKBMR.

  CLEARH_RBKPVS_MSG.

  MOVE-CORRESPONDING TI_BKPF TO H_RBKPV.
  READ TABLE TI_BSEG INDEX 1.
  H_RBKPV-BELNR  =  I_BELNR.
  H_RBKPV-LIFNR  =  TI_BSEG-LIFNR.
* create messages
  LF_UPDATE 'X'.

* Kommunikationsstruktur füllen
  CLEAR LS_KOMKBMR.
  LS_KOMKBMR-BUKRS I_BUKRS.
  LS_KOMKBMR-BELNR I_BELNR.
  LS_KOMKBMR-BLART I_BLART.
  LS_KOMKBMR-USNAM H_RBKPV-USNAM.
  IF NOT TI_BSEG-FILKD IS INITIAL.
    LS_KOMKBMR-LIFNR TI_BSEG-FILKD.  " Partner LF
  ELSE.
    LS_KOMKBMR-LIFNR TI_BSEG-LIFNR.  " Partner LF
  ENDIF.
  LS_KOMKBMR-LIFRE TI_BSEG-LIFNR.          " Partner RS
  LS_KOMKBMR-IDENT C_IDENT_KONS.

  CALL FUNCTION 'MRM_HEAD_MESSAGE_CREATE'
    EXPORTING
      IF_KAPPL      C_KAPPL_MR
      IF_KALSM      C_KALSM_0003
      IS_RBKPV      H_RBKPV
      IS_KOMKBMR    LS_KOMKBMR
      IF_UPDATE     LF_UPDATE
    EXCEPTIONS
      ERROR_MESSAGE 2
      OTHERS        3.

  IF SY-SUBRC <> 0.
    PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
    IF SY-MSGTY 'A'.   "Ausgabe der A-Meldung als E-Meldung:
      S_MSG-MSGTY 'E'.
    ENDIF.
    X_FEHLER X.
    EXIT.
  ENDIF.

ENDFORM.                               " HEAD_MESSAGE_CREATE
*&---------------------------------------------------------------------*
*&      Form  authority_check
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM AUTHORITY_CHECK USING    AUTH_OBJ
                              AUTH_ID
                              AUTH_VAL TYPE LFA1-BEGRU
                     CHANGING S_MSG    TYPE TYP_MSG
                              X_FEHLER TYPE C.
  CASE AUTH_OBJ.
    WHEN 'BEK'.
      AUTHORITY-CHECK OBJECT 'F_BKPF_BEK'
                      ID 'ACTVT' FIELD '01'
                      ID AUTH_ID FIELD AUTH_VAL.
      IF SY-SUBRC NE 0.
        CLEAR S_MSG.
        S_MSG-MSGID C_MSGID_M8.
        S_MSG-MSGTY C_MSGTY_ERROR.
        S_MSG-MSGNO '120'.
        S_MSG-MSGV1 AUTH_VAL.
        X_FEHLER X.
        EXIT.
      ENDIF.
  ENDCASE.
ENDFORM.                               " authority_check
*&---------------------------------------------------------------------*
*&      Form  bseg_lines_numbering
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_TI_BSEG[]  text
*----------------------------------------------------------------------*
FORM BSEG_LINES_NUMBERING CHANGING TI_BSEG TYPE TYP_TAB_BSEG.

  DATAS_BSEG  LIKE BSEG,
        F_BUZEI LIKE BSEG-BUZEI.

  CLEARF_BUZEI.
  LOOP AT TI_BSEG INTO S_BSEG.
    F_BUZEI F_BUZEI + 1.
    S_BSEG-BUZEI F_BUZEI.
    MODIFY TI_BSEG FROM S_BSEG TRANSPORTING BUZEI.
  ENDLOOP.

ENDFORM.                               " bseg_lines_numbering
*&---------------------------------------------------------------------*
*&      Form  nav_verteilen
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_TI_BSEG  text
*----------------------------------------------------------------------*
FORM NAV_VERTEILEN TABLES  TI_BSEG STRUCTURE BSEG.

  DATALT_BSEG_OUTPUT TYPE STANDARD TABLE OF BSEG,
        LT_BSEG_INPUT  TYPE STANDARD TABLE OF BSEG.

  DATALS_BSEG LIKE BSEG.                          "1824213 start
  DATALV_COUNTER TYPE I.

  FIELD-SYMBOLS<LS_BSEG>        TYPE BSEG,
                 <LS_BSEG_OUTPUT> TYPE BSEG.

  LOOP AT TI_BSEG ASSIGNING <LS_BSEG>
                 WHERE BUZID C_BUZID_SACH
                   AND KOART C_KOART_SACH.

    LV_COUNTER LV_COUNTER + 1.
    <LS_BSEG>-XREF1 LV_COUNTER.
    LS_BSEG <LS_BSEG>.
    APPEND LS_BSEG TO LT_BSEG_INPUT.
  ENDLOOP.

  CLEARLS_BSEG.

  CALL FUNCTION 'NDVAT_ADJUSTMENT'
    EXPORTING
      I_BSEG        LS_BSEG
      READ_BSEG     'X'
      CALCULATE     'M'
    IMPORTING
      E_BSEG        LS_BSEG
    TABLES
      T_BSEG_INPUT  LT_BSEG_INPUT
      T_BSEG_OUTPUT LT_BSEG_OUTPUT.

  LOOP AT TI_BSEG ASSIGNING <LS_BSEG>
                      WHERE BUZID C_BUZID_SACH
                        AND KOART C_KOART_SACH.

    READ TABLE LT_BSEG_OUTPUT ASSIGNING <LS_BSEG_OUTPUT>
                              WITH KEY XREF1 <LS_BSEG>-XREF1.
    IF <LS_BSEG_OUTPUT> IS ASSIGNED.
      <LS_BSEG>-WRBTR <LS_BSEG_OUTPUT>-WRBTR.
      DELETE TABLE LT_BSEG_OUTPUT FROM <LS_BSEG_OUTPUT>.
      CLEAR <LS_BSEG>-XREF1.
    ENDIF.
  ENDLOOP.                                           "1824213 end

ENDFORM.                               " nav_verteilen
*&---------------------------------------------------------------------*
*&      Form  null_lines_check                                         *
*&---------------------------------------------------------------------*
*  Prüft ob der Beleg nur 0-Zeilen beinhaltet                          *
*----------------------------------------------------------------------*
*      -->P_TAB_BSEG  text
*      <--P_X_FEHLER  text
*      <--P_S_MSG  text
*----------------------------------------------------------------------*
FORM NULL_LINES_CHECK TABLES   TI_BSEG STRUCTURE BSEG
                      CHANGING X_FEHLER TYPE C
                               S_MSG    TYPE TYP_MSG.

  DATAXNULLPOS LIKE BOOLE-BOOLE.

*--- Überprüfung, ob der zu erzeugende FI-Beleg nicht nur Nullzeilen --*
*--- enthält:                                                        --*
  MOVE 'X' TO XNULLPOS.
  LOOP AT TI_BSEG.
    IF XNULLPOS SPACE.
      EXIT.
    ELSE.
      IF TI_BSEG-WRBTR <> OR TI_BSEG-FWBAS <> 0.
        CLEAR XNULLPOS.
      ENDIF.
    ENDIF.
  ENDLOOP.

  IF XNULLPOS 'X'.
    CLEARS_MSG.
    S_MSG-MSGID C_MSGID_M8.
    S_MSG-MSGTY C_MSGTY_ERROR.
    S_MSG-MSGNO '278'.
    X_FEHLER X.
    EXIT.
  ENDIF.

ENDFORM.                               " null_lines_check
*&---------------------------------------------------------------------*
*&      Form  BADI_HEADERDATA_MODIFY
*&---------------------------------------------------------------------*
*  in this BAdI the vendor and the invoice type can be changed
*----------------------------------------------------------------------*
FORM BADI_HEADERDATA_MODIFY TABLES   IT_RKWA  TYPE TYP_TAB_RKWA
                            USING    I_BUKRS  LIKE BKPF-BUKRS
                            CHANGING X_BLART  LIKE T169F-BLART
                                     X_LIFNR  LIKE RKWA-LIFNR
                                     X_FEHLER TYPE C
                                     S_MSG    TYPE TYP_MSG.

  CALL FUNCTION 'MRMBADI_MRKO_HDAT_MODIFY'
    EXPORTING
      I_BUKRS    I_BUKRS
      I_LIFNR    X_LIFNR
      I_BLART    X_BLART
      TI_RKWA    IT_RKWA[]
    IMPORTING
      E_LIFNR    X_LIFNR
      E_BLART    X_BLART
    EXCEPTIONS
      BADI_ERROR 01.

  IF SY-SUBRC <> ).
    PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
    X_FEHLER X.
    EXIT.
  ENDIF.

ENDFORM.                               " badi_headerdata_modify
*eject
*&---------------------------------------------------------------------*
*&      Form  DOCUMENT_TYPE_CHECK
*&---------------------------------------------------------------------*
*  netto document type is not allowed
*----------------------------------------------------------------------*
FORM DOCUMENT_TYPE_CHECK USING    BLART    LIKE T169F-BLART
                         CHANGING S_T003   LIKE T003
                                  X_FEHLER TYPE C
                                  S_MSG    TYPE TYP_MSG.
  CLEARS_T003.

* gefundene Belegart darf nicht NettoBelegart sein
  CALL FUNCTION 'FI_DOCUMENT_TYPE_DATA'
    EXPORTING
      I_BLART       BLART
    IMPORTING
      E_T003        S_T003
    EXCEPTIONS
      ERROR_MESSAGE 1
      OTHERS        2.
  IF SY-SUBRC <> ).
    PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
    X_FEHLER X.
    EXIT.
  ENDIF.

  IF S_T003-XNETB ).
    CLEARS_MSG.
    S_MSG-MSGID C_MSGID_M8.
    S_MSG-MSGTY C_MSGTY_ERROR.
    S_MSG-MSGNO '733'.
    S_MSG-MSGV1 C_TCODE_MRKO.
    S_MSG-MSGV2 BLART.
    X_FEHLER X.
    EXIT.
  ENDIF.

ENDFORM.                    "document_type_check
*&--------------------------------------------------------------------*
*&      Form  fm_account_assignment_get
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
*      -->S_RKWA     text
*      -->S_BSEG     text
*      -->X_FEHLER   text
*      -->S_MSG      text
*---------------------------------------------------------------------*
FORM FM_ACCOUNT_ASSIGNMENT_GET USING S_RKWA   STRUCTURE RKWA
                            CHANGING S_BSEG   STRUCTURE BSEG
                                     X_FEHLER TYPE      C
                                     S_MSG    TYPE      TYP_MSG.
  INCLUDEIFIFMCON_APPL,
           IFIFMCON_BOOL.

  DATAL_F_MSEG              LIKE ACCTIT,
        L_FLAG_FMAKT          TYPE C,
        L_FLG_ISPS_NOT_ACTIVE TYPE C.
* definitions for reading archived documents from AIS
  DATALT_ARCMKPF  TYPE  TY_T_MKPF,
        LT_ARCMSEG  TYPE  TY_T_MSEG,
        LS_ARCMSEG  TYPE  MSEG,
        LS_BORIDENT TYPE  BORIDENT.

*----- Nur Aufrufen wenn IS-PS aktiv ist
  CALL FUNCTION 'FM00_CHECK_ISPS'
    IMPORTING
      E_FLG_ISPS_NOT_ACTIVE L_FLG_ISPS_NOT_ACTIVE.
  CHECK L_FLG_ISPS_NOT_ACTIVE IS INITIAL.

  CALL FUNCTION 'FMFK_BUKRS_CHECK_FMAKTIV'
    EXPORTING
      IP_BUKRS           S_RKWA-BUKRS
      IP_APPLC           APPLC_CA
    IMPORTING
      OP_IS_ACTIVE       L_FLAG_FMAKT
    EXCEPTIONS
      NO_FIKRS_FOR_BUKRS 01
      WRONG_INPUT_FLAG   02.                              "#EC *
  CHECK L_FLAG_FMAKT CON_JA AND SY-SUBRC IS INITIAL.

*----- HHM Kontierung aus dem Materialbeleg holen
  SELECT SINGLE FIPOS FISTL FKBER GEBER BUDGET_PD GRANT_NBR
    FROM ACCTIT
    INTO CORRESPONDING FIELDS OF L_F_MSEG
   WHERE AWTYP 'MKPF'
     AND AWREF S_RKWA-MBLNR
     AND AWORG S_RKWA-MJAHR
     AND ZEILE S_RKWA-ZEILE
     AND KTOSL 'GBB'.
  IF SY-SUBRC <> OR L_F_MSEG-FIPOS IS INITIAL.
    SELECT SINGLE FIPOS FISTL GEBER FKBER GRANT_NBR
      FROM MSEG
      INTO CORRESPONDING FIELDS OF L_F_MSEG
     WHERE MBLNR S_RKWA-MBLNR
       AND MJAHR S_RKWA-MJAHR
       AND ZEILE S_RKWA-ZEILE.
    IF SY-SUBRC <> 0.
* read MM doc data from AIS (archive)
      REFRESH LT_ARCMKPF.
      REFRESH LT_ARCMSEG.
      CLEAR   LS_BORIDENT.
      CONCATENATE  S_RKWA-MBLNR S_RKWA-MJAHR
                          INTO  LS_BORIDENT-OBJKEY.
      CALL FUNCTION 'ASH_MM_MATBEL_READ'
        EXPORTING
          I_BORIDENT    LS_BORIDENT
        TABLES
          ET_MKPF       LT_ARCMKPF
          ET_MSEG       LT_ARCMSEG
        EXCEPTIONS
          ERROR_MESSAGE 1
          OTHERS        4.
      IF SY-SUBRC 0.
        LOOP AT LT_ARCMSEG INTO LS_ARCMSEG
           WHERE ZEILE     S_RKWA-ZEILE.
          L_F_MSEG-FIPOS     LS_ARCMSEG-FIPOS.
          L_F_MSEG-FISTL     LS_ARCMSEG-FISTL.
          L_F_MSEG-GEBER     LS_ARCMSEG-GEBER.
          L_F_MSEG-FKBER     LS_ARCMSEG-FKBER.
          L_F_MSEG-GRANT_NBR LS_ARCMSEG-GRANT_NBR.
        ENDLOOP.
      ELSE.
        IF 2.
          MESSAGE E298(FI).
*   MSEG Zeile nicht gefunden! Ableitung der HHM Kontierung nicht möglic
        ENDIF.

        CLEARS_MSG.
        S_MSG-MSGID 'FI'.
        S_MSG-MSGTY C_MSGTY_ERROR.
        S_MSG-MSGNO '298'.
        X_FEHLER 'X'.
        EXIT.
      ENDIF.
    ENDIF.
  ENDIF.

  S_BSEG-GRANT_NBR  L_F_MSEG-GRANT_NBR.
  S_BSEG-FKBER_LONG L_F_MSEG-FKBER.
  S_BSEG-FIPOS L_F_MSEG-FIPOS.
  S_BSEG-GEBER L_F_MSEG-GEBER.
* Budget Period EhP4
  IF CL_OPS_SWITCH_CHECK=>OPS_SFWS_BUD_PERIS NOT INITIAL.
    S_BSEG-BUDGET_PD L_F_MSEG-BUDGET_PD.
  ENDIF.
  S_BSEG-FISTL L_F_MSEG-FISTL.
ENDFORM.                    "fm_account_assignment_get
*&---------------------------------------------------------------------*
*&      Form  withholding_tax_create
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_TAB_ACCIT_WT  text
*      -->P_TI_RBWS  text
*----------------------------------------------------------------------*
FORM WITHHOLDING_TAX_CREATE TABLES TE_ACCIT_WT STRUCTURE ACCIT_WT
                                   TI_RBWS     TYPE TYP_TAB_RBWS.

  CHECK NOT TI_RBWS[] IS INITIAL.

  DATAS_RBWS LIKE RBWS.

  LOOP AT TI_RBWS INTO S_RBWS.
    CLEAR TE_ACCIT_WT.
    MOVE-CORRESPONDING S_RBWS TO TE_ACCIT_WT.
    TE_ACCIT_WT-WT_KEY S_RBWS-SPLIT_KEY.
    APPEND TE_ACCIT_WT.
  ENDLOOP.

ENDFORM.                    " withholding_tax_create
*&---------------------------------------------------------------------*
*&      Form  vendor_taxnum_check
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_IT_RKWA  text
*      -->P_S_T001  text
*      -->P_LIFNR  text
*      <--P_X_FEHLER  text
*      <--P_S_MSG  text
*----------------------------------------------------------------------*
FORM VENDOR_TAXNUM_CHECK TABLES   TI_RKWA TYPE TYP_TAB_RKWA
                          USING    S_T001  LIKE T001
                                   I_LIFNR LIKE RKWA-LIFNR
                          CHANGING X_FEHLER TYPE C
                                   S_MSG   TYPE TYP_MSG.
  DATAS_TAXDATA   TYPE MRM_TAX_2,
        S_RKWA      LIKE RKWA,
        S_KRED      LIKE VF_KRED,
        TAB_TAXDATA TYPE MRM_TAB_TAXES,
        S_T005      LIKE T005.

  CALL FUNCTION 'READ_CUSTOMIZED_MESSAGE'
    EXPORTING
      I_ARBGB 'M8'
      I_DTYPE 'W'
      I_MSGNR '759'
    IMPORTING
      E_MSGTY SY-MSGTY.
  CHECK SY-MSGTY 'E'.

* read vendor
  CALL FUNCTION 'FI_VENDOR_DATA'
    EXPORTING
      I_LIFNR        I_LIFNR
    IMPORTING
      E_KRED         S_KRED
    EXCEPTIONS
      VENDOR_MISSING 1
      OTHERS         2.
  IF SY-SUBRC NE 0.
    PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
    X_FEHLER X.
    EXIT.
  ENDIF.

* check country of vendor
  CALL FUNCTION 'T005_SINGLE_READ'
    EXPORTING
      T005_LAND1 S_KRED-LAND1
    IMPORTING
      WT005      S_T005
    EXCEPTIONS
      NOT_FOUND  1
      OTHERS     2.
  IF SY-SUBRC <> 0.
    PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
    X_FEHLER X.
    EXIT.
  ELSEIF S_T005-XEGLD IS INITIAL.
    EXIT.
  ENDIF.

* fill table taxdata
  LOOP AT TI_RKWA INTO S_RKWA WHERE MWSKZ NE SPACE.
    S_TAXDATA-MWSKZ S_RKWA-MWSKZ.
    COLLECT S_TAXDATA INTO TAB_TAXDATA.
  ENDLOOP.

* read country data of company code
  CALL FUNCTION 'MRM_T005_READ'
    EXPORTING
      TI_T001    S_T001
    IMPORTING
      TE_T005    S_T005
    TABLES
      TI_TAXDATA TAB_TAXDATA"#EC FB_NORC

  IF SY-SUBRC <> 0.                                        "#EC FB_NORC
    PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
    X_FEHLER X.
    EXIT.
  ELSEIF S_T005-XEGLD IS INITIAL.
    EXIT.
  ENDIF.

* check tax number
  IF  S_T005-INTCA <> 'DE' AND S_KRED-STENR IS INITIAL )
      OR S_T005-INTCA =  'DE' AND S_KRED-STENR IS INITIAL
          AND S_KRED-STCD1 IS INITIAL AND S_KRED-STCEG IS INITIAL .
    SY-MSGTY 'E'.
    SY-MSGID 'M8'.
    SY-MSGNO '759'.
    PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
    X_FEHLER X.
    EXIT.
  ENDIF.

ENDFORM.                    " vendor_taxnum_check

*&---------------------------------------------------------------------*
*&      Form  LOCK_RKWA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_IT_RKWA  text
*      <--P_X_FEHLER  text
*      <--P_S_MSG  text
*----------------------------------------------------------------------*
FORM LOCK_RKWA TABLES   IT_RKWA TYPE TYP_TAB_RKWA
               CHANGING X_FEHLER
                        S_MSG   TYPE TYP_MSG.

  DATALS_RKWA LIKE RKWA.

  CLEAR X_FEHLER.

  LOOP AT IT_RKWA INTO LS_RKWA.
    CALL FUNCTION 'ENQUEUE_E_RKWA'
      EXPORTING
        MBLNR          LS_RKWA-MBLNR
        MJAHR          LS_RKWA-MJAHR
        ZEILE          LS_RKWA-ZEILE
      EXCEPTIONS
        FOREIGN_LOCK   1
        SYSTEM_FAILURE 2
        OTHERS         3.
    IF SY-SUBRC <> 0.
      PERFORM MSG_FUELLEN_SYSVAR CHANGING S_MSG.
      X_FEHLER 'X'.
      EXIT.
    ENDIF.
  ENDLOOP.

ENDFORM.                    " lock_rkwa


*{   INSERT
INCLUDE WRF_RMVKON00F01.    "Note 663537

*}   INSERT

寄售和管道结算