工艺路线-BOM组件分配修改

 FORM f_routine_change .
  DATA:l_line TYPE i.
  DATA:
    lv_meins  TYPE mara-meins,
    lv_maktx  TYPE makt-maktx,
    lv_type   TYPE char1,
    lv_msg    TYPE char100,
    ls_input  TYPE ty_data,
    lt_return TYPE STANDARD TABLE OF bapiret2,
    ls_return TYPE bapiret2.

  DATA: ls_operations  TYPE  cps_task_list_maint_opr,
        lt_operations  TYPE  TABLE OF cps_task_list_maint_opr,
        ls_operationsx TYPE  cps_task_list_maint_opr_x,
        lt_operationsx TYPE  TABLE OF cps_task_list_maint_opr_x,

        lt_comp        TYPE TABLE OF   cps_task_list_maint_com,
        ls_comp        TYPE  cps_task_list_maint_com,
        ls_compx       TYPE  cps_task_list_maint_com_x,
        lt_compx       TYPE TABLE OF   cps_task_list_maint_com_x.

  DATA:ls_topmat TYPE cstmat,
       lt_stpox  TYPE TABLE OF stpox,
       lt_matcat TYPE TABLE OF cscmat.


  READ TABLE gt_data INTO DATA(ls_data) WITH KEY msgty = 'E'.
  IF sy-subrc = 0.
    MESSAGE  s001(zpublic) WITH TEXT-m17 DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.

  SORT gt_data BY matnr werks plnal vornr.
  SELECT  a~matnr,
          a~meins,
          b~maktx
    FROM mara  AS a
    LEFT OUTER JOIN makt AS b ON a~matnr = b~matnr AND
                                 b~spras = @sy-langu
    FOR ALL ENTRIES IN @gt_data
    WHERE a~matnr = @gt_data-matnr
    INTO TABLE @DATA(lt_mara).

  BREAK con-huangjm.
  LOOP AT gt_data INTO ls_data.
    ls_input = ls_data.
    ls_input-vornr = |{ ls_input-vornr ALPHA = IN }|.
    CALL FUNCTION 'CONVERSION_EXIT_NUMCV_INPUT'
      EXPORTING
        input  = ls_input-posnr
      IMPORTING
        output = ls_input-posnr.

    l_line = l_line + 1.
    DATA(l_tabix) = sy-tabix.
    AT NEW plnal.
      READ TABLE gt_data INTO DATA(lw_input) INDEX l_tabix.
      "取工序的更新状态

      SELECT a~plnnr,plnal,vornr
             FROM plpo AS a
             INNER JOIN plas AS b
                 ON  a~plnnr = b~plnnr
                 AND a~plnty = b~plnty
                 AND a~plnkn = b~plnkn
                 AND a~zaehl = b~zaehl
                WHERE   a~plnnr = @lw_input-plnnr
           AND b~plnal = @lw_input-plnal
*             and a~plnty = @lw_input-plnty
"  and a~zaehl = :iv_zaehl
             AND b~loekz = ''
          INTO TABLE @DATA(lt_vornr).

      CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
        EXPORTING
          capid                 = 'PP01'    "Application ID
          datuv                 = sy-datum    "Validity date
*         emeng                 =     "Required quantity
          auskz                 = 'X' "scrap
          aufsw                 = 'X' "scrap
*         ALEKZ                 = lw_input-LOEKZ
          mehrs                 = 'X'  "Multi-level explosion
          mtnrv                 = lw_input-matnr "Material
          stlal                 = lw_input-stlal     "Alternative BOM
          stlan                 = lw_input-stlan     "BOM usage
          werks                 = lw_input-werks     "Plant
          mmory                 = '1'               " 是否使用缓存
          mdmps                 = 'X'  " 虚拟件标识
*         cuobj                 = lv_cuobj
        IMPORTING
          topmat                = ls_topmat
        TABLES
          stb                   = lt_stpox
          matcat                = lt_matcat
        EXCEPTIONS
          alt_not_found         = 1
          call_invalid          = 2
          material_not_found    = 3
          missing_authorization = 4
          no_bom_found          = 5
          no_plant_data         = 6
          no_suitable_bom_found = 7
          conversion_error      = 8
          OTHERS                = 9.

      SELECT a~zuonr,
             a~zaehl,
             a~plnnr,
             a~plnal,
             a~stlal,
             a~stlkn,
             b~vornr
        FROM plmz AS a
        INNER JOIN plpo AS b ON b~plnnr = a~plnnr AND b~plnkn = a~plnkn
        WHERE a~plnnr EQ @lw_input-plnnr
         AND  a~plnal EQ @lw_input-plnal
