生产工单收货控制增强

本文介绍了ABAP程序员如何通过增强控制解决生产工单收货时遇到的问题,包括未报工收货、无投料产出和贵重物料投料控制。通过CMod引入出口增强点,对不同情况进行判断并实现相应的控制逻辑,确保业务流程的正确性。

对于生产工单完工收货(migo+101),我作为ABAP人员通过对日常业务了解。总结以下几种情况可以通过增强方式进行控制。

1、收货时未报工。

2、未投料就有产出。

3、在全部收货时判断贵重A类物料是否按工单组件要求进行投料(A类物料需要在主数据MRP视图中设置)。

具体开发部署如下:

1、通过CMOD事务代码,引入出口增强。增强点如下。

2、收货时未报工的代码。

    DATA:TMPOBJNR TYPE aufk-objnr.

    DATA:i_jest LIKE jest OCCURS  WITH HEADER LINE .

  IF  i_mseg-aufnr IS NOT INITIAL AND  i_mseg-bwart '101' AND i_mseg-ebeln IS INITIAL .

      SELECT SINGLE
         aufk~objnr
        INTO TMPOBJNR
        FROM AUFK
        WHERE AUFK~AUFNR i_mseg-AUFNR AND AUFK~WERKS i_mseg-WERKS.

          SELECT *  FROM jest
            INTO CORRESPONDING FIELDS OF TABLE i_jest
            WHERE objnr TMPOBJNR.
            SORT i_jest .
            DELETE i_jest WHERE  stat <> 'I0009' AND inact space or inact 'X'.
            IF i_jest[] is INITIAL.
                  MESSAGE '报工未完成,无法收最后一次货!' TYPE 'I'.
            ENDIF.

ENDIF

3、未投料就有产出

 IF  i_mseg-aufnr IS NOT INITIAL AND  i_mseg-bwart '101' AND i_mseg-ebeln IS INITIAL .

    SELECT  AUFNR MBLNR BUDAT BWART RSNUM R

