Skip to content
Skip to content
Menu
SAP ABAP DWIMAN
  • About
SAP ABAP DWIMAN

SAP ABAP – BDC Clearing F-51

By juananda.satria on December 11, 2023December 11, 2023

F-51 : Transfer posting with clearing

Here we go.

TOP

TYPES:
  tt_data       TYPE STANDARD TABLE OF yfs304,
  tt_data_other TYPE STANDARD TABLE OF yfs306.

TYPES: BEGIN OF ty_datasort.
        INCLUDE STRUCTURE  yfs304.
TYPES: sort TYPE i,
       END OF ty_datasort,
       tt_datasort TYPE TABLE OF ty_datasort.

DATA: gt_bdc    TYPE TABLE OF bdcdata.

MAIN

FUNCTION zfm_clearing.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     REFERENCE(IM_HEADER) TYPE  ZHEADER
*"  EXPORTING
*"     REFERENCE(EX_BELNR) TYPE  BELNR_D
*"  TABLES
*"      T_DATA STRUCTURE  ZSDATA
*"      T_RETURN STRUCTURE  BDCMSGCOLL
*"      T_RET2 STRUCTURE  BAPIRET2
*"      T_DATA_OTHER STRUCTURE  ZSOTHER
*"----------------------------------------------------------------------
  DATA: lv_mode   TYPE char1 VALUE 'N',
        lv_update TYPE c VALUE 'S'.

  LOOP AT t_data_other ASSIGNING FIELD-SYMBOL(<lfs_other>).
    <lfs_other>-newko = |{ <lfs_other>-newko ALPHA = IN }|.
  ENDLOOP.


  PERFORM f_fill_bdc_data USING im_header t_data_other[] t_data[].

  CALL TRANSACTION 'F-51'
    USING gt_bdc
    MODE lv_mode "gv_mode
    UPDATE lv_update
    MESSAGES INTO t_return.

  READ TABLE t_return INTO DATA(ls_return) WITH KEY msgtyp = 'S' msgid = 'F5' msgnr = '312'.
  IF sy-subrc EQ 0.
    ex_belnr = ls_return-msgv1.
  ENDIF.

  CALL FUNCTION 'CONVERT_BDCMSGCOLL_TO_BAPIRET2'
    TABLES
      imt_bdcmsgcoll = t_return[]
      ext_return     = t_ret2.


ENDFUNCTION.

F01

*&---------------------------------------------------------------------*
*&      Form  f_fill_bdc_data 
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_IM_HEADER  text
*      -->P_T_DATA_OTHER[]  text
*      -->P_T_DATA[]  text
*----------------------------------------------------------------------*
" we need lv_index to indexing amount to clearing because we have to match the amount with the document number while input

*----------------------------------------------------------------------*

