ABAP BAPI_PRODORDCONF_CREATE_TT报工接口

代码如下,主要调用BAPI:BAPI_PRODORDCONF_CREATE_TT执行报工

遇到的问题1:报工时反冲料未执行发料,报工正常执行,未出现报错情况,CO1P和COGI都没有找到任何报错信息。
原因:参数goodsmovements 和 link_conf_goodsmov 条目一致,原代码中有判断执行时清了link_conf_goodsmov 参数表的导致发料失败。

FORM FRM_baogong USING wk_tick_in  TYPE bapi_pp_timeticket
                  wk_101move  TYPE bapi2017_gm_item_create
                  it_261move  TYPE STANDARD TABLE bapi2017_gm_item_create
                 CHANGING o_code TYPE char1
                          o_desc TYPE char100
                          o_output LIKE gt_output.

  DATA: v_len      TYPE i,
        v_line     TYPE i,
        l_tabix    TYPE i,
        v_mblnr    TYPE bapi2017_gm_head_ret-mat_doc,
        v_myear    TYPE bapi2017_gm_head_ret-doc_year,
        wk_code    TYPE bapi2017_gm_code,
        wk_head    TYPE bapi2017_gm_head_01,
        wk_numb    TYPE bapi2017_gm_serialnumber,
        it_numb    TYPE STANDARD TABLE OF bapi2017_gm_serialnumber,
        wk_261move TYPE bapi2017_gm_item_create,
        wk_retue   TYPE bapiret1,
        wk_retun   TYPE bapiret2,
        it_retun   TYPE STANDARD TABLE OF bapiret2.

  DATA: wk_afko     TYPE afko,
        it_afko     TYPE STANDARD TABLE OF afko,
        wk_afvv     TYPE afvv,
        it_afvv     TYPE STANDARD TABLE OF afvv,
        wk_crhd     TYPE crhd,
        it_crhd     TYPE STANDARD TABLE OF crhd,
        wk_tick     TYPE bapi_pp_timeticket,
        it_tick     TYPE STANDARD TABLE OF bapi_pp_timeticket,
        wk_move     TYPE bapi2017_gm_item_create,
        it_move     TYPE STANDARD TABLE OF bapi2017_gm_item_create,
        wk_propose  TYPE bapi_pp_conf_prop,
        wk_linkconf TYPE bapi_link_conf_goodsmov,
        it_linkconf TYPE STANDARD TABLE OF bapi_link_conf_goodsmov,
        wk_detail   TYPE bapi_coru_return,
        it_detail   TYPE STANDARD TABLE OF bapi_coru_return,
        wk_retrn    TYPE bapi_coru_return,
        it_retrn    TYPE STANDARD TABLE OF bapi_coru_return.
  DATA:ls_output TYPE tp_output.



* 获取工单工序信息
  CLEAR it_afko[].
  SELECT aufnr rsnum aufpl
    INTO CORRESPONDING FIELDS OF TABLE it_afko
    FROM afko
    WHERE aufnr = wk_tick_in-orderid. "生产工单号

  CLEAR wk_afko.
  READ TABLE it_afko INTO wk_afko INDEX 1.

*   获取工序信息
  SELECT
    afvc~aplzl,       "订单的通用计数器
    afvc~aufpl,       "订单工序的工艺路线号
    afvc~vornr,       "工序
    afvc~plnfl,       "顺序
    afvc~arbid,
    afvc~aplfl,       "序列(新) 有值
    afvc~steus,
    crhd~arbpl
    FROM afvc
    INNER JOIN crhd ON afvc~arbid = crhd~objid    "   工作中心
    WHERE aufpl = @wk_afko-aufpl
    ORDER BY afvc~vornr
    INTO TABLE @DATA(lt_afvc)
    .
  IF lt_afvc[] IS NOT INITIAL.
    SORT lt_afvc BY vornr ASCENDING.
    CLEAR v_len.
    DESCRIBE TABLE lt_afvc LINES v_len.
*   获取工时信息
    REFRESH it_afvv.
    SELECT  * FROM afvv
      INTO CORRESPONDING FIELDS OF TABLE it_afvv
      FOR ALL ENTRIES IN lt_afvc
      WHERE aufpl = lt_afvc-aufpl
        AND aplzl = lt_afvc-aplzl.

  ENDIF.

* 按工序报工
  CLEAR v_line.
  LOOP AT lt_afvc INTO DATA(ls_afvc).
    v_line = v_line + 1.

    IF lv_flg IS INITIAL.

      CLEAR wk_afvv.
      READ TABLE it_afvv INTO wk_afvv
                         WITH KEY aufpl = ls_afvc-aufpl
                                  aplzl = ls_afvc-aplzl.
      REFRESH it_tick.
