如何通过BAPI_ALM_ORDER_MAINTAIN创建工单并关联已有通知?
创建维护工单并关联已有通知(无需手动传入工厂/工作中心)
首先明确:是否可行取决于你的工单类型配置和已有通知的完整性。如果目标工单类型(如PMA1)配置为允许从关联通知自动复制必填字段(工厂、工作中心等),且待关联的通知已经维护了这些必填信息,那么完全可以实现无需手动传入这些字段的需求。
为什么你之前的代码报错?
- 第一次报错
IW 004 Enter a plant、IGRAPH 803 Enter work center:工单的头部和工序存在必填字段,你既没手动传入,也没配置让BAPI从关联通知自动复制这些值。 - 第二次报错
Order %00000000001 cannot be saved, since no operation is maintained:你的工单类型(PMA1)配置要求必须维护工序,但你没有创建工序相关数据。
前置配置与数据检查
在调用BAPI之前,请先确认以下内容:
- 用事务码
IW23打开目标通知(000000001387),确保已维护工厂(Plant)、**工作中心(Work Center)**等必填字段。 - 用事务码
OIOA(或SPRO路径:Plant Maintenance and Customer Service > Maintenance and Service Processing > Maintenance and Service Orders > Functions and Settings for Order Types > Define Notification and Order Integration)检查工单类型PMA1的配置:- 勾选
Copy Notification Data选项,确保工单会自动从关联通知复制工厂、工作中心、工序等信息。 - 如果工单类型要求必须有工序,确认配置允许从通知复制工序,或者自动生成默认工序。
- 勾选
调整后的代码示例
DATA: lt_methods TYPE STANDARD TABLE OF bapi_alm_order_method, ls_methods TYPE bapi_alm_order_method, lt_header TYPE STANDARD TABLE OF bapi_alm_order_header, ls_header TYPE bapi_alm_order_header, lt_header_up TYPE STANDARD TABLE OF bapi_alm_order_header_up, ls_header_up TYPE bapi_alm_order_header_up, lt_return TYPE STANDARD TABLE OF bapiret2, ls_return TYPE bapiret2. * 1. 定义方法:创建工单头部 + 保存 CLEAR ls_methods. ls_methods-refnumber = 1. ls_methods-objecttype = 'HEADER'. ls_methods-method = 'CREATE'. ls_methods-objectkey = '%00000000001'. " 占位符,BAPI会生成实际工单编号 APPEND ls_methods TO lt_methods. CLEAR ls_methods. ls_methods-refnumber = 1. ls_methods-method = 'SAVE'. ls_methods-objecttype = ''. ls_methods-objectkey = '%00000000001'. APPEND ls_methods TO lt_methods. * 2. 维护工单头部:仅指定工单类型和关联通知 CLEAR ls_header. ls_header-order_type = 'PMA1'. ls_header-notif_no = '000000001387'. " 关联已有通知 APPEND ls_header TO lt_header. * 3. 指定更新字段:仅标记工单类型和通知编号为待更新 CLEAR ls_header_up. ls_header_up-order_type = 'X'. ls_header_up-notif_no = 'X'. APPEND ls_header_up TO lt_header_up. * 4. 调用BAPI创建工单 CALL FUNCTION 'BAPI_ALM_ORDER_MAINTAIN' TABLES it_methods = lt_methods it_header = lt_header it_header_up = lt_header_up return = lt_return. * 5. 检查返回结果,处理错误 LOOP AT lt_return INTO ls_return WHERE type CA 'EA'. WRITE:/ ls_return-id, ls_return-number, ls_return-message. ENDLOOP. * 6. 无错误则提交事务,否则回滚 IF NOT line_exists( lt_return[ type = 'E' ] ). CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. WRITE:/ '工单创建成功!'. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. WRITE:/ '工单创建失败!'. ENDIF.
代码说明
- 移除了
OBJECTLIST相关操作:通过工单头部的NOTIF_NO关联通知后,BAPI会自动将通知中的对象(如设备、位置)同步到工单的对象列表中,无需手动创建。 - 仅维护核心字段:如果通知中已维护工厂、工作中心等必填信息,且工单类型配置为自动复制通知数据,BAPI会自动填充这些字段。
- 增加了错误检查:便于快速定位问题,避免无效的事务提交。
如果执行后仍报错,请排查:
- 通知是否真的维护了所有必填字段(工厂、工作中心等)。
- 工单类型的复制控制配置是否正确,确保通知数据能被自动复制到工单中。
- 是否有其他隐藏必填字段未满足(可通过事务码
IW31手动创建同类型工单,观察系统要求的必填项)。
内容的提问来源于stack exchange,提问作者paolo
相关产品推荐
相关产品推荐

