BAPI_PO_CREATE1
注意行项目号的赋值,注意选择正确的字段
BAPI_PO_CREATE1是针对事务码ME21N的一个FUNCTION,传入参数主要分为抬头和行项目。
根据填入信息从BAPI_PO_CREATE1的导入和表中找到对应字段。
POHEADER拥有的字段如下
行项目字段在“表”中查找
选取 __ 字段后需要将 ___X 中同样字段打上‘X’。
然后调用BAPI_PO_CREATE1即可完成BAPI插入,具体代码实现如下。
FORM FRM_BAPI_CREATE .
DATA: LS_POHEADER TYPE BAPIMEPOHEADER,
LS_POHEADERX TYPE BAPIMEPOHEADERX,
LS_RETURN TYPE BAPIRET2,
LT_RETURN TYPE TABLE OF BAPIRET2,
LS_POITEM TYPE BAPIMEPOITEM,
LT_POITEM TYPE TABLE OF BAPIMEPOITEM,
LS_POITEMX TYPE BAPIMEPOITEMX,
LT_POITEMX TYPE TABLE OF BAPIMEPOITEMX,
LS_SCHEDULE TYPE BAPIMEPOSCHEDULE,
LT_SCHEDULE TYPE TABLE OF BAPIMEPOSCHEDULE,
LS_SCHEDULEX TYPE BAPIMEPOSCHEDULX,
LT_SCHEDULEX TYPE TABLE OF BAPIMEPOSCHEDULX,
LS_POCOND TYPE BAPIMEPOCOND,
LT_POCOND TYPE TABLE OF BAPIMEPOCOND,
LS_POCONDX TYPE BAPIMEPOCONDX,
LT_POCONDX TYPE TABLE OF BAPIMEPOCONDX,
LS_CONTRACT TYPE BAPIESUCC,
LT_CONTRACT TYPE TABLE OF BAPIESUCC,
LV_POSNR TYPE CHAR5. "行项目号
REFRESH: LT_RETURN,LT_POITEM,LT_POITEMX,LT_SCHEDULE,LT_SCHEDULEX,LT_POCOND.
LOOP AT GT_DATA INTO GS_DATA.
CLEAR: LS_POHEADER,LS_POHEADERX,LS_POITEM,LS_POITEMX,LS_SCHEDULE,LS_SCHEDULEX,LS_POCOND,LS_RETURN.
LV_POSNR = SY-TABIX * 10. "行项目不能重复号
CONDENSE LV_POSNR NO-GAPS. "去空格
LS_POHEADER-COMP_CODE = GS_DATA-BUKRS. "公司代码
LS_POHEADER-DOC_TYPE = 'NB'. "单据类别 20220530
LS_POHEADER-PUR_GROUP = GS_DATA-EKGRP. "采购组
LS_POHEADER-PURCH_ORG = GS_DATA-EKORG. "采购组织
LS_POHEADER-VENDOR = GS_DATA-LLIEF. "供应商
LS_POHEADER-DOC_DATE = GS_DATA-BEDAT. "凭证日期
LS_POHEADER-LANGU = SY-LANGU.
LS_POHEADERX-DOC_TYPE = 'X'.
LS_POHEADERX-COMP_CODE = 'X'.
LS_POHEADERX-PUR_GROUP = 'X'.
LS_POHEADERX-PURCH_ORG = 'X'.
LS_POHEADERX-DOC_DATE = 'X'.
LS_POHEADERX-VENDOR = 'X'.
LS_POHEADER-LANGU = 'X'.
LS_POITEM-PO_ITEM = LV_POSNR.
LS_POITEM-EMATERIAL = GS_DATA-MATNR. "物料
LS_POITEM-QUANTITY = GS_DATA-MENGE. "订单数量
LS_POITEM-PO_UNIT = GS_DATA-MEINS. "单位
LS_POITEM-PLANT = GS_DATA-WERKS. "工厂
LS_POITEM-NET_PRICE = GS_DATA-NETPR. "单价
LS_POITEMX-PO_ITEM = LV_POSNR.
LS_POITEMX-EMATERIAL = 'X'.
LS_POITEMX-QUANTITY = 'X'.
LS_POITEMX-PO_UNIT = 'X'.
LS_POITEMX-PLANT = 'X'.
LS_POITEMX-NET_PRICE = 'X'.
APPEND LS_POITEM TO LT_POITEM.
APPEND LS_POITEMX TO LT_POITEMX.
LS_SCHEDULE-PO_ITEM = LV_POSNR.
LS_SCHEDULE-DELIVERY_DATE = GS_DATA-FNDAT. "交货日期
LS_SCHEDULEX-PO_ITEM = LV_POSNR.
LS_SCHEDULEX-DELIVERY_DATE = 'X'.
APPEND LS_SCHEDULE TO LT_SCHEDULE.
APPEND LS_SCHEDULEX TO LT_SCHEDULEX.
* LS_CONTRACT-CON_NUMBER = GS_DATA-ZZCONID.
* APPEND LS_CONTRACT TO LT_CONTRACT.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
POHEADER = LS_POHEADER
POHEADERX = LS_POHEADERX
TABLES
RETURN = LT_RETURN
POITEM = LT_POITEM
POITEMX = LT_POITEMX
POSCHEDULE = LT_SCHEDULE
POSCHEDULEX = LT_SCHEDULEX.
LOOP AT LT_RETURN INTO LS_RETURN WHERE TYPE = 'E' OR TYPE = 'A' .
ENDLOOP.
IF SY-SUBRC = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. "事务回滚
MESSAGE 'ERROR' TYPE 'S'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' "事务提交
EXPORTING
WAIT = 'X'.
.
MESSAGE 'SUCCESS' TYPE 'S'.
ENDIF.
ENDLOOP.
ENDFORM.
在上面程序中对BAPI返回信息进行检查,如果返回信息中有ERROR或者ALERT的话就事务回滚,如果没有的话就事务提交。
LS_POITEM TO LT_POITEM.
APPEND LS_POITEMX TO LT_POITEMX.
LS_SCHEDULE-PO_ITEM = LV_POSNR.
LS_SCHEDULE-DELIVERY_DATE = GS_DATA-FNDAT. "交货日期
LS_SCHEDULEX-PO_ITEM = LV_POSNR.
LS_SCHEDULEX-DELIVERY_DATE = 'X'.
APPEND LS_SCHEDULE TO LT_SCHEDULE.
APPEND LS_SCHEDULEX TO LT_SCHEDULEX.
* LS_CONTRACT-CON_NUMBER = GS_DATA-ZZCONID.
* APPEND LS_CONTRACT TO LT_CONTRACT.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
POHEADER = LS_POHEADER
POHEADERX = LS_POHEADERX
TABLES
RETURN = LT_RETURN
POITEM = LT_POITEM
POITEMX = LT_POITEMX
POSCHEDULE = LT_SCHEDULE
POSCHEDULEX = LT_SCHEDULEX.
LOOP AT LT_RETURN INTO LS_RETURN WHERE TYPE = 'E' OR TYPE = 'A' .
ENDLOOP.
IF SY-SUBRC = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. "事务回滚
MESSAGE 'ERROR' TYPE 'S'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' "事务提交
EXPORTING
WAIT = 'X'.
.
MESSAGE 'SUCCESS' TYPE 'S'.
ENDIF.
ENDLOOP.
ENDFORM.
在上面程序中对BAPI返回信息进行检查,如果返回信息中有ERROR或者ALERT的话就事务回滚,如果没有的话就事务提交。