*   工序设置
      CLEAR wk_tick.
      wk_tick-orderid = wk_tick_in-orderid. "订单号
      wk_tick-sequence = ls_afvc-aplfl. "序列号
      wk_tick-operation = ls_afvc-vornr. "工序代码
      APPEND wk_tick TO it_tick.

*   更新数量,日期,货物移动标记
      CLEAR wk_propose.
      wk_propose-quantity = 'X'.
      wk_propose-date_and_time = 'X'.
      wk_propose-goodsmovement = 'X'.

*   获取默认报工属性数据
      REFRESH it_move.
      CLEAR wk_move.
      wk_move-orderid = wk_tick_in-orderid.
      wk_move-order_itno = ls_afvc-vornr.
      APPEND wk_move TO it_move.

      CLEAR: wk_retue,it_detail[].
      CALL FUNCTION 'BAPI_PRODORDCONF_GET_TT_PROP'
        EXPORTING
          propose            = wk_propose
        IMPORTING
          return             = wk_retue
        TABLES
          timetickets        = it_tick
          goodsmovements     = it_move
          link_conf_goodsmov = it_linkconf
          detail_return      = it_detail.
*   输出报错信息
      IF wk_retue-type = 'E'.
        o_code = 'E'.
        o_desc = 'SAP WORKREPORT FAIL !'.
        CONCATENATE o_desc 'REASON: ' wk_retue-message INTO o_desc SEPARATED BY space.
        EXIT.
      ENDIF.
      LOOP AT it_detail INTO wk_detail WHERE type IS NOT INITIAL.
        IF wk_detail-type = 'E' OR wk_detail-type = 'A'.
          IF o_desc IS NOT INITIAL.
            CONCATENATE o_desc wk_detail-message INTO o_desc SEPARATED BY space.
          ELSE.
            o_code = 'E'.
            o_desc = 'SAP WORKREPORT FAIL !'.
            CONCATENATE o_desc 'REASON: ' wk_detail-message INTO o_desc SEPARATED BY space.
            EXIT.
          ENDIF.
        ENDIF.
      ENDLOOP.

*   工时数据补充
      LOOP AT it_tick INTO wk_tick.

        wk_tick-plant = wk_tick_in-plant.   "工厂
        IF wk_tick_in-work_cntr+(2) = 'SX' OR wk_tick_in-work_cntr+(2) = 'BZ'.
          wk_tick-work_cntr = wk_tick_in-work_cntr. "工作中心
        ELSE.
          wk_tick-work_cntr = ls_afvc-arbpl. "工作中心
        ENDIF.
        wk_tick-wip_batch = wk_tick_in-wip_batch.   "批号
        wk_tick-dev_reason = wk_tick_in-dev_reason. "差异原因
        wk_tick-postg_date = wk_tick_in-postg_date. "过帐日期
        wk_tick-conf_text = wk_tick_in-conf_text.  "确认文本

        wk_tick-conf_quan_unit = wk_afvv-meinh.
        wk_tick-conf_quan_unit_iso = wk_afvv-meinh.
        wk_tick-conf_acti_unit1 = wk_afvv-vge01. "单位
        wk_tick-conf_acti_unit1_iso = wk_afvv-vge01. "单位
        wk_tick-conf_acti_unit2 = wk_afvv-vge02. "单位
        wk_tick-conf_acti_unit2_iso = wk_afvv-vge02. "单位
        wk_tick-conf_acti_unit3 = wk_afvv-vge03. "单位
        wk_tick-conf_acti_unit3_iso = wk_afvv-vge03. "单位
        wk_tick-conf_acti_unit4 = wk_afvv-vge04. "单位
        wk_tick-conf_acti_unit4_iso = wk_afvv-vge04. "单位
        wk_tick-conf_acti_unit5 = wk_afvv-vge05. "单位
        wk_tick-conf_acti_unit5_iso = wk_afvv-vge05. "单位
        wk_tick-conf_acti_unit6 = wk_afvv-vge06. "单位
        wk_tick-conf_acti_unit6_iso = wk_afvv-vge06. "单位

        IF  wk_afvv-bmsch NE 0.
          IF wk_tick-conf_acti_unit1 NE 'S'.
            wk_tick-conf_activity1 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw01 / wk_afvv-bmsch.
          ELSE.
            wk_tick-conf_activity1 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw01 DIV wk_afvv-bmsch.
          ENDIF.

          IF wk_tick-conf_acti_unit2 NE 'S'.
            wk_tick-conf_activity2 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw02 / wk_afvv-bmsch.
          ELSE.
            wk_tick-conf_activity2 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw02 DIV wk_afvv-bmsch.
          ENDIF.

          IF wk_tick-conf_acti_unit3 NE 'S'.
            wk_tick-conf_activity3 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw03 / wk_afvv-bmsch.
          ELSE.
            wk_tick-conf_activity3 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw03 DIV wk_afvv-bmsch.
          ENDIF.

          IF wk_tick-conf_acti_unit4 NE 'S'.
            wk_tick-conf_activity4 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw04 / wk_afvv-bmsch.
          ELSE.
            wk_tick-conf_activity4 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw04 DIV wk_afvv-bmsch.
          ENDIF.

          IF wk_tick-conf_acti_unit5 NE 'S'.
            wk_tick-conf_activity5 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw05 / wk_afvv-bmsch.
          ELSE.
            wk_tick-conf_activity5 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw05 DIV wk_afvv-bmsch.
          ENDIF.

          IF wk_tick-conf_acti_unit6 NE 'S'.
            wk_tick-conf_activity6 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw06 / wk_afvv-bmsch.
          ELSE.
            wk_tick-conf_activity6 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw06 DIV wk_afvv-bmsch.
          ENDIF.
        ENDIF.
        MODIFY it_tick FROM wk_tick TRANSPORTING plant work_cntr wip_batch dev_reason postg_date scrap conf_text
                                                 yield conf_quan_unit conf_quan_unit_iso
                                                 conf_activity1 conf_activity2 conf_activity3 conf_activity4 conf_activity5 conf_activity6
                                                 conf_acti_unit1 conf_acti_unit2 conf_acti_unit3 conf_acti_unit4 conf_acti_unit5 conf_acti_unit6.
      ENDLOOP.


      IF o_code <> 'E'.

        REFRESH it_move.
        REFRESH  it_linkconf.
        IF v_line = 1.