FORM f_fill_bdc_data USING    ps_header TYPE yfs303
                              pt_data_other TYPE tt_data_other
                              pt_data TYPE tt_data.

  DATA: lv_date TYPE char10.
  DATA: lt_datasort TYPE tt_datasort.

  DATA: lv_bldat      TYPE char10,
        lv_budat      TYPE char10,
        lv_sel        TYPE char20,
        lv_index      TYPE sy-index,
        lv_line       TYPE sy-index,
        ls_other      TYPE yfs306,
        lv_gsber      TYPE bseg-gsber.

  DATA: BEGIN OF lw_data,
          kunnr TYPE bseg-kunnr,
          vbeln TYPE bseg-vbeln,
        END OF lw_data,
        lt_data LIKE TABLE OF lw_data.

  DATA: BEGIN OF lw_other,
          saknr TYPE ska1-saknr,
          ktoks TYPE ska1-ktoks,
        END OF lw_other,
        lt_other LIKE TABLE OF lw_other.

  DATA: lv_credit       TYPE char20,
        ls_data         LIKE LINE OF  pt_data,
        ls_datasort     TYPE ty_datasort.

  CLEAR: gt_bdc.

  IF pt_data IS NOT INITIAL.
    LOOP AT pt_data INTO DATA(ls_dt) .
      lw_data-kunnr = ls_dt-agkon.
      lw_data-vbeln = ls_dt-sel01.
      APPEND lw_data TO lt_data.
      CLEAR lw_data.
    ENDLOOP.

    SELECT vbeln, bukrs, kunnr, umsks, umskz, augdt, augbl, zuonr, gjahr, belnr, buzei, rebzg, rebzj, rebzz, wrbtr
       FROM bsid INTO TABLE @DATA(lt_bsid)
      FOR ALL ENTRIES IN @lt_data
      WHERE bukrs = @ps_header-bukrs
        AND kunnr = @lt_data-kunnr
        AND vbeln = @lt_data-vbeln.
  ENDIF.

  IF pt_data_other IS NOT INITIAL.
    LOOP AT pt_data_other INTO DATA(ls_dt_o).
      lw_other-saknr = ls_dt_o-newko+7.
      APPEND lw_other TO lt_other.
      CLEAR lw_other.
    ENDLOOP.

    SELECT saknr, ktoks
      FROM ska1 INTO TABLE @DATA(lt_ska1)
      FOR ALL ENTRIES IN @lt_other
      WHERE saknr = @lt_other-saknr.
  ENDIF.

  lv_bldat = ps_header-bldat+6(2) && '.' && ps_header-bldat+4(2) && '.' && ps_header-bldat+0(4).
  lv_budat = ps_header-budat+6(2) && '.' && ps_header-budat+4(2) && '.' && ps_header-budat+0(4).

  PERFORM bdc_dynpro USING  'SAPMF05A' '0122'.
  PERFORM bdc_field USING:  'BDC_OKCODE' '=SL',
                            'BKPF-BLDAT' lv_bldat,
                            'BKPF-BLART' ps_header-blart,
                            'BKPF-BUKRS' ps_header-bukrs,
                            'BKPF-BUDAT' lv_budat,
                            'BKPF-MONAT' ps_header-monat,
                            'BKPF-WAERS' ps_header-waers,
                            'BKPF-XBLNR' ps_header-xbeln,
                            'FS006-DOCID' '*'.

  lt_datasort = CORRESPONDING #( pt_data ).
  SORT lt_bsid BY kunnr bukrs umsks umskz augdt augbl zuonr gjahr belnr buzei.
  SORT lt_datasort BY agkon sel01.
  CLEAR: lv_index.
  LOOP AT lt_bsid INTO DATA(ls_bsid).
    DATA(lv_tabix) = sy-tabix.
    READ TABLE lt_datasort ASSIGNING FIELD-SYMBOL(<lfs_sort>) WITH KEY agkon = ls_bsid-kunnr sel01 = ls_bsid-belnr BINARY SEARCH.
    IF sy-subrc EQ 0.
      <lfs_sort>-sort = lv_tabix.
    ENDIF.
  ENDLOOP.

* -------------------------------------------------------------------
*  I N P U T   D O C U M E N T S
* -------------------------------------------------------------------
  SORT lt_datasort BY agkoa agkon sort.
  LOOP AT lt_datasort INTO ls_data GROUP BY ( agkoa = ls_data-agkoa agkon = ls_data-agkon ).
    lv_line = lv_line + 1.

    IF ls_data-agkoa = 'D' OR ls_data-agkoa = 'K'.
      IF lv_line = 1.
        lv_sel = 'RF05A-XPOS1(17)'. " billing document
      ELSE.
        lv_sel = 'RF05A-XPOS1(16)'. " billing document
      ENDIF.
    ELSEIF ls_data-agkoa = 'S'.
      lv_sel = 'RF05A-XPOS1(03)'. " document number
    ENDIF.


    PERFORM bdc_dynpro USING  'SAPMF05A' '0710'.
    PERFORM bdc_field USING:  'BDC_OKCODE' '/00',
                              'RF05A-AGBUK' ps_header-bukrs,
                              'RF05A-AGKON' ls_data-agkon,
                              'RF05A-AGKOA' ls_data-agkoa,
                              'RF05A-XNOPS' 'X',
                              'RF05A-XPOS1(01)' '',
                              lv_sel 'X'.

    LOOP AT GROUP ls_data INTO DATA(ls_data2).
      PERFORM bdc_dynpro USING  'SAPMF05A' '0731'.
      PERFORM bdc_field USING:  'BDC_CURSOR' 'RF05A-SEL01(01)',
                                'BDC_OKCODE' '/00',
                                'RF05A-SEL01(01)' ls_data2-sel01.
    ENDLOOP.


    PERFORM bdc_dynpro USING  'SAPMF05A' '0731'.
    PERFORM bdc_field USING:  'BDC_CURSOR' 'RF05A-SEL01(01)',
                              'BDC_OKCODE' '=SLK'.

  ENDLOOP.


  PERFORM bdc_dynpro USING  'SAPMF05A' '0710'.
  PERFORM bdc_field USING:  'BDC_OKCODE' '=PA',
                            'RF05A-AGBUK' '',
                            'RF05A-AGKON' '',
                            'RF05A-AGKOA' 'D',
                            'RF05A-XNOPS' 'X',
                            'RF05A-XPOS1(01)' 'X'.



