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)