*     反冲物料做发料操作
          LOOP AT it_261move INTO wk_261move.
*       261收货数据设置
            wk_move-material = wk_261move-material. "物料
            wk_move-plant = wk_261move-plant. "工厂
            wk_move-stge_loc = wk_261move-stge_loc."存储位置
            wk_move-batch = wk_261move-batch."批次
            wk_move-move_type = wk_261move-move_type. "移动类型
            wk_move-orderid = wk_261move-orderid.
            wk_move-order_itno = ''.
*         WK_MOVE-ORDER_ITNO = WK_261MOVE-ORDER_ITNO.
            wk_move-sales_ord = wk_261move-val_sales_ord.
            wk_move-s_ord_item = wk_261move-val_s_ord_item.
            wk_move-val_sales_ord = wk_261move-val_sales_ord.   "销售订单
            wk_move-val_s_ord_item = wk_261move-val_s_ord_item. "销售订单行
*        IF  WK_MOVE-SALES_ORD IS NOT INITIAL.
*          WK_MOVE-SPEC_STOCK =  WK_261MOVE-SPEC_STOCK. "特殊库存标识
*        ENDIF.
            wk_move-spec_stock =  wk_261move-spec_stock. "特殊库存标识

            wk_move-entry_qnt = wk_261move-entry_qnt. "数量
            wk_move-entry_uom = wk_261move-entry_uom. "数量单位
*         WK_MOVE-ENTRY_UOM_ISO = WK_101MOVE-ENTRY_UOM_ISO. "数量单位
*            WK_MOVE-MVT_IND = 'F'."生产收货标识
            APPEND wk_move TO it_move.

            wk_linkconf-index_goodsmov = sy-tabix.
            wk_linkconf-index_confirm = 1.
            APPEND wk_linkconf TO it_linkconf.
          ENDLOOP.
        ENDIF.
*   判断是否最后一道工序并且存在101收货明细行
        IF v_line = v_len AND wk_101move IS NOT INITIAL.

*     控制码是PP03自动收货,否,手工收货
          IF ls_afvc-steus <> 'PP03'.
            IF v_len ne 1.
*       设置不自动收货
              REFRESH  it_linkconf.
              wk_linkconf-index_goodsmov = 0.
              APPEND wk_linkconf TO it_linkconf.
            ENDIF.
          ELSE.
            CLEAR l_tabix.
            DESCRIBE TABLE it_linkconf LINES l_tabix.

            wk_linkconf-index_goodsmov = l_tabix + 1.
            wk_linkconf-index_confirm = 1.
            APPEND wk_linkconf TO it_linkconf.
*       收货数据设置
            wk_move-material = wk_101move-material. "物料
            wk_move-plant = wk_101move-plant. "工厂
            wk_move-stge_loc = wk_101move-stge_loc."存储位置
            wk_move-batch = wk_101move-batch."批次
            wk_move-move_type = wk_101move-move_type. "移动类型
            wk_move-orderid = wk_101move-orderid.
            wk_move-order_itno = ''.
            wk_move-entry_qnt = wk_101move-entry_qnt. "数量
            wk_move-entry_uom = wk_101move-entry_uom. "数量单位
