ABAP:创建生产订单及组件及工序

逻辑顺序  创建生产订单->添加组件->添加工序(工序和组件顺序千万不能乱  如果乱了可能导致组件写不进去)

 DATA: ls_orderdata TYPE bapi_pp_order_create. "BAPI传入参数
  DATA: ls_return TYPE bapiret2.
  DATA: lv_aufnr TYPE afko-aufnr,
        lv_arbpl TYPE crhd-arbpl,
        lv_steus TYPE afvc-steus,
        lv_vornr TYPE resb-vornr.
  DATA:lv_aufpl LIKE afvc-aufpl.
  DATA:lv_aplzl LIKE afvc-aplzl.

  DATA:is_order_key         TYPE coxt_ord_key,
       i_material           TYPE coxt_material,
       is_storage_location  TYPE coxt_s_storage_location,
       is_storage_locationx TYPE coxt_s_storage_locationx,
       is_requ_quan         TYPE coxt_s_quantity,
       i_operation          TYPE afvc-aplzl,
       lv_posno             TYPE cif_r3res-positionno,
       gs_return            TYPE coxt_bapireturn,
       lv_error             TYPE c.

  LOOP AT it_output INTO wa_output GROUP BY ( zsign = wa_output-zsign ) ASSIGNING FIELD-SYMBOL(<fs_group>).

    CLEAR:lv_aufnr,lv_posno.
    LOOP AT GROUP <fs_group> ASSIGNING FIELD-SYMBOL(<ls_group>).
      IF lv_aufnr IS INITIAL.
*        先创建生产订单
        CLEAR:ls_orderdata.
        ls_orderdata-order_type       = <ls_group>-auart."订单类型
        ls_orderdata-plant            = <ls_group>-werks."工厂
        ls_orderdata-material         = <ls_group>-plnbez.
        ls_orderdata-basic_start_date = <ls_group>-gstrp.
        ls_orderdata-basic_end_date   = <ls_group>-gltrp.
        ls_orderdata-quantity         = <ls_group>-gamng.
*        IF <ls_group>-lgort IS NOT INITIAL.
*          ls_orderdata-storage_location = <ls_group>-lgort.
*        ENDIF.

        CALL FUNCTION 'BAPI_PRODORD_CREATE'
          EXPORTING
            orderdata    = ls_orderdata
          IMPORTING
            return       = ls_return
            order_number = lv_aufnr.

        IF ls_return-type CA 'EAX' OR lv_aufnr  IS INITIAL.

          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
          CLEAR:ls_output.
          ls_output-msg = ls_return-message.
          ls_output-icon = icon_red_light.
          MODIFY it_output FROM ls_output TRANSPORTING icon msg WHERE zsign = <fs_group>-zsign .
          EXIT.
        ELSE.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.
          WAIT UP TO 1 SECONDS.
          CLEAR:lv_arbpl, lv_steus,lv_vornr.
          lv_arbpl = <ls_group>-arbpl.
          lv_steus = <ls_group>-steus.
          lv_vornr = <ls_group>-vornr.
        ENDIF.
      ENDIF.

      IF lv_aufnr IS NOT INITIAL .

        lv_posno = lv_posno + 10.
*     根据生产订单创建组件
        CLEAR:is_requ_quan.
        is_requ_quan-quantity = <ls_group>-bdmng.
        SELECT SINGLE meins INTO is_requ_quan-uom FROM mara WHERE matnr = <ls_group>-matnr.

        CLEAR: is_storage_location,is_storage_locationx.
        is_storage_location-werks = <ls_group>-werks.
        is_storage_locationx-werks =  'X'.

        IF <ls_group>-lgort IS NOT INITIAL.
          is_storage_location-lgort = <ls_group>-lgort.
          is_storage_locationx-lgort =  'X'.
        ENDIF.
        CLEAR: lv_aufpl,lv_aplzl.
        SELECT SINGLE aufpl INTO lv_aufpl FROM afko WHERE aufnr = lv_aufnr.
        SELECT SINGLE aplzl INTO lv_aplzl FROM afvc WHERE aufpl = lv_aufpl.
        CALL FUNCTION 'CO_XT_COMPONENT_ADD'
          EXPORTING
            is_order_key         = lv_aufnr
            i_material           = <ls_group>-matnr
            is_requ_quan         = is_requ_quan
            i_operation          = lv_aplzl
            is_storage_location  = is_storage_location
            is_storage_locationx = is_storage_locationx
            i_postp              = <ls_group>-postp
            i_posno              = '000000'
          IMPORTING
            es_bapireturn        = gs_return
            e_error_occurred     = lv_error.
        "修复序号问题
        ASSIGN ('(SAPLCOBC)RESB_BT[]') TO <ft_resb_bt>.
        IF <ft_resb_bt> IS ASSIGNED.
          LOOP AT <ft_resb_bt> ASSIGNING <fs_resb_bt>.
            DATA(lv_numc) = sy-tabix * 10.
            ASSIGN COMPONENT 'POSNR' OF STRUCTURE <fs_resb_bt> TO FIELD-SYMBOL(<fs>).
            IF sy-subrc = 0.
              " <fs_resb_bt>-posnr = lv_numc.
              <fs> = lv_numc.
              "添加前导零
              CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
                EXPORTING
                  input  = <fs>
                IMPORTING
                  output = <fs>.

            ENDIF.
            CLEAR lv_numc.
          ENDLOOP.
        ENDIF.


        IF lv_error IS INITIAL.
          CALL FUNCTION 'ZCO_XT_ORDER_PREPARE_COMMIT' "接口不弹出对话框
            IMPORTING
              es_bapireturn    = gs_return
              e_error_occurred = lv_error.

          IF gs_return-type = 'E'.
            CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
            CLEAR:ls_output.
            ls_output-msg = gs_return-message.
            ls_output-icon = icon_red_light.
            MODIFY it_output FROM ls_output TRANSPORTING icon msg WHERE zsign = <fs_group>-zsign .
