ABAP会计凭证生成接口
FUNCTION zfifm057.
*"----------------------------------------------------------------------
""本地接口:
*" EXPORTING
*" VALUE(HLYNUMBER) TYPE CHAR50
*" VALUE(TRANSACTIONNUMBER) TYPE CHAR50
*" VALUE(BELNR) TYPE BELNR_D
*" VALUE(ZMSGTYP) TYPE CHAR01
*" VALUE(ZMSGTXT) TYPE CHAR200
*" TABLES
*" IT_HEAD STRUCTURE ZFIFM057_HEAD
*" IT_ITEM STRUCTURE ZFIFM057_ITEM
*"----------------------------------------------------------------------
DATA:wa_documentheader TYPE bapiache09, "待传凭证抬头 工作区
wa_accountgl TYPE bapiacgl09, "总帐科目项 工作区
it_accountgl TYPE STANDARD TABLE OF bapiacgl09, "总帐科目项内表
wa_accountreceivable TYPE bapiacar09, "客户项目 工作区
it_accountreceivable TYPE STANDARD TABLE OF bapiacar09, "客户项目 内表
wa_accountpayable TYPE bapiacap09, "供应商项目 工作区
it_accountpayable TYPE STANDARD TABLE OF bapiacap09, "供应商项目内表
wa_currencyamount TYPE bapiaccr09, "货币项目 工作区
it_currencyamount TYPE STANDARD TABLE OF bapiaccr09, "货币项目 内表
wa_extension2 TYPE bapiparex, "参考结构 工作区
it_extension2 TYPE STANDARD TABLE OF bapiparex, "参考结构 内表
wa_return TYPE bapiret2, "返回参数 工作区
it_return TYPE STANDARD TABLE OF bapiret2,
l_obj_key TYPE bapiache09-obj_key.
DATA: wa_zexten LIKE zsfi001.
DATA: l_itemno TYPE char10 VALUE '0000000000'."行项目
DATA: lt_log_head TYPE TABLE OF ztwf004 WITH HEADER LINE,
lt_log_item TYPE TABLE OF ztwf005 WITH HEADER LINE.
CHECK it_head IS NOT INITIAL.
READ TABLE it_head INTO DATA(ls_head) INDEX 1 .
* wa_documentheader-ref_doc_no_long = ls_head-xblnr.
wa_documentheader-comp_code = ls_head-bukrs. "公司代码
wa_documentheader-doc_type = 'SA'. "凭证类型
wa_documentheader-doc_date = ls_head-bldat. "凭证中的凭证日期
wa_documentheader-pstng_date = ls_head-budat. "凭证中的记帐日期
wa_documentheader-ref_doc_no = ls_head-xblnr. "参考凭证号
wa_documentheader-header_txt = ls_head-bktxt. "凭证抬头文本
wa_documentheader-username = sy-uname. "用户
LOOP AT it_item INTO DATA(ls_item).
ADD 1 TO l_itemno.
IF ls_item-koart = 'S' OR ( ls_item-lifnr IS INITIAL AND ls_item-kunnr IS INITIAL ).
"总账相关的行项目信息
wa_accountgl-itemno_acc = l_itemno . "凭证行项目
wa_accountgl-costcenter = ls_item-kostl . "成本中心
wa_accountgl-profit_ctr = ls_item-prctr . "利润中心
wa_accountgl-gl_account = ls_item-hkont. "会计科目
wa_accountgl-item_text = ls_item-sgtxt. "项目行文本
wa_accountgl-alloc_nmbr = ls_item-zuonr. "分配号
IF ls_item-aufnr IS NOT INITIAL.
wa_accountgl-orderid = ls_item-aufnr. "订单号
ENDIF.
APPEND wa_accountgl TO it_accountgl .
ENDIF.
IF ls_item-koart = 'K' OR ls_item-lifnr IS NOT INITIAL."供应商
wa_accountpayable-itemno_acc = l_itemno . "凭证行项目
wa_accountpayable-vendor_no = ls_item-lifnr. "供应商
wa_accountpayable-alloc_nmbr = ls_item-zuonr. "分配号
wa_accountpayable-item_text = ls_item-sgtxt. "项目行文本
APPEND wa_accountpayable TO it_accountpayable.
ENDIF.
IF ls_item-koart = 'D' OR ls_item-kunnr IS NOT INITIAL."客户.
wa_accountreceivable-itemno_acc = l_itemno . "凭证行项目
wa_accountreceivable-customer = ls_item-kunnr.
wa_accountreceivable-gl_account = ls_item-hkont.
wa_accountreceivable-profit_ctr = ls_item-prctr . "利润中心
wa_accountreceivable-item_text = ls_item-sgtxt. "项目行文本
wa_accountreceivable-bline_date = ls_item-zfbdt. "到期日期计算的起算日期
APPEND wa_accountreceivable TO it_accountreceivable.
ENDIF.
"货币行项目信息
IF ls_item-shkzg = 'H'.
ls_item-cny_amount = ls_item-cny_amount * ( -1 ).
ls_item-dmbtr = ls_item-dmbtr * ( -1 ).
ENDIF.
wa_currencyamount-itemno_acc = l_itemno .
wa_currencyamount-amt_doccur = ls_item-cny_amount. "原币金额
wa_currencyamount-currency = ls_head-waers.
IF ls_head-hwaer IS NOT INITIAL.
wa_currencyamount-currency = ls_head-hwaer.
wa_currencyamount-amt_doccur = ls_item-dmbtr. "本位币金额
ENDIF.
wa_currencyamount-exch_rate = ls_item-kursf. "汇率
APPEND wa_currencyamount TO it_currencyamount.
wa_zexten-posnr = l_itemno.
CASE ls_head-zbdlx.
WHEN '出差费用报销单' OR '个人报销'.
IF ls_head-zspjd = 'FA'. "往来凭证
IF ls_item-shkzg = 'S'.
wa_zexten-bschl = '40'.
ELSE.
wa_zexten-bschl = '31'.
ENDIF.
ENDIF.
IF ls_head-zspjd = 'CA'."付款凭证
"如果实际付款金额为0时,则不产生凭证
IF line_exists( it_currencyamount[ amt_doccur = 0 ] ).
hlynumber = ls_head-hlynumber.
transactionnumber = ls_head-transactionnumber.
zmsgtyp = 'E'.
zmsgtxt = '实际付款金额为0!'.
RETURN.
ENDIF.
IF ls_item-shkzg = 'S'.
wa_zexten-bschl = '25'.
ELSE.
wa_zexten-bschl = '50'.
wa_zexten-zzcf = ls_item-zzcf. "现金流量项
ENDIF.
ENDIF.
WHEN '借款单' .
IF ls_head-zfylx = '日常借款'.
IF ls_item-shkzg = 'S'.
wa_zexten-bschl = '25'.
ELSE.
wa_zexten-bschl = '50'.
wa_zexten-zzcf = ls_item-zzcf. "现金流量项
ENDIF.
ENDIF.
IF ls_head-zfylx = '房租押金' OR ls_head-zfylx = '保证金退款'.
IF ls_item-shkzg = 'S'.
wa_zexten-bschl = '29'.
wa_zexten-umskz = ls_item-umskz. "特殊总账标识
ELSE.
wa_zexten-bschl = '50'.
wa_zexten-zzcf = ls_item-zzcf. "现金流量项
ENDIF.
ENDIF.
WHEN '还款单'.
IF ls_head-zfylx = '日常借款还款'.
IF ls_item-shkzg = 'S'.
wa_zexten-bschl = '40'.
wa_zexten-zzcf = ls_item-zzcf. "现金流量项
ELSE.
wa_zexten-bschl = '31'.
ENDIF.
ENDIF.
IF ls_head-zfylx = '房租押金还款' OR ls_head-zfylx = '保证金退款还款'.
IF ls_item-shkzg = 'S'.
wa_zexten-bschl = '40'.
wa_zexten-zzcf = ls_item-zzcf. "现金流量项
ELSE.
wa_zexten-bschl = '39'.
wa_zexten-umskz = ls_item-umskz. "特殊总账标识
ENDIF.
ENDIF.
WHEN '培训付款单' OR '会议付款单' OR '对公付款'.
IF ls_head-zspjd = 'FA' AND ls_head-zsfdp = ''.
IF ls_item-shkzg = 'S'.
wa_zexten-bschl = '25'.
ELSE.
wa_zexten-bschl = '50'.
wa_zexten-zzcf = ls_item-zzcf. "现金流量项
ENDIF.
ELSEIF ls_head-zspjd = 'FA' AND ls_head-zsfdp = 'X'.
IF ls_item-shkzg = 'S'.
wa_zexten-bschl = '40'.
ELSE.
wa_zexten-bschl = '31'.
ENDIF.
ELSEIF ls_head-zspjd = 'CA' .
"如果实际付款金额为0时,则不产生凭证
IF line_exists( it_currencyamount[ amt_doccur = 0 ] ).
hlynumber = ls_head-hlynumber.
transactionnumber = ls_head-transactionnumber.
zmsgtyp = 'E'.
zmsgtxt = '实际付款金额为0!'.
RETURN.
ENDIF.
IF ls_item-shkzg = 'S'.
wa_zexten-bschl = '25'.
ELSE.
wa_zexten-bschl = '50'.
wa_zexten-zzcf = ls_item-zzcf. "现金流量项
ENDIF.
ENDIF.
WHEN OTHERS.
ENDCASE.
wa_extension2-structure = 'ZSFI001'.
wa_extension2-valuepart1 = wa_zexten.
APPEND wa_extension2 TO it_extension2.
ENDLOOP.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = wa_documentheader
IMPORTING
obj_key = l_obj_key
TABLES
accountgl = it_accountgl
accountreceivable = it_accountreceivable
accountpayable = it_accountpayable
currencyamount = it_currencyamount
return = it_return
extension2 = it_extension2.
READ TABLE it_return INTO wa_return WITH KEY type = 'E'.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LOOP AT it_return INTO wa_return WHERE ( type = 'E' OR type = 'A').
zmsgtxt = zmsgtxt && wa_return-message.
ENDLOOP.
zmsgtyp = 'E'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
zmsgtyp = 'S'.
belnr = l_obj_key(10).
ENDIF.
hlynumber = ls_head-hlynumber.
transactionnumber = ls_head-transactionnumber.
WAIT UP TO '0.5' SECONDS.
UPDATE bkpf SET xblnr_alt = ls_head-xblnr_alt WHERE bukrs = ls_head-bukrs AND belnr = l_obj_key(10) AND gjahr = ls_head-budat(4).
IF sy-subrc = 0.
COMMIT WORK .
ELSE.
ROLLBACK WORK.
ENDIF.
"日志保存
MOVE-CORRESPONDING ls_head TO lt_log_head.
lt_log_head-belnr = l_obj_key(10).
lt_log_head-ztime = sy-datum && sy-uzeit.
lt_log_head-zhlyl = ls_head-hlynumber.
lt_log_head-zhlym = ls_head-transactionnumber.
APPEND lt_log_head.
CLEAR : l_itemno.
LOOP AT it_item INTO ls_item.
ADD 1 TO l_itemno.
MOVE-CORRESPONDING ls_item TO lt_log_item.
lt_log_item-ztime = sy-datum && sy-uzeit.
lt_log_item-belnr = l_obj_key(10).
lt_log_item-buzei = l_itemno.
ENDLOOP.
MODIFY ztwf004 FROM TABLE lt_log_head.
IF sy-subrc = 0.
COMMIT WORK .
ELSE.
ROLLBACK WORK.
ENDIF.
MODIFY ztwf005 FROM TABLE lt_log_item.
IF sy-subrc = 0.
COMMIT WORK .
ELSE.
ROLLBACK WORK.
ENDIF.
ENDFUNCTION.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通