ABAP:批量修改工艺路线

可以批量修改工艺路线,但是只能修改:工作中心和人工、机器、其他、雇员数,同时这些都不能是空值,不需要修改的可以把原来的值放进去,这报表有一些限制。

 导入模板:

 

TABLES:sscrfields.
DATA: gt_fieldcatalog TYPE lvc_t_fcat,
      gw_fieldcatalog TYPE lvc_s_fcat,
      gt_ddval        TYPE lvc_t_drop,        "定义存储下拉列表的数据
      gw_ddval        TYPE lvc_s_drop,
      gt_sort         TYPE lvc_t_sort,
      gw_sort         TYPE lvc_s_sort,
      gt_events       TYPE slis_t_event,
      gw_events       TYPE slis_alv_event,
      gw_layout       TYPE lvc_s_layo,
      gt_exclude      TYPE slis_t_extab,
      g_repid         TYPE sy-repid VALUE sy-repid,
      gw_grid_setting TYPE lvc_s_glay,
      g_ref_grid      TYPE REF TO cl_gui_alv_grid.
DATA: BEGIN OF it_data OCCURS 0,
"PLPOD,任务清单工序和网络作业的I/O表
"PLKOD,任务清单表头的I/O表
  aennr   TYPE plko-aennr, "变更编号
  matnr   TYPE    matnr,"物料编码
  werks   TYPE    werks,"工厂
  plnnr   TYPE    plnnr,"组
  plnal   TYPE    plnal,"组计数器
  vornr   LIKE    plpo-vornr, "工序序号
*  verwe   TYPE    plkod-verwe,"用途
*  statu   TYPE    plnst,"状态
  arbpl   TYPE    plpod-arbpl,"工作中心
  vgw01   TYPE    vgwrt,"人工
  vgw02   TYPE    vgwrt,"机器
  vgw03   TYPE    vgwrt,"其他
  anzma   TYPE    anzms,"雇员数量

  msgty   TYPE msgty,
  msgtx   TYPE msgtx,
  sel     TYPE char1,
  END OF it_data.

  DATA: gt_msg TYPE TABLE OF esp1_message_wa_type,
        gs_msg TYPE  esp1_message_wa_type.

DEFINE  macro_fill_fcat.
  CLEAR gw_fieldcatalog.
    gw_fieldcatalog-fieldname = &1.
    gw_fieldcatalog-coltext = &2.
    gw_fieldcatalog-outputlen = &3.
    gw_fieldcatalog-fix_column = 'X'.
    gw_fieldcatalog-decimals_o = '3'.

  APPEND gw_fieldcatalog TO gt_fieldcatalog.
END-OF-DEFINITION.


SELECTION-SCREEN BEGIN OF BLOCK zpp2  WITH FRAME TITLE TEXT-002 .
  PARAMETERS:p_file TYPE localfile MODIF ID m1 .
SELECTION-SCREEN END OF BLOCK zpp2.

SELECTION-SCREEN FUNCTION KEY 1.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM frm_file_help USING p_file.

INITIALIZATION.
  PERFORM frm_init_data.
  AT SELECTION-SCREEN.
  CASE sscrfields-ucomm.
    WHEN 'FC01'.
      PERFORM frm_down_tempfile.
  ENDCASE.
START-OF-SELECTION.


PERFORM upload_file.
PERFORM plays.
PERFORM show_alv.

FORM frm_file_help  USING u_file.

  u_file = zcl_commtools=>open_dialog( ).

ENDFORM.
FORM frm_init_data .
  DATA:ls_funtxt TYPE smp_dyntxt.
  ls_funtxt-quickinfo = '下载模版1'.
  ls_funtxt-icon_id = icon_xls.
  ls_funtxt-icon_text = '下载模版1'.
  sscrfields-functxt_01 = ls_funtxt.

ENDFORM.
FORM frm_down_tempfile .
  zcl_commtools=>downfile(
        iv_title =  '批量修改工艺路线模板' iv_name = '****' )."这里是下载的模板名称,                                                       "可以在smw0设置
