FUNCTION zfmfi_if804.*"----------------------------------------------------------------------*"*"本地接口:*" IMPORTING*" VALUE(IS_HEAD) TYPE ZSLOG_101 OPTIONAL*" EXPORTING*" VALUE(ES_HEAD) TYPE ZSLOG_101*" VALUE(EV_STATUS) TYPE BAPI_MTYPE*" VALUE(EV_MESSAGE) TYPE BAPI_MSG*" TABLES*" T_HEAD STRUCTURE ZSFI_001H OPTIONAL*" T_ITEM STRUCTURE ZSFI_001 OPTIONAL*" T_RETURN STRUCTURE ZSFI_001R OPTIONAL*"---------------------------------------------------------------------- zfdatasave_name 'ZFMFI_IF804'. DATA: ls_documentheader TYPE bapiache09, "待传凭证抬头 工作区 ls_accountgl TYPE bapiacgl09, "总帐科目项 工作区 lt_accountgl TYPE STANDARD TABLE OF bapiacgl09, "总帐科目项内表 ls_currencyamount TYPE bapiaccr09, "货币项目 工作区 lt_currencyamount TYPE STANDARD TABLE OF bapiaccr09, "货币项目 内表 ls_accountreceivable TYPE bapiacar09, "客户项目 工作区 lt_accountreceivable TYPE STANDARD TABLE OF bapiacar09, "客户项目 内表 ls_accountpayable TYPE bapiacap09, "供应商项目 工作区 lt_accountpayable TYPE STANDARD TABLE OF bapiacap09, "供应商项目内表 lt_tax TYPE STANDARD TABLE OF bapiactx09, "税务项目 ls_tax TYPE bapiactx09, "税务项目 ls_return TYPE bapiret2, "返回参数 工作区 lt_return TYPE STANDARD TABLE OF bapiret2, "参考结构 内表 lt_extension2 TYPE STANDARD TABLE OF bapiparex, "参考结构 内表 ls_extension2 TYPE bapiparex, lv_belnr TYPE bapiache09-obj_key. "参考结构 内表 "扩展字段 DATA: ls_zexten LIKE zexten. "ZEXTEN SE11创建的那个结构 DATA:lv_no TYPE i. DATA:ls_return1 TYPE zsfi_001r, lt_log TYPE TABLE OF ztfico001, ls_log TYPE ztfico001, lv_kostl TYPE ztfico001-kostl, lv_message(250) TYPE c. DATA : lv_reversal TYPE bapiacrev, lv_bus_act TYPE bapiache09-bus_act, lv_obj_key TYPE bapiacrev-obj_key, lt_return2 TYPE TABLE OF bapiret2 WITH HEADER LINE, ls_return2 TYPE bapiret2, lv_lgo_sys TYPE tbdls-logsys.*--Changeby TCD 2026-02-28--start------------------------------------------------* 需求:当费用科目为福利费(6601040100)或职工教育经费(6601050100)时,* 需要增加应付职工薪酬过渡科目,生成三行凭证:* 行1:借:费用科目(原借贷方向不变)* 行2:贷:应付职工薪酬-费用科目(计提)* 行3:借:应付职工薪酬-费用科目(支付)* 原凭证中的其他应收款科目由其他行处理保持不变 "需要特殊处理的费用科目 CONSTANTS: BEGIN OF lc_special_expense, welfare TYPE saknr VALUE '6601040100', "福利费 education TYPE saknr VALUE '6601050100', "职工教育经费 END OF lc_special_expense. "对应的应付职工薪酬科目 CONSTANTS: BEGIN OF lc_payable, welfare TYPE saknr VALUE '2211020000', "应付职工薪酬-福利费 education TYPE saknr VALUE '2211050000', "应付职工薪酬-职工教育经费 END OF lc_payable.*--Changeby TCD 2026-02-28--end------------------------------------------------ lv_no = 0. "报销 LOOP AT t_head INTO DATA(ls_head).*--------add by TCD on 20260120-----------start*限制不能重复创建会计凭证*确保凭证抬头文本抬头是唯一的*凭证抬头文本是OA的流程单(例如:FYBXD2026011925247) DATA: lv_bktxt_exists TYPE bkpf-belnr. CLEAR: lv_bktxt_exists. "检查BKPF表中是否存在相同的凭证抬头文本 SELECT SINGLE belnr FROM bkpf INTO @lv_bktxt_exists WHERE bktxt = @ls_head-bktxt AND bukrs = @ls_head-bukrs AND xreversal = ''. "如果凭证已经存在,则返回成功消息,跳过处理 IF lv_bktxt_exists IS NOT INITIAL. ls_return1-status = 'S'. ls_return1-belnr = lv_bktxt_exists. ls_return1-bukrs = ls_head-bukrs. ls_return1-gjahr = ls_head-gjahr. ls_return1-message = |凭证已存在,无需重复创建.|. APPEND ls_return1 TO t_return. "记录日志 ls_log-rldnr = ls_head-rldnr. "分类账 ls_log-bukrs = ls_head-bukrs. "分类账 ls_log-gjahr = ls_head-gjahr. "分类账 ls_log-zlsh = ls_head-bktxt. "流水号 ls_log-belnr = lv_bktxt_exists."会计凭证号 ls_log-zzt = '10'. "状态 ls_log-status = 'S'. ls_log-message = |凭证已存在,无需重复创建.|. APPEND ls_log TO lt_log. CONTINUE. "跳过当前凭证的处理 ENDIF.*--------add by TCD on 20260120-----------end "抬头 ls_documentheader-username = sy-uname. "创建人 ls_documentheader-header_txt = ls_head-bktxt. "凭证抬头文本 ls_documentheader-comp_code = ls_head-bukrs. "公司代码 ls_documentheader-doc_date = ls_head-bldat. "凭证中的凭证日期 ls_documentheader-pstng_date = ls_head-budat. "凭证中的过账日期 ls_documentheader-fisc_year = ls_head-gjahr. "会计年度 ls_documentheader-fis_period = ls_head-monat. "会计期间 ls_documentheader-doc_type = 'SA'. "凭证类型 ls_documentheader-ref_doc_no = ls_head-xblnr. "参考凭证编号* ls_documentheader-ac_doc_no = ls_head-belnr. "会计凭证号码 "清空内表 REFRESH: lt_accountgl, lt_currencyamount, lt_accountreceivable, lt_accountpayable, lt_tax, lt_extension2.*--Changeby TCD 2026-02-28--start------------------------------------------------ "用于记录下一个可用的行项目号,确保行号连续 DATA: lv_next_itemno TYPE posnr_acc. lv_next_itemno = 1.*--Changeby TCD 2026-02-28--end------------------------------------------------ LOOP AT t_item INTO DATA(ls_item) WHERE bktxt = ls_head-bktxt.***********changedby Jack 20241212******【D7149】******************** IF LS_ITEM-BSCHL = '40'. IF ls_item-bschl = '40' OR ls_item-bschl = '50'.***********changedby Jack 20241212******【D7149】************* IF ls_item-kostl IS NOT INITIAL. ls_log-kostl = ls_item-kostl. "成本中心 ENDIF.*--Changeby TCD 2026-02-28--start------------------------------------------------ "判断是否是需要特殊处理的费用科目 DATA: lv_is_special TYPE abap_bool. DATA: lv_payable_account TYPE saknr. CLEAR: lv_is_special, lv_payable_account. CASE ls_item-ktonr. WHEN lc_special_expense-welfare. lv_is_special = abap_true. lv_payable_account = lc_payable-welfare. WHEN lc_special_expense-education. lv_is_special = abap_true. lv_payable_account = lc_payable-education. ENDCASE. IF lv_is_special = abap_true. "========================================== "特殊处理:费用科目(福利费/职工教育经费) "生成三行凭证: "行1:借:费用科目(原借贷方向不变) "行2:贷:应付职工薪酬-费用科目(计提) "行3:借:应付职工薪酬-费用科目(支付) "========================================== "保存原始信息 DATA(lv_original_amount) = ls_item-wrbtr. DATA(lv_original_bschl) = ls_item-bschl. DATA(lv_item_text) = ls_item-sgtxt. DATA(lv_original_buzei) = ls_item-buzei.*--Changeby TCD 2026-02-28--end------------------------------------------------*--Changeby TCD 2026-02-28--start------------------------------------------------ "---------------------------------------- "行1:费用科目(原借方/贷方不变) "---------------------------------------- ls_accountgl-itemno_acc = |{ lv_next_itemno ALPHA = IN }|. ls_accountgl-gl_account = ls_item-ktonr. ls_accountgl-item_text = lv_item_text. ls_accountgl-comp_code = ls_head-bukrs. ls_accountgl-costcenter = ls_item-kostl. ls_accountgl-fis_period = ls_head-monat. ls_accountgl-fisc_year = |{ ls_head-gjahr ALPHA = IN }|. ls_accountgl-pstng_date = ls_head-budat.************ADD BY TCD 29.02.2024 14:46:46 START********* IF ls_head-check = 0. ls_accountgl-orderid = |{ ls_item-aufnr ALPHA = IN }|. "订单编号 ELSEIF ls_head-check = 1. ls_zexten-posnr = |{ lv_next_itemno ALPHA = IN }|. ls_zexten-zzhsxmid = |{ ls_item-aufnr ALPHA = IN }|. "扩展字段****CHANGE BY TCD [87463]20250314 START---*OLD* LS_ZEXTEN-BSCHL =