FI会计凭证导入-TAX参数报错 Tax insertion for 'xxxx'> impossible due to tax base 0
error bapi BAPI_ACC_DOCUMENT_POST 848 FF
参考网址:error bapi BAPI_ACC_DOCUMENT_POST 848 FF | SAP Community
参考步骤
实际代码
FORM frm_create_exp TABLES it_exp_item TYPE zttif_hly_exp_log CHANGING lt_return TYPE zbapiret2_t iv_no_commit TYPE flag. DATA:ls_documentheader TYPE bapiache09, lt_accountreceivable TYPE TABLE OF bapiacar09, lt_accountpayable TYPE TABLE OF bapiacap09, lt_accountgl TYPE TABLE OF bapiacgl09, lt_currencyamount TYPE TABLE OF bapiaccr09, lt_accounttax TYPE TABLE OF bapiactx09, lt_criteria TYPE TABLE OF bapiackec9. DATA:ls_extension2 TYPE zsfiexten2, ls_extension_accit TYPE accit, ls_extension_acccr TYPE acccr, lt_extension TYPE STANDARD TABLE OF bapiparex, ls_extension TYPE bapiparex. * DATA:lt_return TYPE TABLE OF bapiret2. DATA:lt_mwdat TYPE TABLE OF rtax1u15. DATA:ls_color TYPE slis_specialcol_alv. DATA:lv_itemno TYPE posnr_acc. DATA lv_objkey TYPE bapiache09-obj_key. DATA:lv_msg TYPE bapi_msg. DATA:lv_hkont TYPE hkont. DATA:lv_buzei TYPE POSNR_ACC. DATA:LINES TYPE POSNR_ACC. DATA:lv_suminfo TYPE anln1. DATA: gr_uuid_error TYPE REF TO cx_uuid_error, gv_error TYPE string. DATA:BEGIN OF gt_criteria_value OCCURS 0, zuuid TYPE uuid, zfield TYPE char50, zvalue TYPE char50, END OF gt_criteria_value. . REFRESH gt_criteria_value. LOOP AT it_exp_item INTO DATA(ls_data). TRY. ls_data-zuuid = cl_system_uuid=>create_uuid_c22_static( ). CATCH cx_uuid_error INTO gr_uuid_error. gv_error = gr_uuid_error->get_text( ). ENDTRY. *No.30~34根据录入数据派生出所有特征值 "销售订单号 IF ls_data-vbeln IS NOT INITIAL. gt_criteria_value-zfield = 'KAUFN'. gt_criteria_value-zvalue = ls_data-vbeln. gt_criteria_value-zvalue = ls_data-zuuid. APPEND gt_criteria_value. ENDIF. "销售订单行项目号 IF ls_data-vbeln IS NOT INITIAL. gt_criteria_value-zfield = 'KDPOS'. gt_criteria_value-zvalue = ls_data-posnr. gt_criteria_value-zvalue = ls_data-zuuid. APPEND gt_criteria_value. ENDIF. "客户号 IF ls_data-vbeln IS NOT INITIAL. gt_criteria_value-zfield = 'KNDNR'. gt_criteria_value-zvalue = ls_data-kunnr. gt_criteria_value-zvalue = ls_data-zuuid. APPEND gt_criteria_value. ENDIF. "产品号 IF ls_data-vbeln IS NOT INITIAL. gt_criteria_value-zfield = 'ARTNR'. gt_criteria_value-zvalue = ls_data-artnr. gt_criteria_value-zvalue = ls_data-zuuid. APPEND gt_criteria_value. ENDIF. "分销渠道 IF ls_data-vbeln IS NOT INITIAL. gt_criteria_value-zfield = 'VTWEG'. gt_criteria_value-zvalue = ls_data-vtweg. gt_criteria_value-zvalue = ls_data-zuuid. APPEND gt_criteria_value. ENDIF. MODIFY it_exp_item FROM ls_data. ENDLOOP. SELECT * INTO TABLE @DATA(lt_tbsl) FROM tbsl. SELECT * FROM t074 WHERE ktopl EQ @gv_ktopl INTO TABLE @DATA(lt_t074). lines = lines( it_exp_item ). CLEAR lv_buzei. LOOP AT it_exp_item ASSIGNING FIELD-SYMBOL(). IF -buzei IS NOT INITIAL. lv_buzei = -buzei. ELSE. lv_buzei = lv_buzei + 1. -buzei = lv_buzei. ENDIF. READ TABLE lt_tbsl INTO DATA(ls_tbsl) WITH KEY bschl = -bschl. IF ls_tbsl-koart = 'S' OR "总账科目 ls_tbsl-koart = 'A' OR ls_tbsl-koart = 'M'. IF ls_tbsl-koart = 'S' OR ls_tbsl-koart = 'M'. IF -hkont IS INITIAL. -hkont = -suminfo. ENDIF. lv_suminfo = ''. ELSE. lv_suminfo = -suminfo. ENDIF. lt_accountgl = VALUE #( BASE lt_accountgl ( itemno_acc = lv_buzei item_text = -sgtxt "项目文本 acct_type = ls_tbsl-koart gl_account = |{ -hkont ALPHA = IN }| "总账科目 asset_no = lv_suminfo "客户/供应商/总账科目/固定资产编号 sub_number = '0000' costcenter = |{ -kostl ALPHA = IN }| "成本中心 alloc_nmbr = -zuonr "分配 ref_key_1 = -xref1 "参考代码1 ref_key_2 = -xref2 "参考代码2 profit_ctr = -prctr "利润中心 housebankid = -hbkid "开户行 tax_code = -mwskz "税码 * cs_trans_t = -umsks ) ). ELSEIF ls_tbsl-koart = 'D'."客户应收 READ TABLE lt_t074 INTO DATA(ls_t074) WITH KEY koart = ls_tbsl-koart umskz = -umskz. IF sy-subrc EQ 0. lt_accountreceivable = VALUE #( BASE lt_accountreceivable ( itemno_acc = lv_buzei item_text = -sgtxt customer = |{ -suminfo ALPHA = IN }| gl_account = |{ ls_t074-skont ALPHA = IN }| sp_gl_ind = -umskz alloc_nmbr = -zuonr ref_key_1 = -xref1 ref_key_2 = -xref2 profit_ctr = -prctr bank_id = -hbkid tax_code = -mwskz ) ). ELSE. lt_accountreceivable = VALUE #( BASE lt_accountreceivable ( itemno_acc = lv_buzei item_text = -sgtxt customer = |{ -suminfo ALPHA = IN }| gl_account = |{ -hkont ALPHA = IN }| sp_gl_ind = -umskz alloc_nmbr = -zuonr ref_key_1 = -xref1 ref_key_2 = -xref2 profit_ctr = -prctr bank_id = -hbkid tax_code = -mwskz ) ). ENDIF. ELSEIF ls_tbsl-koart = 'K'."供应商应付 READ TABLE lt_t074 INTO ls_t074 WITH KEY koart = ls_tbsl-koart umskz = -umskz. IF sy-subrc EQ 0. lt_accountpayable = VALUE #( BASE lt_accountpayable ( itemno_acc = lv_buzei item_text = -sgtxt vendor_no = |{ -suminfo ALPHA = IN }| gl_account = |{ ls_t074-skont ALPHA = IN }| sp_gl_ind = -umskz alloc_nmbr = -zuonr ref_key_1 = -xref1 ref_key_2 = -xref2 profit_ctr = -prctr bank_id = -hbkid pmnttrms = -zterm "收付条件 tax_code = -mwskz ) ). ELSE. lt_accountpayable = VALUE #( BASE lt_accountpayable ( itemno_acc = lv_buzei item_text = -sgtxt vendor_no = |{ -suminfo ALPHA = IN }| gl_account = |{ -hkont ALPHA = IN }| sp_gl_ind = -umskz alloc_nmbr = -zuonr ref_key_1 = -xref1 ref_key_2 = -xref2 profit_ctr = -prctr bank_id = -hbkid pmnttrms = -zterm tax_code = -mwskz ) ). ENDIF. ENDIF. "criteria LOOP AT gt_criteria_value WHERE zuuid = -zuuid. lt_criteria = VALUE #( BASE lt_criteria ( itemno_acc = lv_buzei fieldname = gt_criteria_value-zfield character = gt_criteria_value-zvalue ) ). ENDLOOP. "CURRENCYAMOUNT lt_currencyamount = VALUE #( BASE lt_currencyamount ( itemno_acc = lv_buzei currency = -waers amt_doccur = COND string( WHEN ls_tbsl-shkzg = 'H' THEN -1 * -wrbtr "凭证货币金额 ELSE -wrbtr ) curr_type = '00' exch_rate = -kursf ) ). IF -waers NE gv_waers. IF -dmbtr IS INITIAL. -dmbtr = -wrbtr * -kursf. ENDIF. lt_currencyamount = VALUE #( BASE lt_currencyamount ( itemno_acc = lv_buzei currency = gv_waers amt_doccur = COND string( WHEN ls_tbsl-shkzg = 'H' THEN -1 * -dmbtr "按本位币计的金额 ELSE -dmbtr ) curr_type = '10' exch_rate = -kursf ) ). ENDIF. IF NOT -mwskz IS INITIAL. CALL FUNCTION 'CALCULATE_TAX_FROM_GROSSAMOUNT' EXPORTING i_bukrs = -bukrs i_mwskz = -mwskz i_waers = -waers i_wrbtr = -wrbtr TABLES t_mwdat = lt_mwdat. LOOP AT lt_mwdat INTO DATA(ls_mwdat). lines = lines + 1. "CURRENCYAMOUNT lt_currencyamount = VALUE #( BASE lt_currencyamount ( itemno_acc = lines currency = gv_waers" -waers * amt_doccur = COND string( * WHEN ls_tbsl-shkzg = 'H' * THEN -1 * ls_mwdat-wmwst * ELSE ls_mwdat-wmwst ) amt_base = ls_mwdat-kawrt curr_type = '00' exch_rate = -kursf ) ). "ACCOUNTTAX lt_accounttax = VALUE #( BASE lt_accounttax ( itemno_acc = lines tax_code = -mwskz acct_key = ls_mwdat-ktosl cond_key = ls_mwdat-kschl taxjurcode = ls_mwdat-txjcd taxjurcode_deep = ls_mwdat-txjcd_deep taxjurcode_level = ls_mwdat-txjlv ) ). ENDLOOP. ELSE. * IF -waers = gv_waers. * IF -dmbtr IS INITIAL. * -dmbtr = -wrbtr. * ENDIF. * lt_currencyamount = VALUE #( BASE lt_currencyamount ( * itemno_acc = lv_buzei * currency = gv_waers * amt_doccur = COND string( * WHEN ls_tbsl-shkzg = 'H' * THEN -1 * -dmbtr "按本位币计的金额 * ELSE -dmbtr ) * curr_type = '10' * exch_rate = -kursf * ) ). * ENDIF. ENDIF. SORT lt_currencyamount BY itemno_acc. CLEAR ls_extension2. ls_extension2 = VALUE #( posnr = lv_buzei bschl = -bschl "记帐代码 rstgr = -rstgr "原因代码 * anbwa = -umsks umskz = -umskz "特别总账标识 zlsch = -zlsch "付款方式 zlspr = -zlspr "冻结付款 xnegp = -xnegp "标识: 反记帐 * bupla = lv_bupla ). lt_extension = VALUE #( BASE lt_extension ( structure = 'ZSFIEXTEN2' valuepart2 = ls_extension2 ) ). IF NOT -mwskz IS INITIAL. lt_extension = VALUE #( BASE lt_extension ( structure = 'ACCIT' valuepart1 = lv_buzei"LINES valuepart2 = 'TAXIT' valuepart3 = 'X' ) ). lt_extension = VALUE #( BASE lt_extension ( structure = 'ACCCR' valuepart1 = lv_buzei"LINES valuepart2 = 'FWBAS' valuepart3 = -wrbtr ) ). ENDIF. CLEAR:ls_t074. ls_documentheader = VALUE #( obj_type = 'BKPFF' obj_key = '$' bus_act = 'RFBU' doc_type = -blart "凭证类型 comp_code = -bukrs "公司代码 doc_date = -bldat "凭证日期 pstng_date = -budat "记账日期 fis_period = -monat "期间 ref_doc_no = -xblnr "参考文本 header_txt = -bktxt "凭证抬头文本 username = sy-uname ). ENDLOOP. IF iv_no_commit = abap_true. CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK' EXPORTING documentheader = ls_documentheader TABLES accountgl = lt_accountgl accountreceivable = lt_accountreceivable accountpayable = lt_accountpayable currencyamount = lt_currencyamount criteria = lt_criteria accounttax = lt_accounttax return = lt_return extension2 = lt_extension. ELSE. CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST' EXPORTING documentheader = ls_documentheader IMPORTING obj_key = lv_objkey TABLES accountgl = lt_accountgl accountreceivable = lt_accountreceivable accountpayable = lt_accountpayable currencyamount = lt_currencyamount criteria = lt_criteria accounttax = lt_accounttax return = lt_return extension2 = lt_extension. READ TABLE lt_return ASSIGNING FIELD-SYMBOL( ) WITH KEY type = 'S'. IF sy-subrc EQ 0. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. -message_v1 = lv_objkey. ELSE. READ TABLE lt_return ASSIGNING WITH KEY type = 'E'. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. ENDIF. LOOP AT it_exp_item ASSIGNING FIELD-SYMBOL( ). -belnr = lv_objkey. -ztype = -type. LOOP AT lt_return ASSIGNING . -message = -message && -message. ENDLOOP. ENDLOOP. ENDIF. CLEAR:ls_tbsl, lv_objkey, lv_msg, ls_color, ls_extension2, ls_extension, ls_documentheader. FREE:lt_accountgl, lt_accountreceivable, lt_accountpayable, lt_currencyamount, lt_accounttax, lt_extension, lt_mwdat. ENDFORM.
实际增强代码
METHOD if_ex_acc_document~change. DATA: wa_extension TYPE bapiparex, ext_value(960) TYPE c, wa_accit TYPE accit, wa_acccr TYPE acccr, l_ref TYPE REF TO data. FIELD-SYMBOLS:TYPE any, TYPE any. SORT c_extension2 BY structure. LOOP AT c_extension2 INTO wa_extension. AT NEW structure. CREATE DATA l_ref TYPE (wa_extension-structure). ASSIGN l_ref->* TO . ENDAT. IF wa_extension-structure = 'ZSFIEXTEN2'. CONCATENATE wa_extension-valuepart1 wa_extension-valuepart2 wa_extension-valuepart3 wa_extension-valuepart4 INTO ext_value. MOVE ext_value TO . ASSIGN COMPONENT 'POSNR' OF STRUCTURE TO . READ TABLE c_accit WITH KEY posnr = INTO wa_accit. IF sy-subrc IS INITIAL. MOVE-CORRESPONDING TO wa_accit. MODIFY c_accit FROM wa_accit INDEX sy-tabix. ENDIF. ELSEIF wa_extension-structure = 'ACCCR'. READ TABLE c_acccr WITH KEY posnr = wa_extension-valuepart1 INTO wa_acccr. IF sy-subrc IS INITIAL. wa_acccr-fwbas = wa_extension-valuepart3. MODIFY c_acccr FROM wa_acccr INDEX sy-tabix. ENDIF. ELSEIF wa_extension-structure = 'ACCIT'. READ TABLE c_accit WITH KEY posnr = wa_extension-valuepart1 INTO wa_accit. IF sy-subrc IS INITIAL. wa_accit-taxit = wa_extension-valuepart3. MODIFY c_accit FROM wa_accit INDEX sy-tabix. ENDIF. ENDIF. ENDLOOP. ENDMETHOD.
解决报错