* -------------------------------------------------------------------
*  I N P U T   A M O U N T   i n   P a r t i a l   a m t   t a b
* -------------------------------------------------------------------

  CLEAR: lv_index.
  SORT lt_bsid BY vbeln bukrs kunnr umsks umskz augdt augbl zuonr gjahr belnr buzei.
  LOOP AT lt_datasort INTO ls_datasort.
      IF ls_datasort-sort IS NOT INITIAL.
        lv_index = ls_datasort-sort.
      ELSE.
        lv_index = lv_index + 1.
      ENDIF.

      " amount initial dari parameter
      lv_credit = ls_datasort-amount.

      " jika ada document pembayaran bsid, maka dijumlahkan juga amountnya
      READ TABLE lt_bsid INTO ls_bsid WITH KEY vbeln = ls_datasort-sel01 BINARY SEARCH.
      IF sy-subrc EQ 0.
        LOOP AT lt_bsid INTO ls_bsid FROM sy-tabix.
          IF ls_bsid-vbeln NE ls_datasort-sel01.
            EXIT.
          ENDIF.

          IF ls_bsid-vbeln NE ls_bsid-belnr.
            lv_credit = lv_credit + ( ls_bsid-wrbtr * 100 ) .
          ENDIF.
        ENDLOOP.
      ENDIF.

      PERFORM bdc_dynpro USING  'SAPDF05X' '3100'.
      PERFORM bdc_field USING:  'BDC_OKCODE' '=PART',
                                'RF05A-ABPOS' lv_index.

      PERFORM bdc_dynpro USING  'SAPDF05X' '3100'.
      PERFORM bdc_field USING:  'BDC_OKCODE' '/00',
                                'RF05A-ABPOS' lv_index,
                                'DF05B-PSZAH(01)' lv_credit.

      PERFORM bdc_dynpro USING  'SAPDF05X' '3100'.
      PERFORM bdc_field USING:  'BDC_OKCODE' '/00',
                                'RF05A-ABPOS' lv_index.

  ENDLOOP.

  PERFORM bdc_dynpro USING  'SAPDF05X' '3100'.
  PERFORM bdc_field USING:  'BDC_OKCODE' '=KMD'.



