发票校验的四种类型
1.基于采购订单的发票校验:填写采购订单(根据配置决定是否需要采购订单收货)
2.基于收货的发票校验:填写采购订单和收货物料凭证的参考凭证。需要采购订单勾选,基于收货的发票校验(勾选了之后也只能基于收货做发票了)
3.没有订单的发票校验:不填写采购订单,直接计入总账或资产科目
错误:
如果没有填写lt_bapi_item-po_unit,会产生 没有指定 ISO-CodeSPACE 的测量单位 的错误
如果收货做了贷项或者退货做的正向的会报错:迄今为止冲销数量大于贷出数量
如果发票校验数量大于参考凭证可做数量,会报错“冲销数量大于目前以开票数量”,比如做折扣时如果折扣金额大于总金额,
金额为负做贷项凭证时,就会报这个错误(采购订单项目非退货)(所以这个方案行不通)。
M8147 - Account Determination for entry not possible:这个是金额差异太大,gross_amount不等于行项目金额+税额
发票校验的差异
如果发票校验行项目金额和采购订单行项目金额不一致,根据配置有两种记差异的方法。
1.发票校验时行项目和抬头填入实际金额,根据配置,生成会计凭证的时候自动计一笔物料差异科目,此时差异科目是带物料号的。
2.发票校验时行项目填入采购订单金额,抬头填入实际金额,另外记一笔差异科目,金额 = 抬头金额 - 税额 - 行项目金额。此时会计入库存商品科目,同时会有一笔差异科目(手工记的),此时差异是不带物料号的。
问题
M8 088 发出数量为0的错误,
如果是基于收货的发票校验,传入的参考凭证被冲销了,即使采购订单确实收货了,也会报这个错误
可以通过OMRM配置,注意标准是W表示MIRO不会报错,所以
No measurement unit is assigned to ISO code &
原因:订单计量单位和订单价格单位不一致,需要填写PO_PR_UOM_ISO、PO_PR_UOM
4.取发票校验参考数据
ME_READ_HEADER_INVOICE
ME_READ_ITEM_INVOICE
DEMO
form post using ut_out type ty_t_out
changing cv_belnr cv_msg.
data ls_out type ty_out.
*BAPI
data: ls_header like bapi_incinv_create_header,
ls_item type bapi_incinv_create_item,
lt_item type table of bapi_incinv_create_item,
ls_tax type bapi_incinv_create_tax,
lt_tax type table of bapi_incinv_create_tax,
ls_return type bapiret2 ,
lt_return type table of bapiret2 .
data:
* lv_invno like bapi_incinv_fld-inv_doc_no,
lv_fyear like bapi_incinv_fld-fisc_year.
clear:cv_belnr,cv_msg.
*基于采购订单的发票校验
loop at ut_out into ls_out.
ls_item-invoice_doc_item = sy-tabix.
ls_item-po_number = ls_out-ebeln. "ENTER THE PO NUMBER
ls_item-po_item = ls_out-ebelp. "ENTER THE PO ITEM NUMBER
ls_item-tax_code = ls_out-mwskz. "税码
ls_item-item_amount = ls_out-netwr. "不含税金额
ls_item-quantity = ls_out-fkimg. "数量
ls_item-po_unit = ls_out-meins. "单位
ls_item-ITEM_TEXT = p_sh. "税号
append ls_item to lt_item.
ls_header-gross_amount = ls_header-gross_amount + ls_out-hsje.
ls_tax-tax_amount = ls_tax-tax_amount + ls_out-mwsbp. "税额
endloop.
append ls_tax to lt_tax.
ls_header-invoice_ind = 'X'. "记帐发票(正向)
ls_header-pmnttrms = ls_out-zterm. "付款条件
ls_header-doc_date = P_DATUM. "ENTER THE DOCUMENT DATE
ls_header-pstng_date = ls_out-budat. "ENTER THE POSTING DATE
ls_header-ref_doc_no = p_sh.
ls_header-comp_code = p_bukrs.
ls_header-gross_amount = ls_header-gross_amount. "发票总金额(含税)
* ls_header-calc_tax_ind = 'X'. "自动计算税额(不能修改税额了,不需要传入taxdata,但是gross_amount好像还是要算?所以还是取税率计算)
ls_header-currency = 'CNY'.
call function 'BAPI_INCOMINGINVOICE_CREATE'
exporting
headerdata = ls_header
* ADDRESSDATA =
importing
invoicedocnumber = cv_belnr
fiscalyear = lv_fyear
tables
itemdata = lt_item
* ACCOUNTINGDATA =
* GLACCOUNTDATA =
* MATERIALDATA =
taxdata = lt_tax
* WITHTAXDATA =
* VENDORITEMSPLITDATA =
return = lt_return
* EXTENSIONIN =
.
if cv_belnr is not initial.
call function 'BAPI_TRANSACTION_COMMIT'
exporting
wait = 'X'.
* cv_msg = '发票校验成功,发票号:' && cv_belnr.
else.
call function 'BAPI_TRANSACTION_ROLLBACK'.
cv_msg = '发票校验失败' .
loop at lt_return into ls_return where type = 'E' or type = 'A' or type = 'X'.
cv_msg = cv_msg && ',' && ls_return-message.
endloop.
endif.
endform. " POST