*            失败需要将生产订单关闭
            PERFORM frm_close_order USING lv_aufnr.
            EXIT.
          ELSE.
            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
              EXPORTING
                wait = 'X'.

            CALL FUNCTION 'CO_XT_ORDER_INITIALIZE'.

*            WAIT UP TO '0.5' SECONDS.
          ENDIF.
        ENDIF.
*        创建组件之前需要先修改工序中的工作重心及控制码
*        IF lv_arbpl IS NOT INITIAL AND lv_vornr IS NOT INITIAL .
*          PERFORM frm_change_process  USING lv_aufnr  lv_arbpl lv_steus lv_vornr CHANGING ls_return.
*          CLEAR:lv_arbpl, lv_steus,lv_vornr.
**          返回消息
*          IF ls_return-type = 'E'.
*            CLEAR:ls_output.
*            ls_output-msg = ls_return-message.
*            ls_output-icon = icon_red_light.
*            MODIFY it_output FROM ls_output TRANSPORTING icon msg WHERE zsign = <fs_group>-zsign .
**            失败需要将生产订单关闭
*            PERFORM frm_close_order USING lv_aufnr.
*            EXIT.
*          ELSE.
*            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
*              EXPORTING
*                wait = 'X'.
*            WAIT UP TO 1 SECONDS.
*          ENDIF.
*        ENDIF.
        CLEAR:ls_output.
        ls_output-msg = '成功'.
        ls_output-icon = icon_green_light.
        ls_output-aufnr = lv_aufnr.
        MODIFY it_output FROM ls_output TRANSPORTING icon msg aufnr WHERE zsign = <fs_group>-zsign .
      ENDIF.
    ENDLOOP.
  ENDLOOP.
  DATA(lt_output) = it_output.
  SORT lt_output BY zsign plnbez.
  DELETE ADJACENT DUPLICATES FROM lt_output COMPARING zsign plnbez.
  LOOP AT lt_output INTO wa_output.
    IF wa_output-icon = icon_green_light.
*        创建组件之后需要先修改工序中的工作重心及控制码(如果放在创建组件之前  组件创建不进去   所有可能会有冲突?原因未知)
      PERFORM frm_change_process  USING wa_output-aufnr  wa_output-arbpl wa_output-steus wa_output-vornr CHANGING ls_return.
      CLEAR:lv_arbpl, lv_steus,lv_vornr.
*          返回消息
      IF ls_return-type = 'E'.
        CLEAR:ls_output.
        ls_output-msg = ls_return-message.
        ls_output-icon = icon_red_light.
        ls_output-aufnr = ''.
        MODIFY it_output FROM ls_output TRANSPORTING icon msg aufnr WHERE zsign = wa_output-zsign .
*            失败需要将生产订单关闭
        PERFORM frm_close_order USING wa_output-aufnr.
        EXIT.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDFORM.

FORM frm_change_process  USING    lv_aufnr
                                   lv_arbpl
                                   lv_steus
                                   lv_vornr
                          CHANGING ls_return TYPE bapiret2.



  DATA:lt_operation TYPE cose_t_operation,
       ls_operation LIKE LINE OF lt_operation.

  ls_operation-operation = lv_vornr."0010 工序修改
  ls_operation-control_key = lv_steus."控制码
  ls_operation-work_center = lv_arbpl."工作中心
  ls_operation-work_center_x = 'X'.
*ls_operation-short_text = '测试工序短文本'."短文本
*ls_operation-short_text_x = 'X'.

  APPEND ls_operation TO lt_operation.

  CALL FUNCTION 'CO_SE_PRODORD_CHANGE'
    EXPORTING
      iv_order_number = lv_aufnr
*     IS_HEADER       =
*     IT_HDR_USER_STATUS       =
*     IT_SEQUENCE     =
      it_operation    = lt_operation
*     IT_OPR_USER_STATUS       =
*     IT_PRT          =
*     IV_COMMIT       =
    IMPORTING
      es_return       = ls_return.

  IF ls_return-type = 'E'.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.

  ENDIF.

ENDFORM.

FORM frm_close_order  USING    lv_aufnr.
  DATA:ls_return       TYPE bapiret2,
       lt_order        TYPE TABLE OF bapi_order_key WITH HEADER LINE,
       lt_order_return TYPE TABLE OF bapi_order_return WITH HEADER LINE.
  CLEAR:lt_order.
  lt_order-order_number = lv_aufnr.
  APPEND  lt_order.
  CALL FUNCTION 'BAPI_PRODORD_COMPLETE_TECH'
    IMPORTING
      return        = ls_return
    TABLES
      orders        = lt_order
      detail_return = lt_order_return.
  IF ls_return-type = 'E'.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
  ENDIF.

ENDFORM.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值