<think>我们正在处理一个关于SAP系统增强的问题:用户想在SAP系统中实现维修工单触发采购申请的增强功能。 根据SAP的标准功能,维修工单(属于PM模块)与采购申请(属于MM模块)之间通常可以通过配置或标准功能建立联系,但用户需要的是“增强功能”,即标准功能可能无法满足特定需求,需要开发自定义逻辑。 在SAP中,实现这种增强的常用方法包括: 1. 使用用户出口(User Exit)或客户出口(Customer Exit) 2. 使用业务增强(Business Add-Ins,即BAdI) 3. 使用隐式增强点(Implicit Enhancement Points) 4. 在相关标准程序中使用显式增强点(Explicit Enhancement Points) 具体到“维修工单触发采购申请”这个需求,我们需要在维修工单保存时(或某个特定时点)自动创建采购申请。 步骤分析: 1. 确定触发点:通常是在保存维修工单时(事务代码IW31/IW32)触发。因此,我们需要在保存工单增强点中编写代码。 2. 查找增强点:在工单保存时,常用的增强点有: - 在函数组IWO1中,例如函数模块IWO1_ORDER_SAVE(或类似的函数模块)的出口。 - 使用BAdI:WORKORDER_UPDATE(工单更新时)或类似的BAdI。 3. 创建采购申请:在增强中调用创建采购申请的标准函数,如BAPI_REQUISITION_CREATE或BAPI_PROCESS_REQ_CREATE。 实现步骤: 步骤1:查找合适的增强点 - 通过系统查找,我们可能会发现BAdI: WORKORDER_UPDATE 可以用于工单更新时的增强。这个BAdI在工单保存时被调用。 - 或者,在事务代码IW32保存时,程序SAPMIWO0中可能存在增强点。 步骤2:实现增强 - 如果使用BAdI:WORKORDER_UPDATE,我们需要实现这个BAdI的接口,在方法IF_EX_WORKORDER_UPDATE~AT_SAVE中编写代码。 - 注意:在保存工单时,工单号可能尚未生成(在保存前),因此我们需要在保存后获取工单号。在BAdI中,工单号在参数IV_ORDERID中提供。 步骤3:编写创建采购申请的代码 - 在增强中,我们需要根据维修工单的信息(如设备、维护计划、物料需求等)来创建采购申请。 - 使用BAPI创建采购申请,并处理返回结果。 注意事项: - 需要确保在增强中创建的采购申请与维修工单关联(比如在采购申请的字段中记录维修工单号)。 - 错误处理:如果创建采购申请失败,应该如何处理?通常需要回滚工单的保存,或者将错误信息返回给用户。 示例代码(在BAdI实现中): ```abap METHOD if_ex_workorder_update~at_save. " 在这里,IV_ORDERID是刚刚保存的维修工单号 " 我们可以通过这个工单号去获取需要采购的物料等信息 " 假设我们有一个函数可以获取该工单需要采购的物料列表 " 然后循环物料列表,调用BAPI创建采购申请 DATA: lt_items TYPE TABLE OF bapieban, ls_item TYPE bapieban, lt_return TYPE TABLE OF bapireturn, ls_return TYPE bapireturn. " 示例:填充一个采购申请行项目(实际需要根据业务逻辑获取数据) ls_item-preq_item = '00010'. ls_item-material = 'MAT001'. " 物料号 ls_item-plant = '1000'. " 工厂 ls_item-deliv_date = sy-datum + 30. " 交货日期 ls_item-quantity = '1'. ls_item-unit = 'EA'. APPEND ls_item TO lt_items. " 调用BAPI创建采购申请 CALL FUNCTION 'BAPI_REQUISITION_CREATE' EXPORTING description = 'Created from PM Order' " 描述 pr_type = 'NB' " 采购申请类型 item_data = lt_items TABLES return = lt_return EXCEPTIONS error_message = 1 others = 2. " 检查返回消息 READ TABLE lt_return INTO ls_return WITH KEY type = 'E'. IF sy-subrc = 0. " 如果有错误,记录错误信息(例如,记录到日志,或者触发回滚) " 注意:在BAdI中,我们可能无法直接中断工单保存,但可以设置错误标志 " 通过设置CT_RETURN参数来返回错误(如果BAdI支持) " 或者,我们可以抛出一个异常来回滚整个事务 MESSAGE ID ls_return-id TYPE 'E' NUMBER ls_return-number WITH ls_return-message_v1 ls_return-message_v2 ls_return-message_v3 ls_return-message_v4. ELSE. " 提交BAPI的更改(因为BAPI默认在内存中,需要提交) CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = abap_true. ENDIF. ENDMETHOD. ``` 注意:以上代码仅为示例,实际业务中需要根据维修工单的具体需求(比如物料、数量等)来填充采购申请的项目数据。这些数据可能来自工单的组件(物料预留)或自定义表。 步骤4:测试 - 在测试系统中实现并测试该增强,确保在保存维修工单时正确创建采购申请,并且错误处理得当。 另外,用户可能还需要考虑: - 是否每次保存工单都要创建采购申请?可能只需要在第一次保存时,或者根据工单状态(例如,当工单状态为“已发布”时)。 - 避免重复创建:需要检查是否已经为该工单创建过采购申请。 因此,在增强中,我们可能需要先检查该工单是否已经触发了采购申请(例如,通过一个自定义表记录工单和采购申请的对应关系)。 总结:通过实现BAdI WORKORDER_UPDATE,在AT_SAVE方法中编写创建采购申请的代码,可以实现维修工单触发采购申请的功能。 引用说明: - 关于SAP PM与采购集成的背景,参考引用[1]。 - 关于工单报工的作用(虽然与采购不直接相关,但工单是核心),参考引用[2]。 - 但请注意,我们的解决方案主要基于标准SAP增强技术,不直接依赖引用内容。 相关问题: 1. 如何查找SAP中可用的BAdI? 2. 在SAP中,如何调试一个BAdI实现? 3. 除了BAdI,还有哪些方法可以实现维修工单触发采购申请? 4. 创建采购申请的BAPI有哪些参数是必须的? 5. 在增强中如何处理错误才能不影响工单的正常保存?</think>### SAP维修工单触发采购申请增强实现方法 在SAP系统中实现维修工单自动触发采购申请的增强功能,可通过以下步骤完成: --- ### 1. **确定增强点** 维修工单保存时(事务代码IW31/IW32)是最佳增强时机。核心增强点包括: - **工单保存函数模块**:`IW_ORDER_SAVE` 或 `BAPI_ALM_ORDER_MAINTAIN` - **标准增强框架**: - **BAdI**:`WORKORDER_UPDATE`(工单更新时触发) - **用户出口**:`IWO10003`(工单保存前/后) --- ### 2. **实现增强逻辑** #### 方法一:通过BAdI增强 ```abap " 实现BAdI:WORKORDER_UPDATE METHOD if_ex_workorder_update~at_save. DATA: lv_aufnr TYPE aufnr, " 工单号 lt_items TYPE TABLE OF bapieban. " 采购申请行项目 " 获取当前保存的工单号 lv_aufnr = iv_orderid. " 检查工单是否需要触发采购(自定义逻辑) IF is_trigger_required( lv_aufnr ) = abap_true. " 构建采购申请数据 lt_items = build_purchase_items( lv_aufnr ). " 调用BAPI创建采购申请 CALL FUNCTION 'BAPI_REQUISITION_CREATE' EXPORTING auto_release = 'X' " 自动审批 TABLES return = lt_return requisition_items = lt_items. " 错误处理 IF has_error( lt_return ) = abap_false. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'. " 关联工单与采购申请(自定义表存储关系) link_order_to_pr( lv_aufnr, lt_items[1]-preq_no ). ELSE. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. ENDIF. ENDIF. ENDMETHOD. ``` #### 方法二:通过用户出口增强 在出口程序`ZXIWOU03`(用户出口IWO10003)中添加逻辑: ```abap FORM uexit_save_order USING is_order TYPE viwotte. " 在工单保存后触发采购申请 IF is_order-aufnr IS NOT INITIAL. PERFORM trigger_purchase_requisition USING is_order-aufnr. ENDIF. ENDFORM. ``` --- ### 3. **关键业务逻辑** #### (1)触发条件判断 自定义函数`IS_TRIGGER_REQUIRED`需检查: - 工单类型(如PM01) - 组件需求(T-code IW33查看物料) - 状态是否为“已发布” #### (2)构建采购申请数据 ```abap METHOD build_purchase_items. " 从工单组件表AFVC/AFKO获取物料 SELECT matnr, menge, werks FROM afvc INTO TABLE @lt_components WHERE aufnr = @lv_aufnr. " 转换为BAPI结构 LOOP AT lt_components ASSIGNING FIELD-SYMBOL(<fs>). ls_item-material = <fs>-matnr. ls_item-quantity = <fs>-menge. ls_item-plant = <fs>-werks. ls_item-deliv_date = sy-datum + 30. " 交货日期 APPEND ls_item TO rt_items. ENDLOOP. ENDMETHOD. ``` #### (3)关联单据 通过自定义表存储工单号(AUFNR)与采购申请号(BANFN)的对应关系,实现双向追溯。 --- ### 4. **测试与部署** 1. **单元测试**: - 模拟工单保存场景 - 验证采购申请自动创建及关联 2. **集成测试**: - 检查采购申请审批流程 - 验证物料收货(MIGO)与工单报工集成[^2] 3. **部署**: - 通过事务代码SE19激活BAdI实现 - 使用传输请求(SE10)迁移至生产系统 --- ### 注意事项 1. **权限控制**:确保服务账号有权限调用BAPI 2. **错误处理**:记录失败日志并通知计划员 3. **性能优化**:批量处理场景需避免循环调用BAPI 4. **状态管理**:仅当工单状态为REL(已发布)时触发 > 此增强实现了PM模块与采购业务的高度集成[^1],确保维修工具/设备的需求自动转换为采购申请,减少人工干预并加速维修流程。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值