【ABAP】MM采购发票校验开发Demo
SAP采购发票校验BAPI主要用于校验采购发票是否符合系统的要求,包括检查公司代码、供应商、物料等信息是否正确,同时还会执行相关的账务检查。
以下是校验采购发票的BAPI函数模块:
- BAPI_INCOMINGINVOICE_PARK: 用于创建或修改待入库的采购发票;
- BAPI_INCOMINGINVOICE_POST: 用于将待入库的采购发票进行入库操作,并返回相关的采购订单信息和凭证号等;
在调用这两个函数之前,需要确保采购发票的相关信息已经在系统中进行维护,包括公司代码、供应商、物料、采购订单等。
调用BAPI_INCOMINGINVOICE_PARK函数之前,需要准备好以下输入参数:
- HEADER: 发票头信息,包括供应商、发票日期、发票类型等
- ITEM: 发票行项目信息,包括物料、数量、单价等
- ACCOUNTING: 发票的会计凭证信息等
调用BAPI_INCOMINGINVOICE_POST函数之前,需要准备好以下输入参数:
- INVOICEDOCUMENT: 待入库的采购发票号
- FLAG: 入库标志
- ACCOUNTING: 会计信息
函数调用成功后,可以通过返回值来获得相关的采购订单信息和凭证号等。
需要注意的是,SAP采购发票校验BAPI需要合理设置事务代码、处理模式、处理顺序等参数,以确保采购发票能够正确地入库和结算。
——以上内容来自无情的Chat GPT
好了下面直接甩出BAPI“BAPI_INCOMINGINVOICE_CREATE1”的开发Demo。
1、定义Bapi的输入/输出参数
DATA: LS_HEAD LIKE BAPI_INCINV_CREATE_HEADER,
LT_ITEM TYPE STANDARD TABLE OF BAPI_INCINV_CREATE_ITEM,
LS_ITEM LIKE LINE OF LT_ITEM,
LT_MAT TYPE STANDARD TABLE OF BAPI_INCINV_CREATE_MATERIAL,
LS_MAT LIKE LINE OF LT_MAT,
LT_RETURN TYPE STANDARD TABLE OF BAPIRET2,
LS_RETURN LIKE LINE OF LT_RETURN,
LT_TAX TYPE STANDARD TABLE OF BAPI_INCINV_CREATE_TAX,
LS_TAX LIKE LINE OF LT_TAX.
2、抬头内容设置
LV_NO = LV_NO + 1.
TRANSLATE HEADER-RETPO TO UPPER CASE.
IF HEADER-RETPO = 'X'.
LS_HEAD-INVOICE_IND = SPACE.
ELSE.
LS_HEAD-INVOICE_IND = 'X'."标识: 记帐发票
ENDIF.
LS_HEAD-DEL_COSTS_TAXC = HEADER-MWSKZ."交货成本税务代码
LS_HEAD-DOC_DATE = HEADER-BLDAT. "凭证日期
LS_HEAD-PSTNG_DATE = HEADER-BUDAT. "过账日期
LS_HEAD-BLINE_DATE = HEADER-ZFBDT. "基准日期
LS_HEAD-COMP_CODE = HEADER-BUKRS. "公司代码
LS_HEAD-HEADER_TXT = HEADER-BKTXT."抬头文本
LS_HEAD-ITEM_TEXT = HEADER-BKTXT."项目文本
LS_HEAD-DIFF_INV = HEADER-LIFNR. "供应商
LS_HEAD-DELIV_POSTING = 'S'."交货项目的过帐逻辑(发票/贷项清单)
LS_HEAD-RETURN_POSTING = 'H'."退货项目的过帐逻辑(发票/贷项清单)
LS_HEAD-DOC_TYPE = 'RE'. "凭证类型
LS_HEAD-REF_DOC_NO = HEADER-XBLNR."参考凭证号
LS_HEAD-CURRENCY = HEADER-WAERS.
LS_HEAD-GROSS_AMOUNT = HEADER-WRBTR."凭证货币的总发票金额
LS_HEAD-PMNT_BLOCK = 'R'."收付冻结码(发票校验)
3、明细内容设置
- 货物/服务项目
CLEAR: LV_MENGE,LV_IV_QTY,LV_GR_QTY.
SELECT SUM( CASE SHKZG WHEN 'S' THEN ERFMG ELSE -1 * ERFMG END )
INTO @LV_GR_QTY
FROM MSEG
WHERE MBLNR = @WA_ITEM-LFBNR
AND MJAHR = @WA_ITEM-LFGJA
AND ZEILE = @WA_ITEM-LFPOS.
SELECT SUM( CASE SHKZG WHEN 'S' THEN MENGE ELSE -1 * MENGE END )
INTO @LV_IV_QTY
FROM EKBE
WHERE EBELN = @WA_ITEM-EBELN
AND EBELP = @WA_ITEM-EBELP
AND BEWTP IN ('T','Q')
AND LFGJA = @WA_ITEM-LFGJA
AND LFBNR = @WA_ITEM-LFBNR
AND LFPOS = @WA_ITEM-LFPOS.
IF HEADER-RETPO = 'X'.
LV_GR_QTY = ABS( LV_GR_QTY ).
LV_IV_QTY = ABS( LV_IV_QTY ).
ENDIF.
LV_MENGE = LV_GR_QTY - LV_IV_QTY.
IF LV_MENGE <= 0 .
ZRETURN-ERROR = 'E'.
ZRETURN-MSAGE = '订单项目' && WA_ITEM-EBELN && '/' && WA_ITEM-EBELP && '已完成发票校验'.
EXIT.
ELSEIF LV_MENGE < WA_ITEM-MENGE.
ZRETURN-ERROR = 'E'.
ZRETURN-MSAGE = '订单项目' && WA_ITEM-EBELN && '/' && WA_ITEM-EBELP && '可预制数量小于当前数量'.
EXIT.
ENDIF.
CLEAR LS_ITEM.
LV_INDEX = LV_INDEX + 1.
LS_ITEM-SHEET_NO = LV_NO."条目表编号
LS_ITEM-SHEET_ITEM = LV_INDEX."行号
LS_ITEM-INVOICE_DOC_ITEM = LV_INDEX."发票凭证中的凭证项目
LS_ITEM-PO_NUMBER = WA_ITEM-EBELN. "采购凭证
LS_ITEM-PO_ITEM = WA_ITEM-EBELP. "采购行项目
LS_ITEM-REF_DOC = WA_ITEM-LFBNR. "参考物料凭证
LS_ITEM-REF_DOC_YEAR = WA_ITEM-LFGJA. "参考年份
LS_ITEM-REF_DOC_IT = WA_ITEM-LFPOS. "参考凭证行
LS_ITEM-TAX_CODE = HEADER-MWSKZ. "税码
LS_ITEM-QUANTITY = WA_ITEM-MENGE. "数量
LS_ITEM-PO_UNIT = WA_ITEM-MEINS. "单位
LS_ITEM-ITEM_TEXT = WA_ITEM-SGTXT."项目文本
LS_ITEM-ITEM_AMOUNT = WA_ITEM-WRBTR. "凭证货币金额
APPEND LS_ITEM TO LT_ITEM.
-计划交货项目
CLEAR LS_ITEM.
LV_INDEX = LV_INDEX + 1.
LS_ITEM-INVOICE_DOC_ITEM = LV_INDEX. "发票凭证中的凭证项目
LS_ITEM-PO_NUMBER = WA_ITEM-EBELN. "采购凭证
LS_ITEM-PO_ITEM = WA_ITEM-EBELP. "采购行项目
LS_ITEM-TAX_CODE = HEADER-MWSKZ. "税码
LS_ITEM-QUANTITY = WA_ITEM-MENGE. "数量
LS_ITEM-PO_UNIT = WA_ITEM-MEINS. "单位
LS_ITEM-ITEM_TEXT = WA_ITEM-SGTXT. "项目文本
LS_ITEM-ITEM_AMOUNT = WA_ITEM-WRBTR. "凭证货币金额
LS_ITEM-COND_TYPE = WA_ITEM-KSCHL. "条件类型
* LS_ITEM-DE_CRE_IND = ''. "标识: 后续借/贷
APPEND LS_ITEM TO LT_ITEM.
-无PO的物料发票校验
CLEAR LS_MAT.
LV_INDEX = LV_INDEX + 1.
LS_MAT-INVOICE_DOC_ITEM = LV_INDEX.
IF HEADER-RETPO = 'X'.
LS_MAT-DB_CR_IND = 'H'.
ELSE.
LS_MAT-DB_CR_IND = 'S'.
ENDIF.
_MINPUT WA_ITEM-MATNR.
LS_MAT-MATERIAL = WA_ITEM-MATNR. "新增字段:物料编号
LS_MAT-VAL_AREA = WA_ITEM-WERKS. "新增字段:评估范围
LS_MAT-ITEM_AMOUNT = WA_ITEM-WRBTR. "凭证货币金额
LS_MAT-TAX_CODE = HEADER-MWSKZ. "税码
LS_MAT-QUANTITY = WA_ITEM-MENGE. "数量
LS_MAT-BASE_UOM = WA_ITEM-MEINS. "单位
APPEND LS_MAT TO LT_MAT.
4、税务内容设置
LS_TAX-TAX_AMOUNT = HEADER-WMWST.
LS_TAX-TAX_CODE = HEADER-MWSKZ.
APPEND LS_TAX TO LT_TAX.
5、调用BAPI
CALL FUNCTION 'BAPI_INCOMINGINVOICE_CREATE1'
EXPORTING
HEADERDATA = LS_HEAD
INVOICESTATUS = 'A'
IMPORTING
INVOICEDOCNUMBER = LV_NUMBER
FISCALYEAR = LV_YEAR
TABLES
ITEMDATA = LT_ITEM
MATERIALDATA = LT_MAT
TAXDATA = LT_TAX
RETURN = LT_RETURN.
LOOP AT LT_RETURN INTO LS_RETURN WHERE TYPE CA 'EAX'.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
MSGID = LS_RETURN-ID
MSGNR = LS_RETURN-NUMBER
MSGV1 = LS_RETURN-MESSAGE_V1
MSGV2 = LS_RETURN-MESSAGE_V2
MSGV3 = LS_RETURN-MESSAGE_V3
MSGV4 = LS_RETURN-MESSAGE_V4
IMPORTING
MESSAGE_TEXT_OUTPUT = ZRETURN-MSAGE.
ZRETURN-ERROR = 'E'.
ENDLOOP.
IF ZRETURN-ERROR IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
ZRETURN-BELNR = LV_NUMBER.
ZRETURN-GJAHR = LV_YEAR.
ZRETURN-ERROR = 'S'.
ZRETURN-MSAGE = 'IV预制成功!'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
CLEAR: LS_HEAD. REFRESH : LT_ITEM,LT_RETURN,LT_TAX,LT_MAT.
后续Chat GPT普及之后,感觉只要是会提问题,就能解决大部分难题。所以,在Chat GPT年代,一个人能不能提出好问题是关键!从现在开始,我们就要刻意训练自己的提问能力。
简单来说,要想获得好的回复,需要几个基础的元素:任务简述 + 任务描述 + 角色场景。
完犊子了,以后SAP屌丝顾问要下岗了。