一、ME21N创建采购订单关键点
- 采购组织/采购组
- 字段:
EKORG
(采购组织)、EKGRP
(采购组) - 关键点:采购组织必须与公司代码(Company Code)关联,采购组对应采购员职责范围
- 示例:公司代码1000的采购组织需在SPRO中配置关联(OX01)
- 字段:
- 供应商主数据(Vendor Master)
- 字段:
LIFNR
(供应商编号) - 关键点:供应商需维护采购组织层级的采购视图(事务代码XK01/XK02)
- 字段:
- 物料/服务描述
- 字段:
MATNR
(物料号)或KNTYP
(科目分配类别) - 服务采购场景:使用
KNTYP = K
(服务)并输入文本描述
- 字段:
- 价格确定机制
- 数据源:信息记录(Info Record, ME11/ME12)或框架协议(Contract/Outline Agreement)
- 错误规避:未维护条件记录(Condition Record)会触发错误
ME161 "Price cannot be determined"
- 账户分配类别(Account Assignment Category)
- 字段:
KNTYP
(如K-成本中心、F-固定资产等) - 财务集成:选择错误类别会导致过账失败(如CO对象未维护)
- 字段:
二、实际业务场景及操作细节
| 场景 | 业务需求 | ME21N操作要点 |
| 1. 生产原料采购 | 根据生产工单采购原材料 | 输入物料号+工厂,勾选”基于需求”(Account Assignment Category = F) |
| 2. 服务采购 | 维护IT外包合同 | 使用KNTYP=K
,输入服务描述,关联框架协议(合同编号) |
| 3. 库存转储订单 | 跨工厂调拨库存 | 使用移动类型UB
,输入发货工厂和收货工厂,触发后续移动(MIGO) |
| 4. 框架协议发布 | 按长期协议生成交货计划 | 输入框架协议编号(如合同/计划协议),自动继承价格和条款 |
| 5. 紧急采购(无物料主数据) | 未编码物料的临时采购 | 使用MATNR = 非限制物料
(如输入文本描述),手动维护价格和单位 |
—
三、常见错误及解决方案
| 错误号 | 错误描述 | 原因分析 | 解决方案 |
| ME161 | 价格无法确定(Price cannot be determined) | 信息记录未维护或有效期错误 | 执行ME11维护条件记录,检查有效期/采购组织匹配性 |
| ME165 | 账户分配类别未找到(Account assignment category not found) | 未输入或错误填写KNTYP字段 | 检查字段值(如K/F/M)并确保相关CO对象(成本中心/订单)已存在 |
| ME032 | 采购组织未分配到公司代码(Purch. organization not assigned to company code) | 采购组织与公司代码关联缺失 | 通过SPRO路径:MM > 采购 > 分配采购组织到公司代码(OX01) |
| ME083 | 供应商未在采购组织中维护(Vendor not maintained in purchasing org) | 供应商主数据未扩展采购组织视图 | 使用XK02为供应商扩展采购组织层数据 |
| F5118 | 总账科目未定义(GL account not defined) | 自动科目确定失败(如税码/工厂组合错误) | 检查OBYC配置(事务代码)或手动输入正确科目 |
| ME129 | 采购订单类型不允许(Order type not allowed) | 订单类型与采购组织不兼容 | 通过OMET配置允许的订单类型组合 |
| ME262 | 工厂未分配给采购组织(Plant not assigned) | 工厂未在采购组织层级关联 | 通过事务代码OWZ1分配工厂到采购组织 |
| ME280 | 框架协议项目已关闭(Contract item closed) | 关联的框架协议状态为已完成 | 检查框架协议(ME33K)并重新打开项目或创建新协议 |
| M7305 | 收货地址不完整(Incomplete delivery address) | 供应商或装运数据缺失 | 维护供应商主数据中的装运视图(XD02)或手动输入地址 |
| ME21N系统锁 | 用户被锁定(User locked by system) | 用户会话冲突或权限不足 | 检查SM04终止重复会话,或申请权限角色(如添加权限对象M_BEST_APP)
四、ABAP创建采购订单示例代码
REPORT Z_CREATE_PO_ABAP.
DATA: lt_po_header TYPE bapimepoheader,
lt_po_items TYPE TABLE OF bapimepoitem,
lt_po_account TYPE TABLE OF bapimepoaccount,
lt_return TYPE TABLE OF bapiret2.
lt_po_header-doc_type = 'NB' . "订单类型:标准采购订单
lt_po_header-vendor = '0000012345' . "供应商编号
lt_po_header-comp_code = '1000' . "公司代码
lt_po_header-pur_group = '001' . "采购组
APPEND INITIAL LINE TO lt_po_items ASSIGNING FIELD-SYMBOL(<item>).
<item>-po_item = '00010' . "行号
<item>-material = 'MAT-1000' . "物料号
<item>-plant = '1000' . "工厂
<item>-quantity = '100' . "数量
<item>-po_unit = 'EA' . "单位
APPEND INITIAL LINE TO lt_po_account ASSIGNING FIELD-SYMBOL(<acc>).
<acc>-item_no = '00010' . "关联行号
<acc>-gl_account = '0000440000' . "总账科目
<acc>-costcenter = '10000001' . "成本中心
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = lt_po_header
TABLES
poitem = lt_po_items
poaccount = lt_po_account
return = lt_return.
READ TABLE lt_return WITH KEY type = 'E' TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
WRITE: / '错误发生,请检查Return表'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
WRITE: / '采购订单创建成功,编号:', lt_po_header-po_number.
ENDIF.
五、代码说明
- BAPI选择:使用标准BAPI
BAPI_PO_CREATE1
,支持复杂业务逻辑(如多科目分配) - 必填字段:确保供应商、公司代码、物料等主数据有效性
- 扩展性:可添加增强字段(如增强结构
BAPIEKPOX
/BAPIEKPOCX
) - 调试建议:使用
ME22N
或ME23N
检查生成的PO是否符合业务规则
如需进一步优化(如增强校验或输出打印),可通过BADI ME_PROCESS_PO_CUST
实现。