1. 代码
![1](https://i-blog.csdnimg.cn/blog_migrate/6b55cdd4affc84ae254410db5815f86c.png)
FUNCTION z_fi_invoice_post_cleaning.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" REFERENCE(IS_INPUT) TYPE ZSIF_FI_I003_REQ_0003
*" REFERENCE(IV_BELNR) TYPE BELNR_D
*" EXPORTING
*" REFERENCE(ES_OUTPUT) TYPE ZSIF_FI_I003_RES_0003
*" RAISING
*" CX_INVALID_DATE
*"----------------------------------------------------------------------
DATA: lt_bdcdata TYPE TABLE OF bdcdata,
lt_message TYPE TABLE OF bdcmsgcoll,
lv_clean_date TYPE dats.
DATA: lv_count TYPE i.
DATA: lv_perpay_amount TYPE bdc_fval,
lv_msgtext TYPE string,
lv_mode TYPE rfpdo-allgazmd.
DATA: lo_invalid_date TYPE REF TO cx_invalid_date,
lv_belnr TYPE char30.
DATA: lv_bukrs TYPE bseg-bukrs,
lv_gjahr TYPE bseg-gjahr.
FIELD-SYMBOLS: <fs_message> TYPE bdcmsgcoll,
<fs_prepayment_lines> TYPE ty_prepayment_lines.
DATA(ls_ctu_params) = VALUE ctu_params( dismode = 'N' updmode = 'S' nobinpt = 'X' cattmode = 'A' ).
TRY.
lv_clean_date = zcl_abap_comm=>convert_date_to_internal( is_input-header-invoice_date ). "清账日期
CATCH cx_invalid_date INTO lo_invalid_date.
es_output-zpost_type = 'E'.
es_output-zpost_message = lo_invalid_date->get_text( ).
RETURN.
ENDTRY.
PERFORM frm_screen_line TABLES lt_bdcdata USING 'SAPMF05A' '0131'.
PERFORM frm_field_line TABLES lt_bdcdata USING 'BDC_OKCODE' '/05'.
lv_bukrs = |{ CONV bukrs( is_input-header-company_code ) ALPHA = IN } |.
PERFORM frm_field_line TABLES lt_bdcdata USING 'RF05A-AGKON' is_input-header-vendor_num. "供应商编码
PERFORM frm_field_line TABLES lt_bdcdata USING 'BKPF-BUDAT' lv_clean_date. "清账日期
PERFORM frm_field_line TABLES lt_bdcdata USING 'BKPF-MONAT' lv_clean_date+4(2). "清账期间
PERFORM frm_field_line TABLES lt_bdcdata USING 'BKPF-BUKRS' lv_bukrs. "清账公司
PERFORM frm_field_line TABLES lt_bdcdata USING 'BKPF-WAERS' is_input-header-currency_code."货币
PERFORM frm_field_line TABLES lt_bdcdata USING 'RF05A-AGUMS' 'Z'. "特别总账标识
PERFORM frm_field_line TABLES lt_bdcdata USING 'RF05A-XNOPS' 'X'.
PERFORM frm_field_line TABLES lt_bdcdata USING 'RF05A-XPOS1(01)' ''.
PERFORM frm_field_line TABLES lt_bdcdata USING 'RF05A-XPOS1(03)' 'X'.
LOOP AT gt_prepayment_lines ASSIGNING <fs_prepayment_lines>.
lv_belnr = <fs_prepayment_lines>-zprepay_doc && lv_clean_date+0(4) && <fs_prepayment_lines>-buzei.
PERFORM frm_screen_line TABLES lt_bdcdata USING 'SAPMF05A' '0733'.
PERFORM frm_field_line TABLES lt_bdcdata USING 'BDC_CURSOR' 'RF05A-SEL01(01)'.
PERFORM frm_field_line TABLES lt_bdcdata USING 'RF05A-FELDN(01)' 'BELNR'.
PERFORM frm_field_line TABLES lt_bdcdata USING 'BDC_OKCODE' '/00'.
PERFORM frm_field_line TABLES lt_bdcdata USING 'RF05A-SEL01(01)' lv_belnr.
"多敲一个回车
* PERFORM frm_screen_line TABLES lt_bdcdata USING 'SAPMF05A' '0733'.
* PERFORM frm_field_line TABLES lt_bdcdata USING 'BDC_CURSOR' 'RF05A-SEL01(01)'.
PERFORM frm_field_line TABLES lt_bdcdata USING 'BDC_OKCODE' '/00'.
ENDLOOP.
"MIRO发票对应财务凭证加入到清单
lv_bukrs = |{ CONV bukrs( is_input-header-company_code ) ALPHA = IN } |.
lv_gjahr = is_input-header-invoice_date+0(4).
SELECT SINGLE concat( a~belnr,concat( a~gjahr,a~buzei ) ) AS belnr_ref
FROM bseg AS a
WHERE bukrs = @lv_bukrs
AND belnr = @iv_belnr
AND gjahr = @lv_gjahr
AND koart = 'K'
INTO @lv_belnr.
PERFORM frm_screen_line TABLES lt_bdcdata USING 'SAPMF05A' '0733'.
PERFORM frm_field_line TABLES lt_bdcdata USING 'BDC_CURSOR' 'RF05A-SEL01(01)'.
PERFORM frm_field_line TABLES lt_bdcdata USING 'RF05A-FELDN(01)' 'BELNR'.
PERFORM frm_field_line TABLES lt_bdcdata USING 'BDC_OKCODE' '/00'.
PERFORM frm_field_line TABLES lt_bdcdata USING 'RF05A-SEL01(01)' lv_belnr.
"点击按钮处理未清项
PERFORM frm_screen_line TABLES lt_bdcdata USING 'SAPMF05A' '0733'.
PERFORM frm_field_line TABLES lt_bdcdata USING 'BDC_CURSOR' 'RF0