ENDFORM.
*&---------------------------------------------------------------------*
*& Form upload_file
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM upload_file .
  DATA: BEGIN OF iexcel OCCURS 0.
          INCLUDE STRUCTURE alsmex_tabline.
  DATA: END OF iexcel.

  DATA wa_data LIKE LINE OF it_data .
  DATA: l_row TYPE i.

  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_col             = 1
      i_begin_row             = 2
      i_end_col               = 10
      i_end_row               = 1000
    TABLES
      intern                  = iexcel
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.

  SORT iexcel BY row col value.


  LOOP AT iexcel.
    IF l_row <> iexcel-row AND sy-tabix > 1.
      APPEND wa_data TO it_data.
      CLEAR wa_data.
    ENDIF.

    IF iexcel-value = ''.
      CONTINUE.
    ENDIF.

    CASE iexcel-col.

      WHEN 1. wa_data-matnr  = iexcel-value.  "物料编码

      WHEN 2. wa_data-werks  = iexcel-value.   "工厂

      WHEN 3. wa_data-plnnr  = iexcel-value."组

      WHEN 4. wa_data-plnal   = iexcel-value. "组计数器

      WHEN 5. wa_data-vornr    = iexcel-value."工序号

      WHEN 6. wa_data-arbpl    = iexcel-value."工作中心

      WHEN 7. wa_data-vgw01     = iexcel-value."人工

      WHEN 8. wa_data-vgw02    = iexcel-value."机器

      WHEN 9. wa_data-vgw03    = iexcel-value."  其他

      WHEN 10. wa_data-anzma    = iexcel-value."雇员数量

    ENDCASE.


    l_row = iexcel-row.
    CLEAR iexcel.

  ENDLOOP.



  IF sy-subrc = 0.
    APPEND wa_data TO it_data.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form plays
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM plays .
  gw_layout-zebra = 'X'.
  gw_layout-box_fname = 'SEL'.
  gw_layout-cwidth_opt = 'X'.
  gw_layout-info_fname = 'CLR'.
  macro_fill_fcat:
   'MSGTY' '返回状态' '10',
   'MSGTX' '返回信息' '10',
   'AENNR' '变更号' '10',
   'MATNR' '物料编码' '18',
   'WERKS' '工厂'  '4' ,
   'PLNNR' '组' '8',
   'PLNAL ' '组计数器' '8',
   'VORNR' '工序号' '8',
*   'VERWE' '用途' '12',
*   'STATU ' '状态' '12',
   'ARBPL' '工作中心' '12',
   'VGW01' '人工' '8',
   'VGW02' '机器' '8',
   'VGW03' '其他' '8',
   'ANZMA' '雇员数量' '8'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form show_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM show_alv .
  DATA it TYPE p VALUE 1.
  SORT it_data BY matnr  werks  plnnr plnal .
  READ TABLE it_data INTO DATA(iss_data) INDEX 1.

  LOOP AT it_data .
    IF it_data-matnr = iss_data-matnr AND it_data-werks = iss_data-werks
      AND it_data-plnnr = iss_data-plnnr AND it_data-plnal = iss_data-plnal.
      it_data-aennr = it.
      MODIFY it_data.
    ELSE.
      it = it + 1.
      CLEAR iss_data.
      it_data-aennr = it.
      iss_data = it_data.
      MODIFY it_data.
      CLEAR it_data.
    ENDIF.
  ENDLOOP.


  g_repid = sy-repid.
  gw_grid_setting-edt_cll_cb = 'X'.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = sy-repid
      i_callback_pf_status_set = 'SET_STAT'
      i_callback_user_command  = 'USER_COMMAND'

      it_fieldcat_lvc    = gt_fieldcatalog

    TABLES
      t_outtab           = it_data
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM.
FORM set_stat USING rt_extab TYPE slis_t_extab.
  "SET PF-STATUS 'STATUS' EXCLUDING RT_EXTAB .
  SET PF-STATUS 'ZSTATUS' ." EXCLUDING rt_extab."窗体按钮
  ENDFORM.
