在SAP中创建采购订单(Purchase Order, PO)通常使用标准事务代码 ME21N(手动创建)或通过ABAP程序调用BAPI/函数模块实现自动化。以下是两种主要方式:
1.1. 标准事务代码手动创建
- ME21N: 手动输入采购订单抬头和行项目数据
- 关键字段:
- 供应商(Vendor)
- 采购组织(Purchasing Organization)
- 公司代码(Company Code)
- 物料(Material)、数量、价格等行项目数据
2.2. ABAP自动创建采购订单(使用BAPI)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
DATA: ls_header TYPE bapimepoheader, ls_headerx TYPE bapimepoheaderx, lt_items TYPE TABLE OF bapimepoitem, ls_item TYPE bapimepoitem, lt_itemsx TYPE TABLE OF bapimepoitemx, ls_itemx TYPE bapimepoitemx, lt_return TYPE TABLE OF bapiret2. * 抬头数据 ls_header-doc_type = 'NB' . "订单类型(标准采购订单) ls_header-vendor = '0000012345' . "供应商编号 ls_header-pur_org = '0001' . "采购组织 ls_header-comp_code = '1000' . "公司代码 ls_headerx-doc_type = 'X'. ls_headerx-vendor = 'X'. ls_headerx-pur_org = 'X'. ls_headerx-comp_code = 'X'. * 行项目数据 ls_item-po_item = '00010' . "行项目号 ls-item-material = 'MAT001' . "物料号 ls-item-plant = '0001' . "工厂 ls-item-quantity = 100 . "数量 ls-item-net_price = '10.50' . "净价 APPEND ls_item TO lt_items. ls_itemx-po_item = '00010'. ls_itemx-material = 'X'. ls_itemx-plant = 'X'. ls_itemx-quantity = 'X'. ls_itemx-net_price = 'X'. APPEND ls_itemx TO lt_itemsx. * 调用BAPI创建采购订单 CALL FUNCTION 'BAPI_PO_CREATE' EXPORTING poheader = ls_header poheaderx = ls_headerx TABLES return = lt_return poitem = lt_items poitemx = lt_itemsx. * 检查错误并提交 IF lt_return[] IS INITIAL. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. WRITE '采购订单创建成功!'. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. LOOP AT lt_return INTO DATA(ls_return). WRITE: / ls_return-message. ENDLOOP. ENDIF. |
3.关键点说明:
- BAPI_PO_CREATE: 标准BAPI,需填充抬头(
poheader
)和行项目(poitem
)的字段及X结构(标识字段更新)。 - 必填字段: 供应商、采购组织、公司代码、物料、数量、价格等。
- 扩展字段: 若需自定义字段,需使用增强结构(如
BAPI_TE_MEPOHEAD
/BAPI_TE_MEPOITEM
)。 - 事务提交: 必须调用
BAPI_TRANSACTION_COMMIT
或回滚。
如需更复杂的逻辑(如账户分配、条件处理),需扩展代码或使用其他BAPI(如BAPI_PO_CHANGE
)。
以下是使用BAPI(如BAPI_PO_CREATE1
)创建采购订单时的常见错误及解决方法,包括价格条件无法指定的问题:
4.1. 价格条件无法指定或更新
原因:
- 条件类型(如PBXX)未在采购订单的定价过程中配置,或条件记录未维护(如信息记录无有效价格)。
- 账户分配类别(如K)可能限制了条件类型的输入。
- 调用BAPI时未正确传递条件数据到扩展结构
EXTENSIONIN
或CONDITIONS
。 - 参数
NO_PRICE_UPDATE
设置为X
,导致跳过价格更新。
解决方法:
- 检查条件配置:
- 通过事务代码
MEK2
维护信息记录中的价格条件。 - 检查定价过程配置(事务代码
OMGQ
),确保条件类型已分配。
- 正确传递条件数据:
- 若使用
CONDITIONS
参数,需填充表字段如COND_TYPE
(条件类型)、COND_VALUE
(价格)、CURRENCY
(货币)。 - 若条件通过扩展字段传递,使用
EXTENSIONIN
结构,并指定字段VALUENUM
(值)和VALUEDEN
(分母)。
- 关闭价格更新限制:
- 确保
NO_PRICE_UPDATE
参数未设置为X
。
5.2. 供应商不存在或数据错误
原因:供应商主数据未维护,或采购组织/工厂未分配给供应商。
解决:
- 检查供应商主数据(事务代码
XK03
),确认采购组织视图已维护。 - 通过
BAPI_VENDOR_GETDETAIL
验证供应商状态。
6.3. 物料主数据问题
原因:物料未在采购视图中维护,或单位不匹配。
解决:
- 检查物料采购视图(事务代码
MM03
),确认采购组、工厂等字段已维护。 - 确保BAPI中物料单位与主数据一致。
7.4. 公司代码或采购组织错误
原因:公司代码与采购组织未关联,或货币不匹配。
解决:
- 检查采购组织分配(事务代码
OX01
)。 - 确保货币与公司代码配置一致(事务代码
OB22
)。
8.5. 接口表未正确填充
原因:必填字段(如POHEADER
/POITEM
)缺失或格式错误。
解决:
- 检查字段如
DOC_TYPE
(单据类型)、ITEM_CAT
(行项目类别)是否合法。 - 使用
BAPI_MATERIAL_GETDETAIL
验证物料数据。
9.6. 未提交事务
原因:调用BAPI后未执行BAPI_TRANSACTION_COMMIT
。
解决:
- 调用BAPI后,必须执行:
1 2 3 |
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING WAIT = 'X'. |
10.其他建议
- 始终检查返回表
RETURN
中的错误消息(字段TYPE = E
或A
)。 - 使用
ME22N
手动创建采购订单,对比BAPI参数与界面输入是否一致。 - 通过调试或日志工具(如
ST22
)定位ABAP Dump具体原因。
如需更具体的错误分析,请提供返回消息或Dump详情!