1.一、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对象未维护)
2.二、实际业务场景及操作细节
| 场景 | 业务需求 | ME21N操作要点 |
|————————-|————————–|———————————————————————————
| 1. 生产原料采购 | 根据生产工单采购原材料 | 输入物料号+工厂,勾选”基于需求”(Account Assignment Category = F) |
| 2. 服务采购 | 维护IT外包合同 | 使用KNTYP=K
,输入服务描述,关联框架协议(合同编号) |
| 3. 库存转储订单 | 跨工厂调拨库存 | 使用移动类型UB
,输入发货工厂和收货工厂,触发后续移动(MIGO) |
| 4. 框架协议发布 | 按长期协议生成交货计划 | 输入框架协议编号(如合同/计划协议),自动继承价格和条款 |
| 5. 紧急采购(无物料主数据) | 未编码物料的临时采购 | 使用MATNR = 非限制物料
(如输入文本描述),手动维护价格和单位 |
—
3.三、常见错误及解决方案
| 错误号 | 错误描述 | 原因分析 | 解决方案 |
|————|————————————-|——————————–|—————————————————————————|
| 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) |
—
4.四、ABAP创建采购订单示例代码
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 |
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. |
—
5.五、代码说明
- BAPI选择:使用标准BAPI
BAPI_PO_CREATE1
,支持复杂业务逻辑(如多科目分配) - 必填字段:确保供应商、公司代码、物料等主数据有效性
- 扩展性:可添加增强字段(如增强结构
BAPIEKPOX
/BAPIEKPOCX
) - 调试建议:使用
ME22N
或ME23N
检查生成的PO是否符合业务规则
如需进一步优化(如增强校验或输出打印),可通过BADI ME_PROCESS_PO_CUST
实现。