关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一

作者:斌将军 约 6 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, PP, SD, 开发, 生产, 销售分销
关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图
关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图

## 1.1、业务背景

## 由于销售、研发、工艺等需要频繁变更,导致工单中组件需要频繁的进行变更,修改组件的物料,数量,库存地点,工序等内容。

## 1.2、技术痛点

为了满足要求,使用了函数:CO_XT_COMPONENT_ADD和CO_XT_COMPONENT_CHANGE用于组件的新增和修改,使用CO_XT_COMPONENTS_DELETE用于组件的批量删除。

** 痛点1: **

新增和修改函数,每次只能更改一行组件,而且无法按照订单维度,批量修改组件,只能按照组件维度,多次调用函数,每一次都需要提交保存一遍工单,效率很慢。

** 痛点2: **

项目中在工单修改保存时,调用了同步接口推送工单到MES,且MES必须返回成功结果,工单修改才允许保存。受接口+网络影响,工单保存效率很慢。

** 痛点3: **

受制于同步接口等原因,导致工单保存时耗时较长,且一直保持着对工单的锁定状态。而批导程序紧接着处理第二行同一工单的组件数据,就会导致出现工单锁表报错。

## 2.1、BAPI现状

维护订单的BAPI:BAPI_ALM_ORDER_MAINTAIN,拥有丰富的工单修改字段,然而对于生产订单限制修改,只允许修改维护订单。

另外,经过测试,还有反冲强制取物料主数据内容导致不能指定;组件分配报错问题;组件分配BOM行号重新被指定问题等,需要逐一进行修改。

** 本文档,对BAPI的改造是否满足读者项目的要求,还需读者多加测试 **

### 2.1.1、反冲被默认

在原逻辑中,有赋默认值的函数,里面根据物料主数据对传入的反冲标识做了更改

关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图
关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图

调用子例程

关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图
关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图

在以下代码处修改了传入的反冲标识

关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图
关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图

### 2.1.2、组件分配

在工单中,工序可以通过主数据带入工艺路线,也可以直接在工单前台手工创建。

关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图
关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图

问题在于,当在CO02手工创建时,与CA01创建的工序不一样,缺少了部分字段值,最主要的序列字段为空

关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图
关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图

导致组件分配给30工序后,前台查看组件出现报错,或组件全部丢失,最终判定都是因为序列PLNFL字段为空导致

关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图
关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图

### 2.1.3、BOM行项目

标准程序中,会根据要分配的工序,查找已经存在分配给该工序的组件,获取这些组件的最大BOM号,+10获得最新BOM号。

如果当前分配的工序,没有存在已经分配给该工序的组件,则直接+10得到最新BOM号0010。

关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图
关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图

例如:将0030行分配给20工序,而现有的两个工序都是10,没有20工序的组件,则BOM号0030行分配完之后,BOM号将变为0010

关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图
关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图

### 2.1.4、工单类型限制

该BAPI只能修改维护订单,不能修改其他类型工单

关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图
关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图

## 2.2、增强改造(未采用)

第一次改造,使用了代码修改器,修改原有逻辑,如下所示:

跳过反冲默认

关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图
关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图

跳过订单类型限制

关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图
关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图

**但是最终感觉太多的地方要修改,并且从未来持续优化功能的角度出发,写大量的代码片段不是一件好事情,且四代增强也要花很多时间调试,因此打算放弃改源码,而直接做代码拷贝。参考2.3自定义BAPI**

## 2.3、自定义BAPI

根据多次的源码调试,找到程序运行相关的函数、包含文件等,依次进行代码的复制,过程不做过多说明,结果如下:

1、复制标准BAPI:BAPI_ALM_ORDER_MAINTAIN 为:ZBAPI_ALM_ORDER_MAINTAIN

2、复制标准函数:IBAPI_C_DEFAULT_VALUES_01 为:ZBAPI_C_DEFAULT_VALUES_01 修改反冲标识

关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图
关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图

3、复制标准程序:LIBAPI_ALM_ORDER_PROCESSINGF10 为:LZBAPI_ALM_ORDER_PROCESSINGF10

在AFVC表中,序列PLNFL为空,但是序列APLFL有值,可以使用

关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图
关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图

在程序中为PLNFL赋值,解决组件分配报错

关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图
关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图

4、复制标准程序:LIBAPI_CF03 为:LZBAPI_CF03

注释掉BOM号递增逻辑

关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图
关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图

5、复制标准函数:IBAPI_H_ORDER_READ 为:ZBAPI_H_ORDER_READ

去掉对生产订单的限制

关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图
关于改造维护工单 BAPI_ALM_ORDER_MAINTAIN 用于生产订单组件批量修改一 - 封面图

另外在标准逻辑调用过程中上下文需要做修改的程序也需要一起复制。

斌将军

关于作者:斌将军

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「关于改造维护工单BAPI_ALM_ORDER_MAINTAIN用于生产订单组件批量修改一.md」整理生成,仅用于内部技术分享与学习交流。