- 业务场景
当使用f-44供应商/f-32客户批量清账的时候,需要用户手动匹配行去清账,满足不了用户的自动清账。
使用函数:POSTING_INTERFACE_START
POSTING_INTERFACE_CLEARING
POSTING_INTERFACE_END
2. 录屏操作
FB05填好数据后,点击选择未清项;凭证类型根据系统配置对应的清账
不同的清账,选择不同的科目类型,K代表供应商,D代表客户,S代表总账科目;如果特殊总账标识填了的话,就不用勾选标准未清项,勾选未清项也不填特殊总账标识。填好之后,输入/05填写筛选条件:
填写好筛选条件之后,点击’处理未清项目’,按会计凭证+公司代码+行项目填写;注意:如果O7F3 里面没有配置行项目,则用行项目筛选会不生效,需要去配置上:
点击’剩余项目’页签,这个得通过录屏传到增强点进行处理:
然后,点击查询,按凭证编号和行项目查询,如果有剩余金额,填到对应的行,再保存就可以:
3.代码处理
FUNCTION zfmfi012.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(I_BKPF) TYPE BKPF OPTIONAL
*" EXPORTING
*" VALUE(E_BUKRS) TYPE BUKRS
*" VALUE(E_BELNR) TYPE BELNR_D
*" VALUE(E_GJAHR) TYPE GJAHR
*" VALUE(E_TYPE) TYPE BAPI_MTYPE
*" VALUE(E_MESSAGE) TYPE BAPI_MSG
*" TABLES
*" IT_BSEG STRUCTURE BSEG OPTIONAL
*"----------------------------------------------------------------------
DATA:lt_blntab TYPE STANDARD TABLE OF blntab INITIAL SIZE 0,
lt_bsid_clearing TYPE STANDARD TABLE OF bsid INITIAL SIZE 0,
lt_ftclear TYPE STANDARD TABLE OF ftclear INITIAL SIZE 0,
lt_ftpost TYPE STANDARD TABLE OF ftpost INITIAL SIZE 0,
lt_fttax TYPE STANDARD TABLE OF fttax INITIAL SIZE 0.
DATA:ls_ftpost LIKE LINE OF lt_ftpost,
ls_bsid_clearing LIKE LINE OF lt_bsid_clearing,
ls_ftclear LIKE LINE OF lt_ftclear,
ls_blntab LIKE LINE OF lt_blntab.
DATA: lv_psdif TYPE string,
lv_belnr TYPE bseg-belnr,
lv_buzei TYPE bseg-buzei.
DATA:gv_id TYPE char20. "MEMORY ID
DATA: lt_bdcdata TYPE TABLE OF bdcdata. "FB05录屏补充内表
DATA: ls_bdcdata TYPE bdcdata.
DATA p_mode TYPE rfpdo-allgazmd VALUE 'N'.
DATA:lv_auglv TYPE t041a-auglv.
DATA:ev_msgid TYPE sy-msgid,
ev_msgno TYPE sy-msgno,
ev_msgty TYPE sy-msgty,
ev_msgv1 TYPE sy-msgv1,
ev_msgv2 TYPE sy-msgv2,
ev_msgv3 TYPE sy-msgv3,
ev_msgv4 TYPE sy-msgv4,
ev_subrc TYPE sy-subrc.
* 定义宏
DEFINE def_ftpost.
ls_ftpost-stype = &1.
ls_ftpost-count = &2.
ls_ftpost-fnam = &3.
ls_ftpost-fval = &4.
APPEND ls_ftpost TO lt_ftpost.
END-OF-DEFINITION.
DEFINE def_bdcdata.
CLEAR ls_bdcdata.
ls_bdcdata-program = &1.
ls_bdcdata-dynpro = &2.
ls_bdcdata-dynbegin = &3.
ls_bdcdata-fnam = &4.
ls_bdcdata-fval = &5.
APPEND ls_bdcdata TO lt_bdcdata.
END-OF-DEFINITION.
** 抬头
def_ftpost: 'K' '001' 'BKPF-BUKRS' i_bkpf-bukrs, "公司代码
'K' '001' 'BKPF-BUDAT' i_bkpf-budat, "过账日期
'K' '001' 'BKPF-BLDAT' i_bkpf-bldat, "记账日期
'K' '001' 'BKPF-MONAT' i_bkpf-budat+4(2), "期间
'K' '001' 'BKPF-BLART' i_bkpf-blart, "凭证类型
'K' '001' 'BKPF-WAERS' i_bkpf-waers, "货币
'K' '001' 'BKPF-BKTXT' i_bkpf-bktxt, "抬头文本
'K' '001' 'BKPF-XBLNR' i_bkpf-xblnr. "参考
IF i_bkpf-blart = 'DZ'.
lv_auglv = 'EINGZAHL'.
ELSEIF i_bkpf-blart = 'KZ'.
lv_auglv = 'AUSGZAHL'.
ENDIF.
CALL FUNCTION 'POSTING_INTERFACE_START'
EXPORTING
i_client = sy-mandt
i_function = 'C'
i_keep = 'X'
i_mode = p_mode
i_update = 'S'
i_user = sy-uname
EXCEPTIONS
client_incorrect = 1
function_invalid = 2
group_name_missing = 3
mode_invalid = 4
update_invalid = 5
OTHERS = 6.
IF sy-subrc <> 0.
e_type = 'E'.
e_message = 'Error Message'.
ELSE.
* 筛选凭证号
CLEAR lv_psdif.
LOOP AT it_bseg INTO DATA(ls_bseg).
CLEAR ls_ftclear.
IF i_bkpf-blart = 'DZ'.
ls_ftclear-agkoa = 'D'. "科目类型 客户
ls_ftclear-agkon = ls_bseg-kunnr. "科目 客户
ELSEIF i_bkpf-blart = 'KZ'.
ls_ftclear-agkoa = 'K'. "科目类型 供应商
ls_ftclear-agkon = ls_bseg-lifnr. "科目 供应商
ENDIF.
ls_ftclear-agbuk = ls_bseg-bukrs. "公司代码
IF ls_bseg-umskz IS NOT INITIAL.
ls_ftclear-xnops = ''. "标准未清项
ls_ftclear-agums = ls_bseg-umskz. "特殊总账标识
ELSE.
ls_ftclear-xnops = 'X'. "标准未清项
ls_ftclear-agums = ''. "特殊总账标识
ENDIF.
ls_ftclear-selfd = 'BELNR'.
ls_ftclear-selvon = ls_bseg-belnr && ls_bseg-gjahr && ls_bseg-buzei.
* ls_ftclear-selbis = ls_bseg-belnr.
APPEND ls_ftclear TO lt_ftclear.
IF ls_bseg-shkzg = 'S'.
lv_psdif = ls_bseg-dmbtr.
lv_belnr = ls_bseg-belnr.
lv_buzei = ls_bseg-buzei.
ENDIF.
ENDLOOP.
* --录屏,跳转到剩余清账界面
CLEAR:lt_bdcdata,gv_id.
CONCATENATE sy-uname 'ADD_SCR' INTO gv_id.
CONDENSE lv_psdif NO-GAPS.
def_bdcdata: 'SAPDF05X' '3100' 'X' '' '',
'' '' '' 'BDC_OKCODE' '=REST',
'' '' '' 'BDC_SUBSCR' 'SAPDF05X 6102PAGE',
'' '' '' 'BDC_CURSOR' 'RFOPS_DK-BELNR(01)',
'' '' '' 'RF05A-ABPOS' '1'.
"筛选会计凭证
def_bdcdata: 'SAPDF05X' '3100' 'X' '' '',
'' '' '' 'BDC_OKCODE' '=OSU',
'' '' '' 'BDC_SUBSCR' 'SAPDF05X 6106PAGE',
'' '' '' 'BDC_SUBSCR' 'DF05B-PSDIF(01)',
'' '' '' 'RF05A-ABPOS' '1'.
def_bdcdata: 'SAPDF05X' '2000' 'X' '' '',
'' '' '' 'BDC_OKCODE' '=REST',
'' '' '' 'BDC_CURSOR' 'RF05A-XPOS1(03)', "不同系统这个配置顺序可能是不一样的,需要调整
'' '' '' 'BDC_CURSOR' '=GO',
'' '' '' 'RF05A-XPOS1(01)' '',
'' '' '' 'RF05A-XPOS1(03)' 'X'.
def_bdcdata: 'SAPDF05X' '0731' 'X' '' '',
'' '' '' 'BDC_OKCODE' '=REST',
'' '' '' 'BDC_CURSOR' 'RF05A-SEL01(01)',
'' '' '' 'BDC_CURSOR' '=GO',
'' '' '' 'RF05A-SEL01(01)' lv_belnr.
"筛选行项目
def_bdcdata: 'SAPDF05X' '3100' 'X' '' '',
'' '' '' 'BDC_OKCODE' '=OSU',
'' '' '' 'BDC_SUBSCR' 'SAPDF05X 6106PAGE',
'' '' '' 'BDC_SUBSCR' 'DF05B-PSDIF(01)',
'' '' '' 'RF05A-ABPOS' '1'.
def_bdcdata: 'SAPDF05X' '2000' 'X' '' '',
'' '' '' 'BDC_OKCODE' '=REST',
'' '' '' 'BDC_CURSOR' 'RF05A-XPOS1(04)', "不同系统这个配置顺序可能是不一样的,需要调整
'' '' '' 'BDC_CURSOR' '=GO',
'' '' '' 'RF05A-XPOS1(01)' '',
'' '' '' 'RF05A-XPOS1(04)' 'X'.
def_bdcdata: 'SAPDF05X' '0731' 'X' '' '',
'' '' '' 'BDC_OKCODE' '=REST',
'' '' '' 'BDC_CURSOR' 'RF05A-SEL01(01)',
'' '' '' 'BDC_CURSOR' '=GO',
'' '' '' 'RF05A-SEL01(01)' lv_buzei.
"填入清账剩余金额
def_bdcdata: 'SAPDF05X' '3100' 'X' '' '',
'' '' '' 'BDC_OKCODE' '/00',
'' '' '' 'BDC_SUBSCR' 'SAPDF05X 6106PAGE',
'' '' '' 'BDC_SUBSCR' 'DF05B-PSDIF(01)',
'' '' '' 'RF05A-ABPOS' '1',
'' '' '' 'DF05B-PSDIF(01)' lv_psdif.
"保存
def_bdcdata: 'SAPDF05X' '3100' 'X' '' '',
'' '' '' 'BDC_OKCODE' '=BU',
'' '' '' 'BDC_SUBSCR' 'SAPDF05X 6106PAGE',
'' '' '' 'BDC_CURSOR' 'DF05B-PSDIF(01)',
'' '' '' 'RF05A-ABPOS' '1'.
"
def_bdcdata: 'SAPMF05A' '0700' 'X' '' '',
'' '' '' 'BDC_OKCODE' '=PI',
'' '' '' 'BDC_CURSOR' 'RF05A-AZEI1(01)',
'SAPMF05A' 'SAPMF05A' 'X' '' '',
'' '' '' 'SAPMF05A' '=BU'.
EXPORT lt_bdcdata FROM lt_bdcdata TO MEMORY ID gv_id. "补充屏幕数据 to LFIPIF00->1916行
CALL FUNCTION 'POSTING_INTERFACE_CLEARING'
EXPORTING
i_auglv = lv_auglv
i_tcode = 'FB05'
i_sgfunct = 'C'
IMPORTING
e_msgid = ev_msgid
e_msgno = ev_msgno
e_msgty = ev_msgty
e_msgv1 = ev_msgv1
e_msgv2 = ev_msgv2
e_msgv3 = ev_msgv3
e_msgv4 = ev_msgv4
e_subrc = ev_subrc
TABLES
t_blntab = lt_blntab
t_ftclear = lt_ftclear
t_ftpost = lt_ftpost
t_fttax = lt_fttax
EXCEPTIONS
clearing_procedure_invalid = 1
clearing_procedure_missing = 2
table_t041a_empty = 3
transaction_code_invalid = 4
amount_format_error = 5
too_many_line_items = 6
company_code_invalid = 7
screen_not_found = 8
no_authorization = 9
OTHERS = 10.
IF sy-subrc <> 0.
e_type = 'E'.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
INTO e_message
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
CLEAR ls_blntab.
READ TABLE lt_blntab INTO ls_blntab INDEX 1.
IF sy-subrc = 0.
e_belnr = ls_blntab-belnr.
e_bukrs = ls_blntab-bukrs.
e_gjahr = ls_blntab-gjahr.
e_type = 'S'.
e_message = '清账成功'.
ENDIF.
CALL FUNCTION 'POSTING_INTERFACE_END'
EXPORTING
i_bdcimmed = 'X'
EXCEPTIONS
session_not_processable = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDIF.
ENDIF.
ENDFUNCTION.
增强点:LFIPIF00->1916行,录屏操作内存传值传到这里,然后下面标准代码会走这些录屏操作调整到对应的页签,内存传值ID记得用账号拼接,防止造成数据错乱:
DATA:lt_bdcdata TYPE TABLE OF bdcdata,
gv_id TYPE char20.
CLEAR:lt_bdcdata,gv_id.
"点击剩余、部分清账
CONCATENATE sy-uname 'ADD_SCR' INTO gv_id.
IMPORT lt_bdcdata = lt_bdcdata FROM MEMORY ID gv_id.
IF sy-subrc = 0.
APPEND LINES OF lt_bdcdata TO ft.
LOOP AT ft WHERE fval = '/11'. "识别不了/11,换成=PA 跳转到未清项
ft-fval = '=PA'.
MODIFY ft.
ENDLOOP.
ENDIF.
FREE MEMORY ID gv_id.