*         AND  a~STLNR     eq @lw_input-STLNR
*         AND  a~STLAL     eq @lw_input-STLAL
         AND  a~loekz NE 'X'
        INTO TABLE @DATA(lt_plmz).
    ENDAT.

    AT END OF vornr.
      READ TABLE lt_vornr INTO DATA(ls_vornr) WITH KEY plnnr = ls_input-plnnr plnal = ls_input-plnal vornr = ls_input-vornr.
      IF sy-subrc = 0.
        ls_operations-maintain_mode = 'M'.
        ls_operations-activity      = ls_input-vornr.
        ls_operations-activity_old  = ls_input-vornr.
*        ls_operations-flag_bar_pointer  = l_tabix + 1000000000.
        ls_operations-flag_bar_pointer  = '0000000001'.
        DELETE lt_vornr INDEX sy-tabix.
      ELSE.
        "新增工序
        ls_operations-maintain_mode = 'C'.
        ls_operations-activity      = ls_input-vornr.
        ls_operations-activity_old  = ls_input-vornr.
      ENDIF.
*      ls_operations-description  = ls_input-ltxa1.
      APPEND  ls_operations TO lt_operations.
      ls_operationsx-activity      = 'X'.
*      ls_operationsx-description   = 'X'.
      APPEND  ls_operationsx TO lt_operationsx.
    ENDAT.
    BREAK con-huangjm.
    CALL FUNCTION 'CONVERSION_EXIT_MATN5_INPUT'
      EXPORTING
        input        = ls_input-idnrk
      IMPORTING
        output       = ls_input-idnrk
      EXCEPTIONS
        length_error = 1
        OTHERS       = 2.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.


    LOOP AT lt_stpox INTO DATA(ls_stpox) WHERE   posnr = ls_input-posnr AND idnrk = ls_input-idnrk.
      READ TABLE lt_plmz INTO DATA(ls_plmz) WITH KEY plnnr = ls_input-plnnr
                                                         plnal = ls_input-plnal
                                                         stlal = ls_input-stlal
                                                         stlkn = ls_stpox-stvkn.
      IF sy-subrc EQ 0.
        IF ls_input-zdel IS NOT INITIAL.
          ls_comp-maintain_mode = 'D'.                "操作模式:C:创建,M:修改,D:删除   PS:如未分配(PLMZ表没数据)则选择C模式
          ls_comp-flag_bar_pointer  = '0000000001'.    "操作模式序号,如不分配则报错

          ls_comp-activity = ls_plmz-vornr.                  "操作/活动编号
          ls_comp-activity_old = ls_plmz-vornr.              "旧操作/活动编号  PS:如果是M模式则需要获取原编号,否则报错
          READ TABLE lt_operations TRANSPORTING NO FIELDS  WITH KEY activity = ls_plmz-vornr.
          IF sy-subrc NE 0.
            ls_operations-maintain_mode = 'M'.
            ls_operations-activity      = ls_plmz-vornr.
            ls_operations-activity_old  = ls_plmz-vornr.
*        ls_operations-flag_bar_pointer  = l_tabix + 1000000000.
            ls_operations-flag_bar_pointer  = '0000000001'.
            APPEND  ls_operations TO lt_operations.
            ls_operationsx-activity      = 'X'.
            APPEND  ls_operationsx TO lt_operationsx.
          ENDIF.
        ELSE.
          ls_comp-maintain_mode = 'M'.                "操作模式:C:创建,M:修改,D:删除   PS:如未分配(PLMZ表没数据)则选择C模式
          ls_comp-flag_bar_pointer  = '0000000001'.    "操作模式序号,如不分配则报错

          ls_comp-activity = ls_input-vornr.                  "操作/活动编号
          ls_comp-activity_old = ls_plmz-vornr.              "旧操作/活动编号  PS:如果是M模式则需要获取原编号,否则报错
          READ TABLE lt_operations TRANSPORTING NO FIELDS  WITH KEY activity = ls_plmz-vornr.
          IF sy-subrc NE 0.
            ls_operations-maintain_mode = 'M'.
            ls_operations-activity      = ls_plmz-vornr.
            ls_operations-activity_old  = ls_plmz-vornr.
*        ls_operations-flag_bar_pointer  = l_tabix + 1000000000.
            ls_operations-flag_bar_pointer  = '0000000001'.
            APPEND  ls_operations TO lt_operations.
            ls_operationsx-activity      = 'X'.
            APPEND  ls_operationsx TO lt_operationsx.
          ENDIF.

        ENDIF.

      ELSE.
        IF ls_input-zdel IS INITIAL..

          ls_comp-maintain_mode = 'C'.                "操作模式:C:创建,M:修改,D:删除   PS:如未分配(PLMZ表没数据)则选择C模式
          ls_comp-flag_bar_pointer  = '0000000001'.    "操作模式序号,如不分配则报错

          ls_comp-activity = ls_input-vornr.                  "操作/活动编号
          ls_comp-activity_old = ls_input-vornr.              "旧操作/活动编号  PS:如果是M模式则需要获取原编号,否则报错
        ENDIF.

      ENDIF.


      ls_comp-alternative_bom = ls_stpox-stlal .             "备选物料清单  ”stlal
      ls_comp-bom_type = ls_stpox-stlty.                     "BOM类型  stlty
