ABAP 生产订单完工确认(CO11N) BAPI : BAPI_PRODORDCONF_CREATE_TT

本文介绍如何通过ABAP编程实现SAP系统中生产订单的批量完工确认,并详细讲解了涉及倒冲料操作的具体步骤及代码示例。

正文部分

生产完成后,需要对产品进行完工确认(也叫 报工确认);

一般情况下,可以通过事务码(T-Code)CO11 或 CO11N 进行确认。


对于一些零配件的生产时,往往需要确认大量的数量,因而有些用户就会有批量报工的需求。

批量报工可以通过两种方式实现:录制BDC 或者 Call 系统标准 BAPI。

1) 录制BDC这里就不讲述了,直接在CO11N上录屏即可;

2) Call 系统标准 BAPI:BAPI_PRODORDCONF_CREATE_TT.



在报工时,当涉及到 倒冲料扣料 的操作时,则需要 Call 两个BAPI来操作:

1. BAPI_PRODORDCONF_GET_TT_PROP 获取生产订单相关属性

2. BAPI_PRODORDCONF_CREATE_TT 报工确认

 

相关操作示例(包括倒冲料操作):

​
* 定义数据内表
DATA: gt_afko TYPE STANDARD TABLE OF afko.
 
* Work Area 定义
DATA: gw_afko  TYPE afko,
      gw_afpo  TYPE afpo,
      gw_afvc  TYPE afvc,
      gw_afvv  TYPE afvv.
 
DATA: gv_index  TYPE sy-tabix,
      gv_result TYPE c.
 
DATA:
*BAPI相关定义
      propose             LIKE bapi_pp_conf_prop,
      timetickets         LIKE bapi_pp_timeticket       OCCURS 0 WITH HEADER LINE,
      goodsmovements      LIKE bapi2017_gm_item_create  OCCURS 0 WITH HEADER LINE,
      link_conf_goodsmov  LIKE bapi_link_conf_goodsmov  OCCURS 0 WITH HEADER LINE,
      return_detail       LIKE bapi_coru_return         OCCURS 0 WITH HEADER LINE,
      return              LIKE bapiret1                 OCCURS 0 WITH HEADER LINE.
 
CONSTANTS:
      cn_flagx TYPE c VALUE 'X'.
 
* Get Data...
* Header
CLEAR gt_afko[].
SELECT aufnr rsnum aufpl
  INTO CORRESPONDING FIELDS OF TABLE gt_afko
  FROM afko
  WHERE aufnr IN so_aufnr  "生产工单号
  .
 
* Data Proccess...
CLEAR gw_afko.
LOOP AT gt_afko INTO gw_afko.
 
  IF sy-subrc = 0.
 
    CLEAR gw_afvc.
    SELECT SINGLE
      aufpl       "订单工序的工艺路线号
      aplzl       "订单的通用计数器
      vornr       "工序
      plnfl       "顺序
      arbid
      aplfl       "序列(新) 有值
      INTO CORRESPONDING FIELDS OF gw_afvc
      FROM afvc
      WHERE aufpl = gw_afko-aufpl.
 
    IF sy-subrc = 0.
 
* 1.需要更新的数据设置
      CLEAR propose.
      propose-quantity          = cn_flagx.   "更新数量
      propose-date_and_time     = cn_flagx.   "更新作业时间
      propose-goodsmovement     = cn_flagx.   "更新货物移动
 
* 2.作业时间
      CLEAR: timetickets,timetickets[].
      timetickets-orderid       = gw_print-aufnr. "工单号
      timetickets-operation     = gw_afvc-vornr.  "工序号
      timetickets-yield         = gw_print-lmnga. "工单生产数量
      timetickets-sequence      = gw_afvc-aplfl.  "
      APPEND timetickets.
      CLEAR  timetickets.
 
* 3.货物移动属性
* 第一次赋值,用于获取相关默认属性值
      CLEAR: goodsmovements,goodsmovements[].
      goodsmovements-orderid    = gw_print-aufnr.  "生产订单号
      goodsmovements-order_itno = gw_afvc-vornr.   "工序号
      APPEND goodsmovements.
      CLEAR  goodsmovements.
 
* 4.调用BAPI,获取默认属性值
      CALL FUNCTION 'BAPI_PRODORDCONF_GET_TT_PROP'
        EXPORTING
          propose            = propose
        IMPORTING
          return             = return
        TABLES
          timetickets        = timetickets
          goodsmovements     = goodsmovements
          link_conf_goodsmov = link_conf_goodsmov
          detail_return      = return_detail.
 
* 5.输出异常信息
      IF return-type = 'E' OR return-type = 'A'.
 
        CONCATENATE '错误:' return-message INTO return-message.
        gv_result = cn_flagx.
 
      ENDIF.
 
      LOOP AT return_detail WHERE type IS NOT INITIAL.
 
        IF return_detail-type = 'E' OR return_detail-type = 'A'.
 
          CONCATENATE '错误:' return_detail-message INTO return-message.
          gv_result = cn_flagx.
 
        ENDIF.
 
      ENDLOOP.
 