FORM user_command USING r_ucomm LIKE sy-ucomm "按钮功能
                   rs_selfield TYPE slis_selfield."光标的参数
  DATA:
    ls_layout TYPE lvc_s_layo,
    lv_grid   TYPE REF TO cl_gui_alv_grid.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lv_grid.

  CALL METHOD lv_grid->check_changed_data.
    rs_selfield-refresh = 'X'.
    rs_selfield-col_stable = 'X'.
    rs_selfield-row_stable = 'X'.
    CASE r_ucomm.
      WHEN '&SAVE'.
        PERFORM check_data.
        PERFORM saves.
    ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form saves
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM saves .
DATA:ls_tsk    TYPE cps_task_list_maint_tsk,
       ls_tsk_x  TYPE cps_task_list_maint_tsk_x,
       lt_opr    TYPE cpt_task_list_maint_opr,
       lt_opr_x  TYPE cpt_task_list_maint_opr_x,
       lt_seq    TYPE cpt_task_list_maint_seq,
       lt_seq_x  TYPE cpt_task_list_maint_seq_x,
       lt_return TYPE bapiret2_t,
       ls_return TYPE bapiret2.
  DATA lv_count  TYPE i.
  DATA lv_datuv  TYPE sy-datum.

  IF gt_msg[] IS NOT INITIAL.
        CALL FUNCTION 'C14Z_MESSAGES_SHOW_AS_POPUP'
        TABLES
          i_message_tab = gt_msg[].
        CLEAR:gt_msg[],gs_msg.
        EXIT.
   ENDIF.
LOOP AT it_data.
  DATA(ls_data) = it_data.
  AT NEW aennr.
  "PERFORM frm_change_no_check USING ls_data-aennr CHANGING lv_datuv."时间
  ENDAT.

  PERFORM frm_opr_data TABLES lt_opr lt_opr_x .

  AT END OF aennr.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input         = ls_data-plnal
     IMPORTING
       output        = ls_data-plnal
              .

     CALL FUNCTION 'CPCC_S_TASK_LIST_MAINTAIN'
        EXPORTING
*          change_no          = ls_data-aennr"变更编号
          key_date           = sy-datum"lv_datuv"时间
          task_list_type     = 'N'   "ls_data-plnty"任务清单类型
          task_list_group    = ls_data-plnnr"任务清单类型
          group_counter      = ls_data-plnal"组计数器
          task_maintain_mode = 'M'
        TABLES
          operations         = lt_opr
          operations_x       = lt_opr_x
          return             = lt_return.

      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        input         = ls_data-plnal
     IMPORTING
       output        = ls_data-plnal.

      LOOP AT lt_return INTO ls_return WHERE type CA 'AXE'.
        EXIT.
      ENDLOOP.

      IF sy-subrc NE 0.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = abap_true.
        ls_data-msgty = 'S'.
        ls_data-msgtx = '数据保存成功'.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        SORT lt_return BY type message.
        DELETE ADJACENT DUPLICATES FROM lt_return COMPARING type message.
        LOOP AT lt_return INTO ls_return WHERE type CA 'AXE'.

          ls_data-msgtx = ls_data-msgtx && '/' && ls_return-message.
        ENDLOOP.
        IF ls_data-msgtx(1) EQ '/'.
          ls_data-msgtx(1) = space.
          CONDENSE ls_data-msgtx.
        ENDIF.
        ls_data-msgty = 'E'.
      ENDIF.
      MODIFY it_data FROM ls_data TRANSPORTING msgty msgtx
                       WHERE  matnr EQ ls_data-matnr
                       AND werks EQ ls_data-werks
                       AND plnal EQ ls_data-plnal
                       AND aennr EQ ls_data-aennr.
      CLEAR:lt_return[],lt_opr[],lt_opr_x[],lt_opr,lt_opr_x,lt_return,ls_data.
  ENDAT.

ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_opr_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LT_OPR
*&      --> LT_OPR_X
*&---------------------------------------------------------------------*
FORM frm_opr_data  TABLES  et_opr   TYPE cpt_task_list_maint_opr
                           et_opr_x TYPE cpt_task_list_maint_opr_x.
  DATA:ls_opr   TYPE cps_task_list_maint_opr,
       ls_opr_x TYPE cps_task_list_maint_opr_x,
       ls_seq   TYPE cps_task_list_maint_seq,
       ls_seq_x TYPE cps_task_list_maint_seq_x.

  DATA(lv_pointer) = lines( et_opr ).
