问题描述
MIRO 发票签收可用 BAPI_INCOMINGINVOICE_CREATE ,通常情况下中只需要传 itemdata,taxdata 参数。有种特殊业务,必须使用 accountingdata 参数。当按照通常情况调用接口会提示“M8 377 项目 000001 至少完成 ACCOUNTINGDATA 的一行”。
向上追踪堆栈可得知,不传递 accountingdata 参数程序必然报错。
问题分析
要解决问题必须重现问题。
ME23N,采购订单行科目分配界面,找到 twrkz 字段,确实订单ekpo.twrkz字段不为空。
进入MIRO界面,输入采购订单号后,可以发现界面多了一个科目分配,需要在弹出框中填入信息,检查确认。
图3 MIRO截图
采购订单科目分配信息存在EKKN中,主键有(ebeln,ebelp,zekkn)。MIRO界面的数据必须关联EKBE采购订单收货信息,EKBE关联MSEG收货信息。
图4 MIGO收货信息&EKBE收货信息
解决方案
在调用BAPI前,检查采购订单行科目分配类型,部分开票标识。如果满足要求,需要传递accountingdata 参数。
取数逻辑可参考
SELECT
mseg~mblnr,
mseg~mjahr,
mseg~ebeln,
mseg~ebelp,
mseg~dmbtr,
mseg~erfmg,
mseg~kokrs,
mseg~anln1,
mseg~anln2,
mseg~zekkn,
ekkn~prctr,
ekkn~sakto
FROM mseg INNER JOIN ekkn
ON mseg~ebeln = ekkn~ebeln AND mseg~ebelp = ekkn~ebelp
AND mseg~zekkn = ekkn~zekkn
WHERE mseg~mblnr = @gs_line-mblnr
AND mseg~ebeln = @gs_line-ebeln
AND mseg~ebelp = @gs_line-ebelp
AND mseg~bwart = '101'
APPENDING CORRESPONDING FIELDS OF TABLE @lt_a_twrkz
参考代码如下:
IF ls_po_history-knttp = 'A' AND ls_po_history-twrkz is not INITIAL.
CLEAR: lv_quantity ,lv_tr_dmbtr.
LOOP AT lt_a_twrkz INTO ls_a_twrkz WHERE mblnr = gs_line-mblnr
AND mjahr = ls_po_history-gjahr
AND ebeln = ls_po_history-ebeln
AND ebelp = ls_po_history-ebelp.
ls_account-invoice_doc_item = lv_index . " lv_index 行号
ls_account-serial_no = ls_a_twrkz-zekkn .
ls_account-tax_code = gs_line-zreserve_i_f2 . " 税码
ls_account-item_amount = ls_a_twrkz-dmbtr . " 金额
ls_account-quantity = ls_a_twrkz-erfmg . " 数量
ls_account-gl_account = ls_a_twrkz-sakto . " 科目
ls_account-asset_no = ls_a_twrkz-anln1. " 资产号
ls_account-sub_number = ls_a_twrkz-anln2 . " 资产子码
ls_account-profit_ctr = ls_a_twrkz-prctr . " 利润中心
ls_account-co_area = ls_a_twrkz-kokrs . " 控制范围
ls_account-po_unit = ls_po_history-meins. " 单位 默认值
ls_account-po_pr_uom = ls_po_history-bprme . " 单位
APPEND ls_account TO lt_account . CLEAR: ls_account .
lv_quantity = lv_quantity + ls_a_twrkz-erfmg .
lv_tr_dmbtr = lv_tr_dmbtr + ls_a_twrkz-dmbtr .
ENDLOOP.
IF gs_line-menge <> lv_quantity. " 开票数量 <> 收货数量 直接报错
lv_message = '收货数量必须与开票数量一致' .
EXIT.
ENDIF.
IF gs_line-netpr - lv_tr_dmbtr <> 0. " 实际开票金额 <> 收货金额,差异分配到第一个资产中
READ TABLE lt_account ASSIGNING FIELD-SYMBOL(<ls_account>) WITH KEY invoice_doc_item = lv_index .
IF sy-subrc = '0'. " 在第一行分配差异
<ls_account>-item_amount = <ls_account>-item_amount + gs_line-netpr - lv_tr_dmbtr .
ENDIF.
ENDIF.
ENDIF.
接口方案可参考:
<it_row>
<ebeln>4500081527</ebeln>
<ebelp>00010</ebelp>
<menge>2</menge><!-- 开票数量-->
<dmbtr>210</dmbtr><!-- 开票金额-->
<wmwst>38</wmwst><!-- 税额-->
<mwskz>J1</mwskz><!-- 税码-->
<mblnr>5000105912</mblnr><!-- ekbe.belnr-->
<zeile>0001</zeile><!-- ekbe.buzei-->
</it_row>
网友评论