* 6. 如若需要更新相关信息,可在此修改
* -- 这里修改作业时间 --
      IF gv_result NE cn_flagx.
 
        CLEAR gv_index.
        LOOP AT timetickets.
 
          gv_index = sy-tabix.    "索引
          CLEAR gw_afvv.
          SELECT SINGLE * FROM afvv
            INTO CORRESPONDING FIELDS OF gw_afvv
            WHERE aufpl = gw_afvc-aufpl
              AND aplzl = gw_afvc-aplzl.
 
          IF sy-subrc = 0.
 
            IF NOT gw_afvv-bmsch = 0.
              IF timetickets-conf_acti_unit1 NE 'S'.
                timetickets-conf_activity1 = timetickets-yield * gw_afvv-vgw01 / gw_afvv-bmsch.
              ELSE.
                timetickets-conf_activity1 = timetickets-yield * gw_afvv-vgw01 DIV gw_afvv-bmsch.
              ENDIF.
 
              IF timetickets-conf_acti_unit2 NE 'S'.
                timetickets-conf_activity2 = timetickets-yield * gw_afvv-vgw02 / gw_afvv-bmsch.
              ELSE.
                timetickets-conf_activity2 = timetickets-yield * gw_afvv-vgw02 DIV gw_afvv-bmsch.
              ENDIF.
 
              IF timetickets-conf_acti_unit3 NE 'S'.
                timetickets-conf_activity3 = timetickets-yield * gw_afvv-vgw03 / gw_afvv-bmsch.
              ELSE.
                timetickets-conf_activity3 = timetickets-yield * gw_afvv-vgw03 DIV gw_afvv-bmsch.
              ENDIF.
 
              IF timetickets-conf_acti_unit4 NE 'S'.
                timetickets-conf_activity4 = timetickets-yield * gw_afvv-vgw04 / gw_afvv-bmsch.
              ELSE.
                timetickets-conf_activity4 = timetickets-yield * gw_afvv-vgw04 DIV gw_afvv-bmsch.
              ENDIF.
 
              IF timetickets-conf_acti_unit5 NE 'S'.
                timetickets-conf_activity5 = timetickets-yield * gw_afvv-vgw05 / gw_afvv-bmsch.
              ELSE.
                timetickets-conf_activity5 = timetickets-yield * gw_afvv-vgw05 DIV gw_afvv-bmsch.
              ENDIF.
 
              IF timetickets-conf_acti_unit6 NE 'S'.
                timetickets-conf_activity6 = timetickets-yield * gw_afvv-vgw06 / gw_afvv-bmsch.
              ELSE.
                timetickets-conf_activity6 = timetickets-yield * gw_afvv-vgw06 DIV gw_afvv-bmsch.
              ENDIF.
 
            ENDIF.
 
          ENDIF.
 
          timetickets-yield  = 200.    "待确认的产量(用户输入确认值)
 
          IF gw_afvv IS NOT INITIAL.
 
            MODIFY timetickets INDEX gv_index TRANSPORTING yield
              conf_activity1 conf_acti_unit1 conf_activity2 conf_acti_unit2
              conf_activity3 conf_acti_unit3 conf_activity4 conf_acti_unit4
              conf_activity5 conf_acti_unit5 conf_activity6 conf_acti_unit6.
 
          ELSE.
 
            MODIFY timetickets INDEX gv_index TRANSPORTING yield.
 
          ENDIF.
 
          CLEAR timetickets.
        ENDLOOP.
 
        CLEAR gw_afvv.
      ENDIF.
 
 
* 7. 调用BAPI,报工确认
      CLEAR: return, return[].
      CLEAR: return_detail, return_detail[].
      CALL FUNCTION 'BAPI_PRODORDCONF_CREATE_TT'
        EXPORTING
          post_wrong_entries = '1'
          testrun            = ''      "标识为 X,则为试运行 不提交至系统
        IMPORTING
          return             = return
        TABLES
          timetickets        = timetickets
          goodsmovements     = goodsmovements
          link_conf_goodsmov = link_conf_goodsmov
          detail_return      = return_detail.
 
      CLEAR gv_result.
      READ TABLE return WITH KEY type = 'E'.
      IF sy-subrc = 0.
 
        CONCATENATE '错误:' return-message INTO return-message.
        gv_result = cn_flagx.
 
      ENDIF.
      LOOP AT return_detail WHERE type IS NOT INITIAL.
        IF return_detail-type = 'E' OR return_detail-type = 'A'.
 
          CONCATENATE '错误:' return_detail-message INTO return-message.
          gv_result = cn_flagx.
 
        ENDIF.
      ENDLOOP.
 
      IF gv_result NE cn_flagx.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = cn_flagx.
      ENDIF.
 
    ENDIF.
  ENDIF.
 
  CLEAR gw_afko.