*  ls_opr-flag_bar_pointer = lv_pointer + 1.
*  ls_opr-maintain_mode = 'M'.
  CALL FUNCTION 'CONVERSION_EXIT_NUMCV_INPUT'
    EXPORTING
      input         = it_data-vornr
    IMPORTING
      output        = it_data-vornr
            .

  IF it_data-vgw01 NE 0.
    ls_opr-flag_bar_pointer = lv_pointer + 1.
    ls_opr-maintain_mode = 'M'.
    ls_opr-activity = it_data-vornr.       "操作/活动编号
    ls_opr-std_value_01 = it_data-vgw01.  "直接人工
    ls_opr_x-std_value_01 = abap_true.
    APPEND ls_opr TO et_opr.
    APPEND ls_opr_x TO et_opr_x.
    CLEAR: ls_opr ,ls_opr_x.
  ENDIF.
  IF it_data-vgw02 NE 0.
    ls_opr-flag_bar_pointer = lv_pointer + 2.
    ls_opr-maintain_mode = 'M'.
    ls_opr-activity = it_data-vornr.       "操作/活动编号
    ls_opr-std_value_02 = it_data-vgw02.  "机器
    ls_opr_x-std_value_02 = abap_true.
    APPEND ls_opr TO et_opr.
    APPEND ls_opr_x TO et_opr_x.
    CLEAR: ls_opr ,ls_opr_x.
  ENDIF.

  IF it_data-vgw03 NE 0.
    ls_opr-flag_bar_pointer = lv_pointer + 3.
    ls_opr-maintain_mode = 'M'.
    ls_opr-activity = it_data-vornr.       "操作/活动编号
    ls_opr-std_value_03 = it_data-vgw03.  "其他
    ls_opr_x-std_value_03 = abap_true.
    APPEND ls_opr TO et_opr.
    APPEND ls_opr_x TO et_opr_x.
    CLEAR: ls_opr ,ls_opr_x.
  ENDIF.

  IF it_data-anzma NE 0.
    ls_opr-flag_bar_pointer = lv_pointer + 4.
    ls_opr-maintain_mode = 'M'.
    ls_opr-activity = it_data-vornr.       "操作/活动编号
    ls_opr-no_of_employee = it_data-anzma."雇员数
    ls_opr_x-no_of_employee = abap_true.
    APPEND ls_opr TO et_opr.
    APPEND ls_opr_x TO et_opr_x.
    CLEAR: ls_opr ,ls_opr_x.
  ENDIF.

  IF  it_data-arbpl  NE ''.
    ls_opr-flag_bar_pointer = lv_pointer + 5.
    ls_opr-maintain_mode = 'M'.
    ls_opr-activity = it_data-vornr.       "操作/活动编号
    ls_opr-work_cntr = it_data-arbpl .     "工作中心
    ls_opr_x-work_cntr = abap_true.
    APPEND ls_opr TO et_opr.
    APPEND ls_opr_x TO et_opr_x.
    CLEAR: ls_opr ,ls_opr_x.
  ENDIF.


ENDFORM.

FORM frm_change_no_check USING iv_aennr TYPE plko-aennr
                         CHANGING cv_datuv TYPE sy-datum.
  DATA lv_flg_date TYPE csdata-xfeld.

  CALL FUNCTION 'CCCN_ECN_WITH_EFFECTIVITY'
    EXPORTING
      eaennr          = iv_aennr
    IMPORTING
      flg_date        = lv_flg_date
    EXCEPTIONS
      no_record_found = 1
      OTHERS          = 2.
  IF sy-subrc <> 0.
