目录
项目需求:
根据物料编码,批量更新变式物料及对应的特性值。
难点和重点部分
1、EXCEL导入的时候,特性是一行模式保存,需要进行行列转换以后才能更新特性值。
2、如果物料已经更新变式物料,而且存在一部分特性,那么需要做到没有的新增,有的修改成新值。
3、各个函数的参数的确定。
实例
*&---------------------------------------------------------------------*
*& Report
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zppr012.
"定义类型池
TYPE-POOLS: slis,icon.
TABLES:sscrfields.
*&---------------------------------------------------------------------&*
*& ALV parameter *&
*&---------------------------------------------------------------------&*
DATA:g_repid LIKE sy-repid,
it_fieldcat TYPE lvc_t_fcat WITH HEADER LINE,
is_layout TYPE lvc_s_layo.
DATA gt_exclud TYPE TABLE OF sy-ucomm WITH HEADER LINE.
DATA: is_functxt TYPE smp_dyntxt.
DATA: it_raw TYPE truxs_t_text_data.
*&---------------------------------------------------------------------&*
*& 全局变量 *&
*&---------------------------------------------------------------------&*
"EXCEL导入数据对应模板的内表
DATA :BEGIN OF gs_record1.
matnr TYPE matnr, "物料
werks TYPE werks_d, "工厂
stdpd TYPE string, "可配置物料
data:
INCLUDE TYPE zbts001. "特性
END OF gs_record.
DATA gt_record LIKE TABLE OF gs_record.
"alv显示数据的内表
DATA:BEGIN OF gs_out.
INCLUDE STRUCTURE gs_record.
DATA:
sel, "可选行
zlight(30), "指示灯
zstatu TYPE bapi_mtype, "状态
zmessg TYPE bapi_msg, "消息
END OF gs_out.
DATA:gt_out LIKE TABLE OF gs_out.
*&
DATA:BEGIN OF ga_out,
lvorm LIKE marc-lvorm, "删除标记
werks LIKE marc-werks , " 工厂
matnr(40) TYPE c , " 物料编码
maktx LIKE makt-maktx, "物料中文描述
mtart LIKE mara-mtart, "物料类型
matkl LIKE mara-matkl, "物料组
stdpd LIKE marc-stdpd,
laeda LIKE msta-laeda,
ersda LIKE msta-ersda,
selt,
objek TYPE ausp-objek,
zxgbs(1),
END OF ga_out.
DATA:BEGIN OF ls_out.
INCLUDE STRUCTURE ga_out.
INCLUDE TYPE zbts001.
DATA:
END OF ls_out.
DATA restrict TYPE sscr_restrict.
DATA : optlist TYPE sscr_opt_list,
ass TYPE sscr_ass.
*----------------------------------------------------------------------*
* 选择屏幕 *
*----------------------------------------------------------------------*
"SELECT-OPTIONS:s_werks FOR t001w-werks NO INTERVALS NO-EXTENSION OBLIGATORY.
SELECTION-SCREEN BEGIN OF BLOCK a2 WITH FRAME TITLE TEXT-002.
PARAMETERS: p_file LIKE rlgrap-filename.
SELECTION-SCREEN END OF BLOCK a2.
SELECTION-SCREEN FUNCTION KEY 1.
INITIALIZATION.
is_functxt-icon_id = icon_xls.
is_functxt-icon_text = '下载模板'.
sscrfields-functxt_01 = is_functxt.
*----------------------------------------------------------------------*
* AT SELECTION-SCREEN) *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
PERFORM file_input CHANGING p_file .
*----------------------------------------------------------------------*
* AT SELECTION-SCREEN) *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
IF sscrfields-ucomm = 'FC01'.
PERFORM downdload_template USING 'ZPPR012' '批量维护变式物料模板'.
ENDIF.
** 权限检查 .
* SELECT SINGLE werks FROM t001w INTO gv_werks WHERE werks IN s_werks.
* AUTHORITY-CHECK OBJECT 'Z_BUKRS'
* ID 'ACTVT' FIELD '03'
* ID 'WERKS' FIELD s_werks.
* IF sy-subrc <> 0.
* MESSAGE '你没有此工厂的权限' TYPE 'E' DISPLAY LIKE 'S'.
* LEAVE LIST-PROCESSING.
* ENDIF.
*----------------------------------------------------------------------*
* 初始化 *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
*----------------------------------------------------------------------*
* START-OF-SELECTION 主程序 *
*----------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM upload_data.
PERFORM process_data.
PERFORM disp_alv.
*&---------------------------------------------------------------------*
*& Form upload_data
*&---------------------------------------------------------------------*
*& 上传数据
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM upload_data .
DATA:lt_excel TYPE TABLE OF zalsmex_tabline.
DATA ls_excel LIKE LINE OF lt_excel.
FIELD-SYMBOLS:<fs>.
IF p_file IS INITIAL.
MESSAGE '导入数据不能为空' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ELSE.
**上传数据
CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = p_file
i_begin_col = 1
i_begin_row = 3
i_end_col = 99
i_end_row = 19999
TABLES
intern = lt_excel
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc <> 0.
* implement suitable error handling here
ENDIF.
LOOP AT lt_excel INTO ls_excel.
ASSIGN COMPONENT ls_excel-col OF STRUCTURE gs_record TO <fs>.
CONDENSE ls_excel-value NO-GAPS. " 去掉空格
<fs> = ls_excel-value.
AT END OF row.
"gs_tab-row = ls_excel-row.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = gs_record-matnr
IMPORTING
output = gs_record-matnr
EXCEPTIONS
length_error = 1
OTHERS = 2.
MOVE-CORRESPONDING gs_record TO gs_out.
APPEND gs_out TO gt_out.
APPEND gs_record TO gt_record.
CLEAR gs_out.
CLEAR: gs_record.
ENDAT.
ENDLOOP.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form process_data
*&---------------------------------------------------------------------*
*& 处理数据
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM process_data .
"检查数据是否存在
"导入数据是否正确
ENDFORM.
*&---------------------------------------------------------------------*
*& Form disp_alv
*&---------------------------------------------------------------------*
*& alv显示
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM disp_alv.
DATA: l_user_command TYPE slis_formname,
l_pf_status_set TYPE slis_formname.
CLEAR it_fieldcat.REFRESH it_fieldcat.
PERFORM get_catlog.
l_user_command = 'USER_COMMAND'.
l_pf_status_set = 'SET_PF_STATUS'.
is_layout-zebra = 'X'.
is_layout-box_fname = 'SEL'.
is_layout-cwidth_opt = 'X'.
g_repid = sy-repid.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_interface_check = ' '
i_buffer_active = ' '
i_callback_pf_status_set = l_pf_status_set
i_callback_user_command = l_user_command
i_callback_program = g_repid
is_layout_lvc = is_layout "it_events = lt_event
it_fieldcat_lvc = it_fieldcat[]
i_save = 'A'
TABLES
t_outtab = gt_out[].
ENDFORM.
*&---------------------------------------------------------------------*
*& Form set_pf_status
*&---------------------------------------------------------------------*
* status显示
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM set_pf_status USING pwa_extab TYPE slis_t_extab.
SET PF-STATUS 'STATUS' EXCLUDING gt_exclud.
ENDFORM. " SET_PF_STATUS
**&---------------------------------------------------------------------*
**& Form user_command
**&---------------------------------------------------------------------*
** command
**----------------------------------------------------------------------*
** -->r_ucomm like sy-ucomm
** -->rs_selfield TYPE slis_selfield.
**----------------------------------------------------------------------*
FORM user_command USING pa_ucomm LIKE sy-ucomm
pwa_selfield TYPE slis_selfield.
DATA gv_out LIKE TABLE OF gs_out.
DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_grid.
CALL METHOD lr_grid->check_changed_data.
CASE pa_ucomm.
WHEN 'ZCRT'.
READ TABLE gt_out INTO gs_out WITH KEY sel = 'X'.
IF sy-subrc = 0.
PERFORM crt_wer_data.
ELSE.
MESSAGE '请选择有效行' TYPE 'E'.
ENDIF.
WHEN 'OTHER'.
ENDCASE.
*& 处理后重新加载ALV
CALL METHOD lr_grid->get_frontend_layout
IMPORTING
es_layout = is_layout.
is_layout-cwidth_opt = 'X'.
CALL METHOD lr_grid->set_frontend_layout
EXPORTING
is_layout = is_layout.
CALL METHOD lr_grid->refresh_table_display.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form get_catlog
*&---------------------------------------------------------------------*
*& fieldcat
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM get_catlog.
DATA: it_fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = sy-repid
* I_INTERNAL_TABNAME =
i_structure_name = 'ZBTS001'
* I_CLIENT_NEVER_DISPLAY = 'X'
i_inclname = sy-repid
CHANGING
ct_fieldcat = it_fieldcatalog[]
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
CALL FUNCTION 'LVC_TRANSFER_FROM_SLIS'
EXPORTING
it_fieldcat_alv = it_fieldcatalog[]
IMPORTING
et_fieldcat_lvc = it_fieldcat[]
TABLES
it_data = gt_out[]
EXCEPTIONS
it_data_missing = 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.
DEFINE lit_fieldcat.
it_fieldcat-tabname = 'GT_OUT'.
it_fieldcat-fieldname = &1.
it_fieldcat-coltext = &2.
it_fieldcat-just = &3.
it_fieldcat-ref_field = &4.
it_fieldcat-ref_table = &5.
it_fieldcat-outputlen = &6.
APPEND it_fieldcat.
CLEAR it_fieldcat.
END-OF-DEFINITION. "lit_fieldcat
lit_fieldcat :
'ZLIGHT' '标识' 'C' '' '' '4',
'ZSTATU' '状态' 'C' '' '' '6',
'ZMESSG' '消息' 'C' '' '' '100',
'MATNR' '物料编码' 'C' '' '' '',
'WERKS' '工厂' 'C' '' '' '',
'STDPD' '可配置物料' 'C' '' '' ''.
ENDFORM.
FORM downdload_template USING p_objid TYPE wwwdatatab-objid
p_filename TYPE string.
DATA: w_objdata LIKE wwwdatatab,
w_mime LIKE w3mime,
"w_filename TYPE string,
w_fullpath TYPE string VALUE 'C:/TEMP/',
w_path TYPE string VALUE 'C:/TEMP/',
w_destination LIKE rlgrap-filename,
w_objnam TYPE string,
w_rc LIKE sy-subrc,
w_errtxt TYPE string,
p_dest LIKE sapb-sappfad,
w_action TYPE i.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = '下载导入模板'
default_extension = 'XLS;XLSX'
default_file_name = p_filename
file_filter = 'EXCEL文件|*.XLSX;*.XLS'
CHANGING
filename = p_filename
path = w_path
fullpath = w_fullpath
user_action = w_action
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc = 0 AND w_action EQ 0.
p_dest = w_fullpath.
CONDENSE w_objnam NO-GAPS.
SELECT SINGLE relid objid
INTO CORRESPONDING FIELDS OF w_objdata
FROM wwwdata
WHERE srtf2 = 0 AND relid = 'MI' AND objid = p_objid.
IF sy-subrc NE 0 OR w_objdata-objid EQ space.
CONCATENATE '模板文件' w_objnam '不存在' INTO w_errtxt.
MESSAGE w_errtxt TYPE 'I'.
ENDIF.
w_destination = p_dest.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = w_objdata
destination = w_destination
IMPORTING
rc = w_rc.
IF w_rc NE 0.
CONCATENATE '模板文件:' w_objnam '下载失败' INTO w_errtxt.
MESSAGE w_errtxt TYPE 'E'.
ENDIF.
ENDIF.
ENDFORM.
FORM file_input CHANGING p_file.
DATA:lt_tab TYPE filetable, "存放文件名的内表
lv_file_filter TYPE string, "file filter
lv_rc TYPE i. "函数返回值
REFRESH:lt_tab.
CLEAR:lv_file_filter,lv_rc.
lv_file_filter = 'EXCEL文件|*.XLS;*.XLSX'.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = '选择数据文件'
file_filter = lv_file_filter
*initial_directory = 'C:\'
CHANGING
file_table = lt_tab
rc = lv_rc
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc = 0 AND lv_rc = 1.
READ TABLE lt_tab INTO p_file INDEX 1.
ELSE.
MESSAGE '没有选择文件或是选择文件错误!' TYPE 'S'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CRT_BOM_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM crt_wer_data.
DATA:t_e1cucfg LIKE TABLE OF e1cucfg,
s_e1cucfg LIKE e1cucfg,
t_e1cuins LIKE TABLE OF e1cuins,
s_e1cuins LIKE e1cuins,
t_e1cuval LIKE TABLE OF e1cuval,
t_e1adata LIKE TABLE OF e1cuval,
s_e1cuval LIKE e1cuval,
t_e1cucom LIKE TABLE OF e1cucom,
s_e1cucom LIKE e1cucom.
DATA bapi_matreturn2 LIKE TABLE OF bapi_matreturn2.
FIELD-SYMBOLS <f3>.
DATA: cuib_cuobj TYPE cuib_cuobj,
cuobj LIKE inob-cuobj,
matnr TYPE matnr,
stdpd TYPE stdpd,
lt_tab LIKE TABLE OF e1cuval,
ls_tab LIKE e1cuval.
CLEAR:matnr,cuobj, stdpd,bapi_matreturn2,cuib_cuobj.
DATA lt_vbule LIKE TABLE OF e1cuval.
DATA ls_vbule LIKE e1cuval.
DATA t_configuration LIKE TABLE OF conf_out.
DATA s_configuration LIKE conf_out.
SELECT cuobj,matnr ,werks
FROM marc
INTO TABLE @DATA(lt_marc)
FOR ALL ENTRIES IN @gt_out
WHERE matnr = @gt_out-matnr
AND werks = @gt_out-werks.
*&行转换为列
FIELD-SYMBOLS: <fs> TYPE any.
FIELD-SYMBOLS:<fs_comp> TYPE abap_compdescr.
DATA:cl_descr TYPE REF TO cl_abap_structdescr.
cl_descr ?= cl_abap_typedescr=>describe_by_data( gs_record ).
"获取内部结构的字段名
IMPORT ls_out FROM MEMORY ID 'ZPPR015_D'.
FREE MEMORY ID 'ZPPR015_D'.
IF ls_out IS NOT INITIAL.
MOVE-CORRESPONDING ls_out TO gs_out.
MOVE-CORRESPONDING ls_out TO gs_record.
gs_out-sel = 'X'.
APPEND gs_out TO gt_out.
APPEND gs_record TO gt_record.
ENDIF.
SORT lt_marc BY matnr werks.
DATA i_num TYPE i.
DATA i_num_1 TYPE i.
CLEAR: i_num,i_num_1.
DATA s_text TYPE string.
DESCRIBE TABLE gt_out LINES i_num.
LOOP AT gt_out INTO gs_out WHERE sel = 'X'.
i_num_1 = i_num_1 + 1.
CLEAR:lt_vbule[],t_e1cucfg[],t_e1cuins[],t_e1cuval[],t_e1cucom[].
LOOP AT gt_record INTO gs_record WHERE matnr = gs_out-matnr AND werks = gs_out-werks.
LOOP AT cl_descr->components ASSIGNING <fs_comp>.
ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE gs_record TO <fs>.
ls_vbule-charc = <fs_comp>-name.
ls_vbule-value = <fs>.
ls_vbule-inst_id = '00000001'.
APPEND ls_vbule TO lt_vbule.
CLEAR ls_vbule.
ENDLOOP.
ENDLOOP.
DELETE lt_vbule WHERE charc = 'MATNR' OR charc = 'WERKS' OR charc = 'STDPD' OR value IS INITIAL.
READ TABLE lt_marc INTO DATA(ls_marc) WITH KEY matnr = gs_out-matnr
werks = gs_out-werks BINARY SEARCH.
IF sy-subrc = 0.
cuib_cuobj = ls_marc-cuobj.
CALL FUNCTION 'CUXM_GET_CONFIGURATION'
EXPORTING
instance = cuib_cuobj
werks = ls_marc-werks
TABLES
t_e1cucfg = t_e1cucfg
t_e1cuins = t_e1cuins
t_e1cuval = t_e1cuval
t_e1cucom = t_e1cucom
EXCEPTIONS
instance_not_found = 1
internal_error = 2
instance_is_a_classification = 3
OTHERS = 4.
*&增加导入数据进行创建。
IF t_e1cuval[] IS NOT INITIAL.
CLEAR:t_e1cucfg[],t_e1cuins[],t_e1cucom[].
DATA lt_tabe LIKE TABLE OF e1cuval.
LOOP AT t_e1cuval INTO s_e1cuval.
READ TABLE lt_vbule INTO ls_vbule WITH KEY charc = s_e1cuval-charc.
IF sy-subrc = 0.
ELSE.
ls_vbule-charc = s_e1cuval-charc.
ls_vbule-value = s_e1cuval-value.
ls_vbule-inst_id = s_e1cuval-inst_id.
APPEND ls_vbule TO lt_vbule.
CLEAR ls_vbule .
ENDIF.
CLEAR s_e1cuval.
ENDLOOP.
ENDIF.
ENDIF.
*&----------------------------------------------------------
DATA:material LIKE mara-matnr,
plant LIKE marc-werks,
date LIKE sy-datum,
classtype LIKE klah-klart,
class LIKE klah-class,
objectkey_imp LIKE bapi1003_key-object,
objecttable_imp LIKE bapi1003_key-objecttable,
classtype_imp LIKE bapi1003_key-classtype,
match LIKE TABLE OF cusl_04 WITH HEADER LINE,
s_match LIKE cusl_04,
objects_classification LIKE TABLE OF ausp,
s_objects_c LIKE ausp,
selection LIKE TABLE OF comw,
s_selection LIKE comw,
objects LIKE TABLE OF clsel_search_objects,
s_objects LIKE clsel_search_objects,
alloclist LIKE TABLE OF bapi1003_alloc_list WITH HEADER LINE,
s_alloclist LIKE bapi1003_alloc_list,
lt_return LIKE TABLE OF bapiret2 WITH HEADER LINE,
ls_return LIKE bapiret2.
DATA:t_alloc_list LIKE TABLE OF bapi1003_alloc_list,
t_alloc_char LIKE TABLE OF bapi1003_alloc_values_char,
s_alloc_char LIKE bapi1003_alloc_values_char,
t_return LIKE TABLE OF bapiret2.
CLEAR:t_e1cucfg[],t_e1cuins[],t_e1cuval[],t_e1cucom[],
selection[],match[],objects_classification[],objects[],
material,alloclist-classnum,lt_return[],alloclist[],objectkey_imp.
s_e1cucfg-config_id = '000001'.
s_e1cucfg-root_id = '00000001'.
APPEND s_e1cucfg TO t_e1cucfg.
CLEAR s_e1cucfg.
s_e1cuins-inst_id = '00000001'.
s_e1cuins-obj_type = 'MARA'.
s_e1cuins-class_type = '300'.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = gs_out-stdpd
IMPORTING
output = gs_out-stdpd
EXCEPTIONS
length_error = 1
OTHERS = 2.
s_e1cuins-obj_key = gs_out-stdpd.
APPEND s_e1cuins TO t_e1cuins.
CLEAR s_e1cuins.
t_e1cuval[] = lt_vbule[].
CLEAR:matnr,stdpd,material,objectkey_imp.
matnr = gs_out-matnr.
stdpd = gs_out-stdpd.
material = gs_out-stdpd.
objectkey_imp = gs_out-stdpd.
LOOP AT lt_vbule INTO ls_vbule.
CALL FUNCTION 'CONVERSION_EXIT_ATINN_INPUT'
EXPORTING
input = ls_vbule-charc
IMPORTING
output = s_selection-atinn.
s_selection-atcod = '1'.
s_selection-slcod = '1'.
SELECT SINGLE atfor FROM cabn INTO @DATA(ls_atfor) WHERE atinn = @s_selection-atinn.
s_selection-atfor = ls_atfor.
IF ls_atfor ='NUM'.
s_selection-atflv = ls_vbule-value.
ELSE.
s_selection-atwrt = ls_vbule-value.
ENDIF.
APPEND s_selection TO selection.
CLEAR:ls_vbule,ls_atfor.
ENDLOOP.
CALL FUNCTION 'BAPI_OBJCL_GETCLASSES'
EXPORTING
objectkey_imp = objectkey_imp
objecttable_imp = 'MARA'
classtype_imp = '300'
* READ_VALUATIONS =
keydate = sy-datum
language = sy-langu
* OBJECTKEY_IMP_LONG =
TABLES
alloclist = alloclist
* ALLOCVALUESCHAR =
* ALLOCVALUESCURR =
* ALLOCVALUESNUM =
return = lt_return.
IF alloclist IS INITIAL.
gs_out-zlight = icon_incomplete.
gs_out-zstatu = 'E'.
gs_out-zmessg = '创建失败,可配置物料不正确或未维护分类'.
MODIFY gt_out FROM gs_out.
CLEAR: gs_out,lt_return[],alloclist[],objectkey_imp.
CONTINUE.
ENDIF.
CALL FUNCTION 'CUSE_SELECT_MATERIAL_VARIANTS'
EXPORTING
material = material
plant = ls_marc-werks
date = sy-datum
classtype = '300'
class = alloclist-classnum
strategy = 'X'
* INCL_UNASSIGNED_CHARS = ' '
TABLES
match = match
objects_classification = objects_classification
selection = selection
objects = objects
EXCEPTIONS
no_class_found = 1
no_entry_found = 2
internal_error = 3
OTHERS = 4.
DELETE match WHERE matnr = matnr.
READ TABLE match TRANSPORTING NO FIELDS .
IF sy-subrc = 0.
gs_out-zlight = icon_incomplete.
gs_out-zstatu = 'E'.
gs_out-zmessg = '已有相同配置的变式物料,请检查'.
MODIFY gt_out FROM gs_out.
CLEAR: gs_out,selection[],match[],objects_classification[],objects[],material,alloclist-classnum.
CONTINUE.
ENDIF.
CALL FUNCTION 'MATERIAL_SAVE_CONFIGURATION'
EXPORTING
material = matnr
plant = ls_marc-werks
conf_matl_plant = stdpd
TABLES
e1cucfg_w = t_e1cucfg
e1cuins_w = t_e1cuins
e1cuval_w = t_e1cuval
e1cucom_w = t_e1cucom
returnmessages = bapi_matreturn2.
CLEAR:stdpd, matnr.
READ TABLE bapi_matreturn2 INTO DATA(ls_mess) WITH KEY type = 'E'.
IF sy-subrc = 0.
gs_out-zlight = icon_incomplete.
gs_out-zstatu = 'E'.
gs_out-zmessg = '创建失败' && ls_mess-message.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
gs_out-zlight = icon_checked.
gs_out-zstatu = 'S'.
gs_out-zmessg = '创建成功'.
*&同时更新分类视图
DATA t_num_range LIKE TABLE OF bapi1003_class_num_range.
DATA t_return_d LIKE TABLE OF bapiret2.
DATA: v_object TYPE bapi1003_key-object_long,
numnew TYPE TABLE OF bapi1003_alloc_values_num WITH HEADER LINE,
charnew TYPE TABLE OF bapi1003_alloc_values_char WITH HEADER LINE,
currnew TYPE TABLE OF bapi1003_alloc_values_curr WITH HEADER LINE.
CALL FUNCTION 'BAPI_OBJCL_GETOBJECTS'
EXPORTING
classtype = '200'
status = ''
maxrows = ''
TABLES
classnumrange = t_num_range
alloclist = t_alloc_list
return = t_return_d.
READ TABLE t_alloc_list INTO DATA(s_list) WITH KEY object = gs_out-matnr.
IF sy-subrc = 0.
LOOP AT t_e1cuval INTO DATA(s_elc).
s_alloc_char-value_char = s_elc-value.
s_alloc_char-value_char_long = s_elc-value_long.
s_alloc_char-charact = s_elc-charc.
APPEND s_alloc_char TO t_alloc_char.
CLEAR s_alloc_char.
ENDLOOP.
v_object = gs_out-matnr.
CALL FUNCTION 'BAPI_OBJCL_CHANGE'
EXPORTING
objecttable = s_list-objtyp
classnum = s_list-classnum
classtype = '200'
objectkey_long = v_object
TABLES
allocvaluescharnew = t_alloc_char
allocvaluesnumnew = numnew
allocvaluescurrnew = currnew
return = t_return.
READ TABLE t_return INTO DATA(s_return) WITH KEY type = 'E'.
IF sy-subrc <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
ENDIF.
ENDIF.
MODIFY gt_out FROM gs_out.
CLEAR: bapi_matreturn2[],gs_out.
CLEAR s_text.
s_text = ( i_num_1 / i_num ) * 100 .
s_text = s_text && '%'.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 0
text = s_text
EXCEPTIONS
OTHERS = 1.
CLEAR:s_text.
ENDLOOP.
ENDFORM.