* -------------------------------------------------------------------
*  I N P U T   O T H E R    D A T A
* -------------------------------------------------------------------

  LOOP AT pt_data_other INTO ls_other.

    PERFORM bdc_dynpro USING  'SAPMF05A' '0700'.
    PERFORM bdc_field USING  'BDC_OKCODE' '/00'.
    PERFORM bdc_field USING  'RF05A-NEWBS' ls_other-newbs.
    PERFORM bdc_field USING  'RF05A-NEWKO' ls_other-newko.


    CASE ls_other-newbs.
      WHEN '31' OR '21'.
        PERFORM bdc_dynpro USING 'SAPMF05A' '0302'.
        PERFORM bdc_field USING  'BDC_OKCODE' '=AB'.
        PERFORM bdc_field USING  'BSEG-GSBER' ls_other-gsber.
        PERFORM bdc_field USING  'BSEG-WRBTR' ls_other-wrbtr.
        PERFORM bdc_field USING  'BSEG-ZUONR' ls_other-zuonr.
        PERFORM bdc_field USING  'BSEG-SGTXT' ls_other-sgtxt.
        lv_date = |{ ls_other-valut+6(2) }.{ ls_other-valut+4(2) }.{ ls_other-valut(4) }|.
        PERFORM bdc_field USING  'BSEG-ZFBDT' lv_date.
      WHEN '17'.
        PERFORM bdc_dynpro USING  'SAPMF05A' '0301'.
        PERFORM bdc_field USING  'BDC_OKCODE' '=AB'.
        PERFORM bdc_field USING  'BSEG-WRBTR' ls_other-wrbtr.
        PERFORM bdc_field USING  'BSEG-ZUONR' ls_other-zuonr.
        PERFORM bdc_field USING  'BSEG-SGTXT' ls_other-sgtxt.
        lv_gsber = |{ ls_other-prctr ALPHA = OUT }|.
        PERFORM bdc_field USING  'BSEG-GSBER' lv_gsber.
      WHEN OTHERS.
        PERFORM bdc_dynpro USING  'SAPMF05A' '0300'.
        PERFORM bdc_field USING  'BDC_OKCODE' '=AB'.
        PERFORM bdc_field USING  'BSEG-WRBTR' ls_other-wrbtr.
        PERFORM bdc_field USING  'BSEG-ZUONR' ls_other-zuonr.
        PERFORM bdc_field USING  'BSEG-SGTXT' ls_other-sgtxt.
    ENDCASE.


    READ TABLE lt_ska1 INTO DATA(ls_ska1) WITH KEY saknr = ls_other-newko+7.
    IF ls_ska1-ktoks = '7000' OR ls_ska1-ktoks = '6000'.
      IF ls_other-newbs EQ '50'.
        PERFORM bdc_dynpro USING  'SAPLKACB' '0002'.
        PERFORM bdc_field USING  'BDC_OKCODE' '=ENTE'.
        PERFORM bdc_field USING  'COBL-PRCTR' ls_other-prctr.
        PERFORM bdc_field USING  'COBL-KOSTL' ls_other-kostl.
      ELSEIF ls_other-newbs EQ '40'.
        PERFORM bdc_dynpro USING  'SAPLKACB' '0002'.
        PERFORM bdc_field USING  'BDC_OKCODE' '=ENTE'.
        PERFORM bdc_field USING  'COBL-PRCTR' ls_other-prctr.
        PERFORM bdc_field USING  'COBL-KOSTL' ls_other-kostl.
      ENDIF.
    ELSE.
      IF ls_other-newbs EQ '50'.
        PERFORM bdc_dynpro USING  'SAPLKACB' '0002'.
        PERFORM bdc_field USING  'BDC_OKCODE' '=ENTE'.
      ELSEIF ls_other-newbs EQ '40'.
        PERFORM bdc_dynpro USING  'SAPLKACB' '0002'.
        PERFORM bdc_field USING  'BDC_OKCODE' '=ENTE'.
      ENDIF.
    ENDIF.

  ENDLOOP.

* -------------------------------------------------------------------
*  S A V E
* -------------------------------------------------------------------
  PERFORM bdc_dynpro USING  'SAPMF05A' '0700'.
  PERFORM bdc_field USING:  'BDC_OKCODE' '=BU'.


ENDFORM.

to be continued.. (will edit this post to add the structures)

Post navigation

SAP ABAP – ABAP Test Cockpit (ATC) with S4HANA READINESS 2023
SAP ABAP – Local Class DEFINITION DEFERRED

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Recent Posts

  • SAP ABAP – Generate Fiori URL
  • SAP ABAP – Workflow Agents CDS
  • SAP ABAP – Workflow Level with Table Function
  • SAP ABAP – Download ALV to Excel with Total and Subtotal
  • SAP ABAP – BDC Template

Recent Comments

  1. SAP ABAP – Simple Interface FTP Inbound (SAP Consume File From FTP) – SAP ABAP DWIMAN on SAP ABAP – String Encode & Decode BASE64
  2. Upload file – SAP ABAP DWIMAN on F4 Search Help File

Archives

  • May 2025
  • August 2024
  • June 2024
  • May 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • May 2023
  • April 2023

Categories

  • Uncategorized
©2026 SAP ABAP DWIMAN | WordPress Theme by SuperbThemes.com