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