测试凭证
总账清账,账户类型选S,输入对应的会计科目,输入/05
输入对应凭证的行项次,凭证号&年度&项次
保存即可
TYPES: BEGIN OF ty_head,
bukrs TYPE bkpf-bukrs, ""公司代码
blart TYPE bkpf-blart, ""凭证类型
bldat TYPE bkpf-bldat, ""凭证中的凭证日期
budat TYPE bkpf-budat, ""凭证中的过账日期
monat TYPE bkpf-monat, ""会计期间
waers TYPE bkpf-waers, ""货币码
bktxt TYPE bkpf-bktxt, ""凭证抬头文本
hkont TYPE bseg-hkont, ""总账科目
agkon TYPE rf05a-agkon, ""工作清单的帐户号码关键字
agkoa TYPE rf05a-agkoa, ""帐户类型"
END OF ty_head.
TYPES: BEGIN OF ty_item,
bukrs TYPE bseg-bukrs, ""公司代码
belnr TYPE bseg-belnr, ""会计凭证号码
gjahr TYPE bseg-gjahr, ""会计年度
buzei TYPE bseg-buzei, ""会计凭证中的行项目数
umskz TYPE bseg-umskz, ""特别总账标识"
END OF ty_item.
*&---------------------------------------------------------------------*
*& Form frm_Clearing_GL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> GT_ITEM
*& --> GS_HEAD
*&---------------------------------------------------------------------*
*参考:https://www.cnblogs.com/caizjian/p/8067071.html
* https://blog.youkuaiyun.com/qq_41387691/article/details/142063857
FORM frm_clearing_gl TABLES p_lt_item USING p_ls_head.
DATA:ls_head TYPE ty_head,
lt_item TYPE TABLE OF ty_item,
ls_item TYPE ty_item.
DATA:lv_stype TYPE ftpost-stype VALUE 'K',
lt_ftpost TYPE STANDARD TABLE OF ftpost WITH HEADER LINE,
lt_blntab TYPE STANDARD TABLE OF blntab,
ls_blntab TYPE blntab,
lt_ftclear TYPE STANDARD TABLE OF ftclear,
ls_ftclear TYPE ftclear,
lt_fttax TYPE TABLE OF fttax.
DATA:
lv_message TYPE string. " 错误消息
CHECK p_lt_item[] IS NOT INITIAL.
CHECK p_ls_head IS NOT INITIAL.
lt_item[] = p_lt_item[].
ls_head = p_ls_head.
DEFINE populate_ftpost.
lt_ftpost-stype = &1. " 账户类型 D K S,这里是供应商的清账,故选 K
lt_ftpost-count = &2. " 行项次
lt_ftpost-fnam = &3. " 字段名
lt_ftpost-fval = &4. " 数据值
APPEND lt_ftpost.
END-OF-DEFINITION.
"清帐凭证抬头
populate_ftpost:
lv_stype 1 'BKPF-BUKRS' ls_head-bukrs, "公司代码
lv_stype 1 'BKPF-BLART' ls_head-blart, "凭证类型
lv_stype 1 'BKPF-BLDAT' ls_head-bldat, "凭证日期
lv_stype 1 'BKPF-BUDAT' ls_head-budat, "凭证中的过账日期
lv_stype 1 'BKPF-MONAT' ls_head-monat, ""会计期间
lv_stype 1 'BKPF-WAERS' ls_head-waers, "货币码
lv_stype 1 'BKPF-BKTXT' ls_head-bktxt. "凭证抬头文本
"遍历传入的未清项
LOOP AT lt_item INTO ls_item.
ls_ftclear-agkoa = ls_head-agkoa. " 账户类型
ls_ftclear-agkon = ls_head-agkon.""工作清单的帐户号码关键字
ls_ftclear-agbuk = ls_head-bukrs. " 公司代码
IF ls_item-umskz IS INITIAL.
ls_ftclear-xnops = 'X'. " 未清项
ELSE.
ls_ftclear-agums = ls_item-umskz. " 特别总账标志
ENDIF.
ls_ftclear-selfd = 'BELNR'. " 清账依据:凭证号
CONCATENATE ls_item-belnr ls_item-gjahr ls_item-buzei INTO ls_ftclear-selvon. " 凭证编号,会计年度,项次
APPEND ls_ftclear TO lt_ftclear.
ENDLOOP.
CLEAR:ls_item,ls_ftclear.
*"----------------------------------------------------------------------
* 调用清账接口
*"----------------------------------------------------------------------
" 初始化清账接口
CALL FUNCTION 'POSTING_INTERFACE_START'
EXPORTING
i_function = 'C'
i_keep = 'X'
i_mode = 'N' "N:不显示调用屏幕,A:显示
i_update = 'S' "同步
i_user = sy-uname
EXCEPTIONS
client_incorrect = 1
function_invalid = 2
group_name_missing = 3
mode_invalid = 4
update_invalid = 5
user_invalid = 6
OTHERS = 7.
IF sy-subrc <> 0.
lv_message = 'Error in POSTING_INTERFACE_START'.
RETURN.
ENDIF.
CALL FUNCTION 'POSTING_INTERFACE_CLEARING'
EXPORTING
i_auglv = 'UMBUCHNG' " 清账类型:转账并清账
i_tcode = 'FB05' " 事务代码:供应商清账
i_sgfunct = 'C'
IMPORTING
e_msgid = sy-msgid
e_msgno = sy-msgno
e_msgty = sy-msgty
e_msgv1 = sy-msgv1
e_msgv2 = sy-msgv2
e_msgv3 = sy-msgv3
e_msgv4 = sy-msgv4
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 OR lt_blntab IS INITIAL.
" 清账失败,获取错误信息
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = sy-msgid
msgnr = sy-msgno
msgv1 = sy-msgv1
msgv2 = sy-msgv2
msgv3 = sy-msgv3
msgv4 = sy-msgv4
IMPORTING
message_text_output = lv_message.
ELSE.
" 清账成功,更新凭证号
READ TABLE lt_blntab INTO ls_blntab INDEX 1.
ENDIF.
" 结束清账接口
CALL FUNCTION 'POSTING_INTERFACE_END'
EXPORTING
i_bdcimmed = 'X'
EXCEPTIONS
session_not_processable = 1
OTHERS = 2.
ENDFORM.