ENDLOOP.

​

 

点击进入:ABAP 生产订单完工确认(CO11N) BAPI : BAPI_PRODORDCONF_CREATE_TT

 

 

<think>好的,我现在需要帮助用户解决关于SAP BAPI_PRODORDCONF_CREATE_TT自动最终确认的问题。首先,我得先理解用户的需求。用户可能在使用这个BAPI时遇到了自动最终确认的实现问题,或者错误处理方面的困扰。根据用户提供的引用资料,特别是引用[3]和[4],用户提到在调用BAPI时没有返回错误信息,以及未来日期过账的问题。还有引用[4]提到的需要增强处理错误消息。 首先,我应该回顾一下BAPI_PRODORDCONF_CREATE_TT的基本功能。这个BAPI用于生产订单确认,可能涉及过账单的时、物料消耗等。自动最终确认可能指的是在调用这个BAPI后自动将订单状态设为最终确认,而不需要手动操作。不过,用户可能遇到了即使调用BAPI也无法正确触发最终确认的情况,或者错误处理不够明确。 接下来,根据引用[1],提到异步提交的问题。用户可能在使用COMMIT WORK AND WAIT时没有正确同步提交,导致数据不一致。这可能导致自动最终确认未能正确执行。需要检查是否在调用BAPI后正确提交事务,确保数据持久化。 然后,错误处理方面,引用[3]指出BAPI不返回前台CO11N中的错误信息,比如未来日期过账的问题。用户可能在调用BAPI时遇到错误,但无法捕获到具体的错误消息,导致问题难以排查。根据引用[4]的解决方案,需要在增强点调用CM_F_MESSAGES_GET函数来收集错误消息,并触发异常,从而让BAPI的RETURN参数返回这些信息。 所以,自动最终确认的实现可能需要正确设置BAPI的参数,例如POSTGDATE(过账日期)和相关的确认参数。同时,错误处理需要增强,确保错误消息能被正确捕获和返回。 此外,用户可能需要了解如何判断订单是否已经最终确认。引用[2]提到的BAPI_PRODORDCONF_GET_TT_PROP可以用来获取订单属性,可能包括确认状态,这有助于验证BAPI调用后的结果。 在代码示例方面,需要展示如何正确调用BAPI,处理返回参数,以及如何实现增强来捕获错误。同时,要提醒用户注意事务提交的方式,避免异步问题导致的数据不一致。 总结来说,用户的问题集中在如何正确使用BAPI实现自动最终确认,并有效处理可能出现的错误。需要结合参数设置、事务提交、错误增强以及后续状态检查来全面解答。</think>关于SAP BAPI_PRODORDCONF_CREATE_TT的自动最终确认实现及错误处理,以下是分步骤解决方案: 1. **实现自动最终确认的核心参数设置** - 在调用BAPI时需设置`AUTO_FINAL`参数为`X`,表示自动执行最终确认 - 同时必须传递`FINALMODE = X`,否则系统仍会保留中间状态 ```abap CALL FUNCTION 'BAPI_PRODORDCONF_CREATE_TT' EXPORTING postgdate = sy-datum finalmode = 'X' " 强制最终确认 auto_final = 'X'. " 自动标记最终确认 ``` 2. **异步提交问题处理** - 使用`COMMIT WORK AND WAIT`确保异步更新完成[^1] - 检查表`T_RETURN`中的消息类型: ```abap LOOP AT t_return INTO DATA(ls_return) WHERE type = 'E' OR type = 'A'. " 处理错误消息 ENDLOOP. IF sy-subrc = 0. ROLLBACK WORK. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. " 强制同步提交 ENDIF. ``` 3. **错误消息捕获增强实现** - 在用户出口`CMF00001`中增强消息处理: ```abap DATA: lt_messages TYPE cm_t_messages. CALL FUNCTION 'CM_F_MESSAGES_GET' IMPORTING et_messages = lt_messages. IF lt_messages IS NOT INITIAL. " 将消息转移到BAPI返回表 MESSAGE ID 'CK' TYPE 'E' NUMBER '466' RAISING no_costing. [^4] ENDIF. ``` 4. **未来日期过账验证** - 调用前需校验过账日期有效性: ```abap IF postgdate > sy-datum. MESSAGE e001(zmm) WITH '未来日期不允许过账' INTO DATA(lv_msg). RETURN. ENDIF. ``` 5. **确认状态验证方法** - 调用`BAPI_PRODORDCONF_GET_TT_PROP`获取订单属性: ```abap CALL FUNCTION 'BAPI_PRODORDCONF_GET_TT_PROP' EXPORTING orderid = lv_orderid IMPORTING status = lv_status. " 返回状态码CONFSTATUS[^2] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值