*         WK_MOVE-ENTRY_UOM_ISO = WK_101MOVE-ENTRY_UOM_ISO. "数量单位
            wk_move-mvt_ind = 'F'."生产收货标识
            APPEND wk_move TO it_move.
          ENDIF.
        ENDIF.

*   报工
        CLEAR wk_retue.
        CALL FUNCTION 'BAPI_PRODORDCONF_CREATE_TT'
          EXPORTING
            testrun            = ''
            post_wrong_entries = '2'
          IMPORTING
            return             = wk_retue
          TABLES
            timetickets        = it_tick
            goodsmovements     = it_move
            link_conf_goodsmov = it_linkconf
            detail_return      = it_retrn.

        READ TABLE it_tick INTO wk_tick INDEX 1.

        CLEAR wk_retrn.
        READ TABLE it_retrn INTO wk_retrn WITH KEY type = 'E'.
        IF sy-subrc = 0.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
          o_code = 'E'.
          o_desc = 'SAP WorkReport Fail !'.
          CONCATENATE o_desc 'Reason: ' wk_retrn-message INTO o_desc SEPARATED BY space.
          EXIT.
        ELSE.
          "DATA:lv_task TYPE char14.
          "CONCATENATE sy-datum sy-uzeit INTO lv_task.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' "STARTING NEW TASK lv_task
            EXPORTING
              wait = 'X'.
          o_code = 'S'.
          o_desc = 'SAP WorkReport Success!'.

          LOOP AT it_retrn INTO wk_retrn.
            "输出数据结构设置
            CLEAR ls_output.
            ls_output-werks = wk_tick-plant.
            ls_output-mesaufnr = ''.
            ls_output-aufnr = wk_tick-orderid.
            ls_output-rmzhl = ''.
            ls_output-operation = wk_tick-operation.
            ls_output-conf_no = wk_retrn-conf_no.
            ls_output-conf_cnt = wk_retrn-conf_cnt.
            APPEND ls_output TO o_output.
          ENDLOOP.

          WAIT UP TO 2 SECONDS.

        ENDIF.
        CLEAR wk_tick.
      ENDIF.

    ENDIF.

*   101手工收货
    IF lv_flg1 IS INITIAL.
      IF v_line = v_len AND wk_101move IS NOT INITIAL AND ls_afvc-steus <> 'PP03'.
*    IF V_LINE = V_LEN AND WK_101MOVE IS NOT INITIAL AND O_CODE <> 'E'.
*     收货数据设置
        REFRESH it_move.
        wk_move-material = wk_101move-material. "物料
        wk_move-plant = wk_101move-plant. "工厂
        wk_move-stge_loc = wk_101move-stge_loc."存储位置
        wk_move-move_type = '101'. "移动类型
        wk_move-orderid = wk_101move-orderid.
        wk_move-order_itno = ''.
        wk_move-entry_qnt = wk_101move-entry_qnt. "数量
        wk_move-entry_uom = wk_101move-entry_uom. "数量单位
        wk_move-entry_uom_iso = wk_101move-entry_uom_iso. "数量单位
        wk_move-batch = wk_101move-batch. "批次
        wk_move-mvt_ind = 'F'."生产收货标识
        APPEND wk_move TO it_move.
        CLEAR: wk_head,wk_code.
        wk_head-doc_date = sy-datum.  "凭证日期
        wk_head-pstng_date = wk_tick_in-postg_date."过账日期
        wk_head-pr_uname = sy-uname."创建用户
        wk_code-gm_code = '02'.

        CLEAR: v_mblnr,v_myear.
        CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
          EXPORTING
            goodsmvt_header       = wk_head
            goodsmvt_code         = wk_code
          IMPORTING
            materialdocument      = v_mblnr
            matdocumentyear       = v_myear
          TABLES
            goodsmvt_item         = it_move
            goodsmvt_serialnumber = it_numb
            return                = it_retun.

        CLEAR wk_retun.
        READ TABLE it_retun INTO wk_retun WITH KEY type = 'E'.
        IF sy-subrc = 0.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
          o_code = 'E'.
          o_desc = 'SAP 101 Goods Issue Fail !'.
          CONCATENATE o_desc 'Reason: ' wk_retun-message INTO o_desc SEPARATED BY space.
        ELSE.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.
          o_code = 'S'.
          o_desc = '101 Goods Issue Success !'.
          CLEAR ls_output.
          ls_output-aufnr = wk_101move-orderid.
          ls_output-mblnr = v_mblnr.
          ls_output-bwart = '101'.
          APPEND ls_output TO o_output.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.
  CLEAR lt_afvc.

ENDFORM.
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值