*      ls_comp-material = ls_input-MATNR.           " 物料号  idnrk
      ls_comp-item_no = ls_stpox-posnr.                   "BOM项目号
*      ls_comp-item_id = ls_stpox-stlkn.               "项目ID  stlkn BOM 项目节点号
      ls_comp-item_id = ls_stpox-stvkn.               "项目ID  stlkn BOM 项目节点号
      ls_comp-bom_no = ls_stpox-stlnr.                "物料清单 stlnr

      ls_comp-sequence_no = '000000'.             "排序号
      ls_comp-sequence_no_old = '000000'.         "旧排序号
      IF ls_stpox-stlty_w IS INITIAL.
        ls_comp-bom_type_root = ls_stpox-stlty.                "父件BOM类型
        ls_comp-bom_no_root = ls_stpox-stlnr.           "父件物料清单
        ls_comp-alternative_bom_root = ls_stpox-stlal .        "父件备选物料清单
        ls_comp-path = ls_stpox-aufwg.                  "路径,仅虚拟件使用;如果有多层,建议通过BAPI:CS_BOM_EXPL_MAT_V2获取

      ENDIF.
      ls_comp-plant = ls_input-werks.                     "工厂
*     comp_qty  menge
*     comp_unit meins

      IF ls_stpox-dumps NE '' .
        ls_comp-order_lvl = ls_stpox-aufst.                   "层次,仅虚拟件使用;如果有多层,建议通过BAPI:CS_BOM_EXPL_MAT_V2获取
        ls_comp-order_path = ls_stpox-aufwg.                  "路径,仅虚拟件使用;如果有多层,建议通过BAPI:CS_BOM_EXPL_MAT_V2获取
      ENDIF.
      APPEND ls_comp TO lt_comp.
      CLEAR ls_comp.


      ls_compx-activity = abap_true.
      ls_compx-plant = abap_true.
      ls_compx-material = abap_true.
*    ls_compx-alternative_bom = abap_true.
*     ls_compx-bom_no = abap_true.
*    ls_compx-item_no = abap_true.
*    ls_compx-sequence_no_old = abap_true.
      ls_compx-sequence_no = abap_true.
*    ls_compx-maintain_mode = abap_true.
*    ls_compx-flag_bar_pointer = abap_true.
      ls_compx-activity = abap_true.
      ls_compx-bom_type_root = abap_true.
      ls_compx-bom_no_root = abap_true.
      ls_compx-alternative_bom_root = abap_true.
      ls_compx-order_lvl = abap_true.
      ls_compx-order_path = abap_true.
*    ls_compx-activity_old = abap_true.
      APPEND ls_compx TO lt_compx.
      CLEAR ls_compx.
    ENDLOOP.


    AT END OF plnal.
      READ TABLE gt_data INTO DATA(lw_input2) INDEX l_tabix.
      BREAK con-huangjm.

      CALL FUNCTION 'CPCC_S_TASK_LIST_MAINTAIN'
        EXPORTING
          application             = 'PP01'
          bom_usage               = '1' " stlan
          change_no               = ''
          key_date                = sy-datum
          task_list_type          = 'N'
          task_list_group         = ls_input-plnnr
          group_counter           = ls_input-plnal
          material                = ls_input-matnr
          plant                   = ls_input-werks
          task_maintain_mode      = 'M'
        TABLES
          operations              = lt_operations
          operations_x            = lt_operationsx
          component_allocations   = lt_comp
          component_allocations_x = lt_compx
          return                  = lt_return.
      BREAK con-huangjm.
      LOOP AT lt_return INTO ls_return WHERE type CA 'AEX' .
        lv_type = 'E'.
        CONCATENATE lv_msg '|'  ls_return-message INTO lv_msg.
      ENDLOOP.

      IF  lv_type NE 'E'.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
      ENDIF.

      LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<fs_data>) WHERE matnr = ls_input-matnr
                                                          AND werks = ls_input-werks
                                                             AND plnal = ls_input-plnal
                                                          .
        IF lv_type NE 'E'.
          <fs_data>-stats = '@08@'.
          <fs_data>-msgty = 'S'.
          <fs_data>-msg   = TEXT-m18.
        ELSE.
          <fs_data>-stats = '@0A@'.
          <fs_data>-msgty = 'E'.
          <fs_data>-msg   = lv_msg+1.
        ENDIF.
      ENDLOOP.

      CLEAR  :ls_operations,ls_operationsx,ls_return,ls_comp,ls_compx,lv_type,lv_msg.
      REFRESH :lt_operations,lt_operationsx,lt_return,lt_comp,lt_compx .
    ENDAT.



  ENDLOOP.

ENDFORM.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值