*    MESSAGE e000 WITH '变更编号不存在'.
* Implement suitable error handling here
  ENDIF.

  IF lv_flg_date EQ abap_true.
    CALL FUNCTION 'CC_CHANGE_NUMBER_READ'
      EXPORTING
        eaennr          = iv_aennr
      IMPORTING
        adatuv          = cv_datuv
      EXCEPTIONS
        no_record_found = 1
        OTHERS          = 2.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form check_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM check_data .

  DATA: messages TYPE string ,
        is_plnnr TYPE plnnr,
        is_plnal TYPE plnal,
        is_werks TYPE marc-werks,
        is_aennr TYPE aennr.
   LOOP AT it_data.
     IF it_data-matnr EQ '' OR it_data-werks EQ '' OR
        it_data-plnnr EQ '' OR it_data-plnal EQ '' OR it_data-vornr EQ ''.
        CLEAR:gs_msg.
          gs_msg-msgid = '00' .
          gs_msg-msgty = 'E' .
          gs_msg-msgno = '001' .
          gs_msg-msgv1 = '物料编号,工厂,组,组计数器,工序号,不能有空!'.
          APPEND gs_msg TO gt_msg.
     ENDIF.

     IF it_data-matnr EQ '' AND it_data-plnnr EQ ''.
       SELECT SINGLE plnnr plnal FROM m_plksc INTO ( is_plnnr ,is_plnal ) WHERE matnr = it_data-matnr.
         IF sy-subrc EQ 0.
           messages =  it_data-matnr && '物料编号与组,组计数器不对应!'.
           CLEAR:gs_msg.
           gs_msg-msgid = '00' .
           gs_msg-msgty = 'E' .
           gs_msg-msgno = '001' .
           gs_msg-msgv1 = messages.
           APPEND gs_msg TO gt_msg.
         ENDIF.
     ENDIF.

     IF it_data-matnr EQ '' AND it_data-werks EQ ''.
       SELECT SINGLE werks FROM marc INTO is_werks WHERE matnr = it_data-matnr.
         IF sy-subrc NE 0.
           messages =  it_data-matnr && '物料编号与工厂不对应!'.
           CLEAR:gs_msg.
           gs_msg-msgid = '00' .
           gs_msg-msgty = 'E' .
           gs_msg-msgno = '001' .
           gs_msg-msgv1 = messages.
           APPEND gs_msg TO gt_msg.
         ENDIF.
     ENDIF.

     IF it_data-arbpl = ''.
           messages =  it_data-matnr && '物料的工作中心不能为空!'.
           CLEAR:gs_msg.
           gs_msg-msgid = '00' .
           gs_msg-msgty = 'E' .
           gs_msg-msgno = '001' .
           gs_msg-msgv1 = messages.
           APPEND gs_msg TO gt_msg.
     ENDIF.

     IF it_data-vgw01 = ''.
           messages =  it_data-matnr && '物料的人工不能为空!'.
           CLEAR:gs_msg.
           gs_msg-msgid = '00' .
           gs_msg-msgty = 'E' .
           gs_msg-msgno = '001' .
           gs_msg-msgv1 = messages.
           APPEND gs_msg TO gt_msg.
     ENDIF.

     IF it_data-vgw02 = ''.
           messages =  it_data-matnr && '物料的机器不能为空!'.
           CLEAR:gs_msg.
           gs_msg-msgid = '00' .
           gs_msg-msgty = 'E' .
           gs_msg-msgno = '001' .
           gs_msg-msgv1 = messages.
           APPEND gs_msg TO gt_msg.
     ENDIF.

     IF it_data-vgw03 = ''.
           messages =  it_data-matnr && '物料的其他不能为空!'.
           CLEAR:gs_msg.
           gs_msg-msgid = '00' .
           gs_msg-msgty = 'E' .
           gs_msg-msgno = '001' .
           gs_msg-msgv1 = messages.
           APPEND gs_msg TO gt_msg.
     ENDIF.

     IF it_data-anzma = ''.
           messages =  it_data-matnr && '物料的雇员数量不能为空!'.
           CLEAR:gs_msg.
           gs_msg-msgid = '00' .
           gs_msg-msgty = 'E' .
           gs_msg-msgno = '001' .
           gs_msg-msgv1 = messages.
           APPEND gs_msg TO gt_msg.
     ENDIF.

   ENDLOOP.


ENDFORM.

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值