这里是创建采购订单BAPI的学习及研究,没有涉及到增强结构。就是常规的信息
文章目录
创建测试的函数模块
创建函数模块
创建函数组
创建需要的结构
设置传入参数
还有一个导出参数:
运行结果
非常注意
代码解析
定义需要的变量
抬头赋值
"-->>采购订单抬头
LS_POHEADER-COMP_CODE = I_HEAD-BUKRS. "公司代码
LS_POHEADER-VENDOR = I_HEAD-LIFNR. "供应商帐户号
LS_POHEADER-PURCH_ORG = I_HEAD-EKORG. "采购组织
LS_POHEADER-PUR_GROUP = I_HEAD-EKGRP. "采购组
LS_POHEADER-DOC_TYPE = I_HEAD-BSART. "采购凭证类型
LS_POHEADER-DOC_DATE = I_HEAD-AEDAT.
LS_POHEADER-CURRENCY = I_HEAD-WAERS. "货币码
LS_POHEADER-CREATED_BY = SY-UNAME. "创建对象的人员名称
LS_POHEADER-COLLECT_NO = ''.
LS_POHEADER-ITEM_INTVL = ''.
"-->>采购订单抬头数据(更改参数)
LS_POHEADERX-COMP_CODE = 'X'.
LS_POHEADERX-VENDOR = 'X'.
LS_POHEADERX-PURCH_ORG = 'X'.
LS_POHEADERX-PUR_GROUP = 'X'.
LS_POHEADERX-CREATED_BY = 'X'.
LS_POHEADERX-DOC_DATE = 'X'.
LS_POHEADERX-DOC_TYPE = 'X'.
LS_POHEADERX-CURRENCY = 'X'.
LS_POHEADERX-COLLECT_NO = 'X'.
LS_POHEADERX-ITEM_INTVL = 'X'.
行项目
交货计划行
条件
账户分配
IF LS_ITEM-KNTTP = 'K'.
LS_POACCOUNT-PO_ITEM = LS_ITEM-EBELP.
LS_POACCOUNT-SERIAL_NO = 1.
LS_POACCOUNT-COSTCENTER = LS_ITEM-KOSTL.
LS_POACCOUNT-GL_ACCOUNT = LS_ITEM-SAKNR.
APPEND LS_POACCOUNT TO LT_POACCOUNT.
LS_POACCOUNTX-PO_ITEM = LS_ITEM-EBELP.
LS_POACCOUNTX-SERIAL_NO = 1.
LS_POACCOUNTX-COSTCENTER = 'X'.
LS_POACCOUNTX-GL_ACCOUNT = 'X'.
APPEND LS_POACCOUNTX TO LT_POACCOUNTX.
CLEAR: LS_POACCOUNT,LS_POACCOUNTX.
ELSEIF LS_ITEM-KNTTP = 'F'.
LS_POACCOUNT-PO_ITEM = LS_ITEM-EBELP.
LS_POACCOUNT-SERIAL_NO = 1.
LS_POACCOUNT-ORDERID = LS_ITEM-AUFNR.
LS_POACCOUNT-GL_ACCOUNT = LS_ITEM-SAKNR.
APPEND LS_POACCOUNT TO LT_POACCOUNT.
LS_POACCOUNTX-PO_ITEM = LS_ITEM-EBELP.
LS_POACCOUNTX-SERIAL_NO = 1.
LS_POACCOUNTX-ORDERID = 'X'.
LS_POACCOUNTX-GL_ACCOUNT = 'X'.
APPEND LS_POACCOUNTX TO LT_POACCOUNTX.
CLEAR: LS_POACCOUNT,LS_POACCOUNTX.
ELSEIF LS_ITEM-KNTTP = 'M'.
LS_POACCOUNT-PO_ITEM = LS_ITEM-EBELP.
LS_POACCOUNT-SERIAL_NO = 1.
LS_POACCOUNT-SD_DOC = LS_ITEM-VBELN.
LS_POACCOUNT-ITM_NUMBER = LS_ITEM-VBELP.
APPEND LS_POACCOUNT TO LT_POACCOUNT.
LS_POACCOUNTX-PO_ITEM = LS_ITEM-EBELP.
LS_POACCOUNTX-SERIAL_NO = 1.
LS_POACCOUNTX-SD_DOC = 'X'.
LS_POACCOUNTX-ITM_NUMBER = 'X'.
APPEND LS_POACCOUNTX TO LT_POACCOUNTX.
CLEAR: LS_POACCOUNT,LS_POACCOUNTX.
ELSEIF LS_ITEM-KNTTP = 'A'.
LS_POACCOUNT-PO_ITEM = LS_ITEM-EBELP.
LS_POACCOUNT-SERIAL_NO = 1.
LS_POACCOUNT-ORDERID = LS_ITEM-AUFNR.
LS_ITEM-ANLN1 = |{ LS_ITEM-ANLN1 ALPHA = IN }|.
LS_POACCOUNT-ASSET_NO = LS_ITEM-ANLN1.
LS_ITEM-ANLN2 = |{ LS_ITEM-ANLN2 ALPHA = IN }|.
LS_POACCOUNT-SUB_NUMBER = LS_ITEM-ANLN2.
APPEND LS_POACCOUNT TO LT_POACCOUNT.
LS_POACCOUNTX-PO_ITEM = LS_ITEM-EBELP.
LS_POACCOUNTX-SERIAL_NO = 1.
LS_POACCOUNTX-ORDERID = 'X'.
LS_POACCOUNTX-ASSET_NO = 'X'.
LS_POACCOUNTX-SUB_NUMBER = 'X'.
APPEND LS_POACCOUNTX TO LT_POACCOUNTX.
CLEAR: LS_POACCOUNT,LS_POACCOUNTX.
ENDIF.
调用bapi
如果根据返回的消息进行回滚或者提交
完整源代码
FUNCTION ZMM_PO_CREATE1_LHY.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" REFERENCE(I_HEAD) TYPE ZMM_S_PO_CREATE1_HEAD
*" EXPORTING
*" REFERENCE(OV_MSG) TYPE STRING
*" TABLES
*" I_ITEM STRUCTURE ZMM_S_PO_CREATE1_ITEM
*" OT_MSG STRUCTURE BAPIRET2
*"----------------------------------------------------------------------
DATA LS_POHEADER TYPE BAPIMEPOHEADER.
DATA LS_POHEADERX TYPE BAPIMEPOHEADERX.
DATA LT_RETURN TYPE STANDARD TABLE OF BAPIRET2.
DATA LS_POITEM TYPE BAPIMEPOITEM.
DATA LT_POITEM TYPE STANDARD TABLE OF BAPIMEPOITEM.
DATA LS_POITEMX TYPE BAPIMEPOITEMX.
DATA LT_POITEMX TYPE STANDARD TABLE OF BAPIMEPOITEMX.
DATA LS_POSCHEDULE TYPE BAPIMEPOSCHEDULE.
DATA LT_POSCHEDULE TYPE STANDARD TABLE OF BAPIMEPOSCHEDULE.
DATA LS_POSCHEDULEX TYPE BAPIMEPOSCHEDULX.
DATA LT_POSCHEDULEX TYPE STANDARD TABLE OF BAPIMEPOSCHEDULX.
DATA LS_POACCOUNT TYPE BAPIMEPOACCOUNT.
DATA LT_POACCOUNT TYPE STANDARD TABLE OF BAPIMEPOACCOUNT.
DATA LS_POACCOUNTX TYPE BAPIMEPOACCOUNTX.
DATA LT_POACCOUNTX TYPE STANDARD TABLE OF BAPIMEPOACCOUNTX.
DATA LS_POCOND TYPE BAPIMEPOCOND.
DATA LT_POCOND TYPE STANDARD TABLE OF BAPIMEPOCOND.
DATA LS_POCONDX TYPE BAPIMEPOCONDX.
DATA LT_POCONDX TYPE STANDARD TABLE OF BAPIMEPOCONDX.
*DATA EXTENSIONIN TYPE STANDARD TABLE OF BAPIPAREX.
*----------------给传入的结构和表赋值 START ------------------*
"-->>采购订单抬头
LS_POHEADER-COMP_CODE = I_HEAD-BUKRS. "公司代码
LS_POHEADER-VENDOR = I_HEAD-LIFNR. "供应商帐户号
LS_POHEADER-PURCH_ORG = I_HEAD-EKORG. "采购组织
LS_POHEADER-PUR_GROUP = I_HEAD-EKGRP. "采购组
LS_POHEADER-DOC_TYPE = I_HEAD-BSART. "采购凭证类型
LS_POHEADER-DOC_DATE = I_HEAD-AEDAT.
LS_POHEADER-CURRENCY = I_HEAD-WAERS. "货币码
LS_POHEADER-CREATED_BY = SY-UNAME. "创建对象的人员名称
LS_POHEADER-COLLECT_NO = ''.
LS_POHEADER-ITEM_INTVL = ''.
"-->>采购订单抬头数据(更改参数)
LS_POHEADERX-COMP_CODE = 'X'.
LS_POHEADERX-VENDOR = 'X'.
LS_POHEADERX-PURCH_ORG = 'X'.
LS_POHEADERX-PUR_GROUP = 'X'.
LS_POHEADERX-CREATED_BY = 'X'.
LS_POHEADERX-DOC_DATE = 'X'.
LS_POHEADERX-DOC_TYPE = 'X'.
LS_POHEADERX-CURRENCY = 'X'.
LS_POHEADERX-COLLECT_NO = 'X'.
LS_POHEADERX-ITEM_INTVL = 'X'.
*-->>采购订单项目
LOOP AT I_ITEM INTO DATA(LS_ITEM).
LS_POITEM-PO_ITEM = LS_ITEM-EBELP. "行项目是空会报错
LS_POITEM-MATERIAL = LS_ITEM-MATNR. "物料
LS_POITEM-SHORT_TEXT = LS_ITEM-TXZ01. "短文本
LS_POITEM-PLANT = LS_ITEM-WERKS. "工厂
LS_POITEM-STGE_LOC = LS_ITEM-LGORT. "库存地点
LS_POITEM-MATL_GROUP = LS_ITEM-MATKL. "物料组
LS_POITEM-ACCTASSCAT = LS_ITEM-KNTTP. "科目分配类别
LS_POITEM-QUANTITY = LS_ITEM-MENGE. "采购订单数量
LS_POITEM-PO_UNIT = LS_ITEM-MEINS. "采购订单计量单位
LS_POITEM-ITEM_CAT = LS_ITEM-PSTYP. "采购凭证中的项目类别
LS_POITEM-RET_ITEM = LS_ITEM-RETPO. "退货项目
LS_POITEM-FREE_ITEM = LS_ITEM-UMSON. "免费项目
LS_POITEM-TAX_CODE = LS_ITEM-MWSKZ. "销售/购买税代码
LS_POITEM-NET_PRICE = LS_ITEM-KBETR. "BAPIs 的货币金额
LS_POITEM-PRICEDATE = LS_ITEM-MEPRF.
LS_POITEM-PREQ_NAME = LS_ITEM-AFNAM. "价格确定(定价)日期控制
APPEND LS_POITEM TO LT_POITEM.
CLEAR LS_POITEM.
"采购订单项目数据(更改参数)
LS_POITEMX-NET_PRICE = 'X'.
LS_POITEMX-TRACKINGNO = 'X'.
LS_POITEMX-PREQ_NAME = 'X'.
LS_POITEMX-PO_ITEM = LS_ITEM-EBELP. "行项目是空会报错
LS_POITEMX-PO_ITEMX = 'X'.
IF LS_ITEM-WERKS IS NOT INITIAL.
LS_POITEMX-PLANT = 'X'.
ENDIF.
IF LS_ITEM-MATNR IS NOT INITIAL.
LS_POITEMX-MATERIAL = 'X'.
ENDIF.
IF LS_ITEM-TXZ01 IS NOT INITIAL.
LS_POITEMX-SHORT_TEXT = 'X'.
ENDIF.
IF LS_ITEM-LGORT IS NOT INITIAL.
LS_POITEMX-STGE_LOC = 'X'.
ENDIF.
IF LS_ITEM-MATKL IS NOT INITIAL.
LS_POITEMX-MATL_GROUP = 'X'.
ENDIF.
IF LS_ITEM-KNTTP IS NOT INITIAL.
LS_POITEMX-ACCTASSCAT = 'X'.
ENDIF.
IF LS_ITEM-MENGE IS NOT INITIAL.
LS_POITEMX-QUANTITY = 'X'.
ENDIF.
IF LS_ITEM-MEINS IS NOT INITIAL.
LS_POITEMX-PO_UNIT = 'X'.
ENDIF.
IF LS_ITEM-PSTYP IS NOT INITIAL.
LS_POITEMX-ITEM_CAT = 'X'.
ENDIF.
IF LS_ITEM-EBELP IS NOT INITIAL.
LS_POITEMX-TRACKINGNO = 'X'.
ENDIF.
IF LS_ITEM-RETPO IS NOT INITIAL.
LS_POITEMX-RET_ITEM = 'X'.
ENDIF.
IF LS_ITEM-UMSON IS NOT INITIAL.
LS_POITEMX-FREE_ITEM = 'X'.
ENDIF.
IF LS_ITEM-MWSKZ IS NOT INITIAL.
LS_POITEMX-TAX_CODE = 'X'.
ENDIF.
IF LS_ITEM-MWSKZ IS NOT INITIAL.
LS_POITEMX-PRICEDATE = 'X'.
ENDIF.
APPEND LS_POITEMX TO LT_POITEMX.
CLEAR LS_POITEMX.
" 采购订单交货计划行
LS_POSCHEDULE-PO_ITEM = LS_ITEM-EBELP.
LS_POSCHEDULE-SCHED_LINE = 1.
LS_POSCHEDULE-DELIVERY_DATE = LS_ITEM-EINDT.
LS_POSCHEDULE-QUANTITY = LS_ITEM-MENGE.
APPEND LS_POSCHEDULE TO LT_POSCHEDULE.
CLEAR LS_POSCHEDULE.
"采购订单交货计划行(更改参数)
LS_POSCHEDULEX-PO_ITEM = LS_ITEM-EBELP.
LS_POSCHEDULEX-SCHED_LINE = 1.
LS_POSCHEDULEX-PO_ITEMX = 'X'.
LS_POSCHEDULEX-SCHED_LINEX = 'X'.
LS_POSCHEDULEX-DELIVERY_DATE = 'X'.
LS_POSCHEDULEX-QUANTITY = 'X'.
APPEND LS_POSCHEDULEX TO LT_POSCHEDULEX.
CLEAR LS_POSCHEDULEX.
"采购订单中的条件
LS_POCOND-ITM_NUMBER = LS_ITEM-EBELP.
LS_POCOND-COND_ST_NO = 1.
LS_POCOND-COND_TYPE = LS_ITEM-KSCHL.
LS_POCOND-COND_VALUE = LS_ITEM-KBETR.
LS_POCOND-CURRENCY = LS_ITEM-WAERS.
LS_POCOND-COND_P_UNT = LS_ITEM-KPEIN.
LS_POCOND-COND_UNIT = LS_ITEM-KMEIN.
LS_POCOND-CHANGE_ID = 'U'.
APPEND LS_POCOND TO LT_POCOND.
CLEAR LS_POCOND.
"采购订单中的条件(更改参数)
LS_POCONDX-ITM_NUMBER = LS_ITEM-EBELP.
LS_POCONDX-COND_ST_NO = 1.
LS_POCONDX-COND_TYPE = 'X'.
LS_POCONDX-COND_VALUE = 'X'.
LS_POCONDX-CURRENCY = 'X'.
LS_POCONDX-COND_P_UNT = 'X'.
LS_POCONDX-COND_UNIT = 'X'.
LS_POCONDX-CHANGE_ID = 'X'.
APPEND LS_POCONDX TO LT_POCONDX.
CLEAR LS_POCONDX.
IF LS_ITEM-KNTTP = 'K'.
LS_POACCOUNT-PO_ITEM = LS_ITEM-EBELP.
LS_POACCOUNT-SERIAL_NO = 1.
LS_POACCOUNT-COSTCENTER = LS_ITEM-KOSTL.
LS_POACCOUNT-GL_ACCOUNT = LS_ITEM-SAKNR.
APPEND LS_POACCOUNT TO LT_POACCOUNT.
LS_POACCOUNTX-PO_ITEM = LS_ITEM-EBELP.
LS_POACCOUNTX-SERIAL_NO = 1.
LS_POACCOUNTX-COSTCENTER = 'X'.
LS_POACCOUNTX-GL_ACCOUNT = 'X'.
APPEND LS_POACCOUNTX TO LT_POACCOUNTX.
CLEAR: LS_POACCOUNT,LS_POACCOUNTX.
ELSEIF LS_ITEM-KNTTP = 'F'.
LS_POACCOUNT-PO_ITEM = LS_ITEM-EBELP.
LS_POACCOUNT-SERIAL_NO = 1.
LS_POACCOUNT-ORDERID = LS_ITEM-AUFNR.
LS_POACCOUNT-GL_ACCOUNT = LS_ITEM-SAKNR.
APPEND LS_POACCOUNT TO LT_POACCOUNT.
LS_POACCOUNTX-PO_ITEM = LS_ITEM-EBELP.
LS_POACCOUNTX-SERIAL_NO = 1.
LS_POACCOUNTX-ORDERID = 'X'.
LS_POACCOUNTX-GL_ACCOUNT = 'X'.
APPEND LS_POACCOUNTX TO LT_POACCOUNTX.
CLEAR: LS_POACCOUNT,LS_POACCOUNTX.
ELSEIF LS_ITEM-KNTTP = 'M'.
LS_POACCOUNT-PO_ITEM = LS_ITEM-EBELP.
LS_POACCOUNT-SERIAL_NO = 1.
LS_POACCOUNT-SD_DOC = LS_ITEM-VBELN.
LS_POACCOUNT-ITM_NUMBER = LS_ITEM-VBELP.
APPEND LS_POACCOUNT TO LT_POACCOUNT.
LS_POACCOUNTX-PO_ITEM = LS_ITEM-EBELP.
LS_POACCOUNTX-SERIAL_NO = 1.
LS_POACCOUNTX-SD_DOC = 'X'.
LS_POACCOUNTX-ITM_NUMBER = 'X'.
APPEND LS_POACCOUNTX TO LT_POACCOUNTX.
CLEAR: LS_POACCOUNT,LS_POACCOUNTX.
ELSEIF LS_ITEM-KNTTP = 'A'.
LS_POACCOUNT-PO_ITEM = LS_ITEM-EBELP.
LS_POACCOUNT-SERIAL_NO = 1.
LS_POACCOUNT-ORDERID = LS_ITEM-AUFNR.
LS_ITEM-ANLN1 = |{ LS_ITEM-ANLN1 ALPHA = IN }|.
LS_POACCOUNT-ASSET_NO = LS_ITEM-ANLN1.
LS_ITEM-ANLN2 = |{ LS_ITEM-ANLN2 ALPHA = IN }|.
LS_POACCOUNT-SUB_NUMBER = LS_ITEM-ANLN2.
APPEND LS_POACCOUNT TO LT_POACCOUNT.
LS_POACCOUNTX-PO_ITEM = LS_ITEM-EBELP.
LS_POACCOUNTX-SERIAL_NO = 1.
LS_POACCOUNTX-ORDERID = 'X'.
LS_POACCOUNTX-ASSET_NO = 'X'.
LS_POACCOUNTX-SUB_NUMBER = 'X'.
APPEND LS_POACCOUNTX TO LT_POACCOUNTX.
CLEAR: LS_POACCOUNT,LS_POACCOUNTX.
ENDIF.
ENDLOOP.
*----------------给传入的结构和表赋值 END ------------------*
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
POHEADER = LS_POHEADER
POHEADERX = LS_POHEADERX
TABLES
RETURN = LT_RETURN
POITEM = LT_POITEM
POITEMX = LT_POITEMX
POSCHEDULE = LT_POSCHEDULE
POSCHEDULEX = LT_POSCHEDULEX
POACCOUNT = LT_POACCOUNT
POACCOUNTX = LT_POACCOUNTX
POCOND = LT_POCOND
POCONDX = LT_POCONDX
* EXTENSIONIN = EXTENSIONIN
.
DATA LS_MSG TYPE BAPIRET2.
LOOP AT LT_RETURN INTO DATA(LS_RETUEN).
MOVE-CORRESPONDING LS_RETUEN TO LS_MSG.
APPEND LS_MSG TO OT_MSG.
IF LS_RETUEN-TYPE = 'S'.
OV_MSG = OV_MSG && LS_RETUEN-MESSAGE.
ENDIF.
ENDLOOP.
LOOP AT LT_RETURN INTO LS_RETUEN WHERE TYPE = 'E' OR TYPE = 'A'. "S 成功,E 错误,W 警告,I 信息,A 中断
CONCATENATE OV_MSG LS_RETUEN-MESSAGE INTO OV_MSG.
ENDLOOP.
IF SY-SUBRC = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
ENDIF.
ENDFUNCTION.
其他
结构如下:
ZMM_S_PO_CREATE1_HEAD
组件 | 组件类型 | 描述 |
---|---|---|
BUKRS | BUKRS | 公司代码 |
LIFNR | LIFNR | 供应商或债权人的帐号 |
EKORG | EKORG | 采购组织 |
EKGRP | EKGRP | 采购组 |
BSART | BSART | 订单类型(采购) |
AEDAT | AEDAT | 最后更改的日期 |
WAERS | WAERS | 货币码 |
ZMM_S_PO_CREATE1_ITEM
组件 | 组件类型 | 描述 |
---|---|---|
EBELN | EBELN | 采购凭证编号 |
BSART | BSART | 订单类型(采购) |
LIFNR | LIFNR | 供应商或债权人的帐号 |
AEDAT | AEDAT | 最后更改的日期 |
EKORG | EKORG | 采购组织 |
EKGRP | EKGRP | 采购组 |
BUKRS | BUKRS | 公司代码 |
EBELP | EBELP | 采购凭证的项目编号 |
KNTTP | KNTTP | 科目分配类别 |
PSTYP | PSTYP | 采购凭证中的项目类别 |
MATNR | MATNR | 物料编号 |
TXZ01 | TXZ01 | 短文本 |
MENGE | MENGE | 采购订单数量 |
MEINS | MEINS | 基本计量单位 |
EINDT | EINDT | 项目交货日期 |
MATKL | MATKL | 物料组 |
WERKS | WERKS_D | 工厂 |
LGORT | LGORT_D | 库存地点 |
KSCHL | KSCHL | 条件类型 |
KBETR | KBETR | 条件金额或百分比 |
WAERS | WAERS | 货币码 |
KPEIN | KPEIN | 条件定价单位 |
KMEIN | KMEIN | 条件单位 |
KOSTL | KOSTL | 成本中心 |
AUFNR | AUFNR | 订单号 |
SAKNR | SAKNR | 总账科目编号 |
RETPO | RETPO | 退货项目 |
UMSON | UMSON | 免费项目 |
MWSKZ | MWSKZ | 销售/购买税代码 |
ANLN1 | ANLN1 | 主资产号 |
ANLN2 | ANLN2 | 资产子编号 |
VBELN | VBELN | 销售和分销凭证号 |
VBELP | VBELP | 销售凭证项目 |
AFNAM | AFNAM | 需求者/要求者名称 |
MEPRF | MEPRF | 价格确定(定价)日期控制 |