TYPE-POOLS: slis.
TABLES:mara,sscrfields,t006a.
**BAPI相关变量定义
"修改物料主信息
DATA headdata TYPE bapimathead.
"MEAN:新增非主EAN码,删除非主EAN码
DATA gs_internationalartnos TYPE bapi_mean .
DATA gt_internationalartnos LIKE TABLE OF gs_internationalartnos.
"MARM:删除主EAN码,转换成修改附加单位中的EAN码和类型
"新增主EAN码
DATA gs_unitsofmeasure TYPE bapi_marm.
DATA gt_unitsofmeasure LIKE TABLE OF gs_unitsofmeasure.
"指定要修改的字段
DATA gs_unitsofmeasurex TYPE bapi_marmx.
DATA gt_unitsofmeasurex LIKE TABLE OF gs_unitsofmeasurex.
"接收处理结果
DATA gt_returnmessages TYPE STANDARD TABLE OF bapi_matreturn2 WITH HEADER LINE.
DATA return TYPE bapiret2.
***BAPI处理后展示内表及处理结果
TYPES :BEGIN OF ty_out,
id TYPE i , "序号
matnr TYPE mean-matnr, "物料
maktx TYPE makt-maktx, "物料描述
meinh TYPE mean-meinh, "计量单位
ean11 TYPE mean-ean11, "EAN编码
sel(1), "错误/正确标示 X 错误 空 正确
do_type(4), "操作类型
msg_type TYPE c, "消息类型
msg TYPE c LENGTH 80, "返回处理消息
warn TYPE char10, "预警
flag TYPE c,
END OF ty_out.
TYPES :
***模板标题用类型
BEGIN OF gtyp_title,
title1(20) TYPE c, "标题
title2(20) TYPE c, "标题
title3(20) TYPE c, "标题
END OF gtyp_title.
DATA ls_title TYPE gtyp_title.
DATA gt_title TYPE STANDARD TABLE OF gtyp_title.
DATA:gt_out TYPE STANDARD TABLE OF ty_out WITH HEADER LINE,
wa_out LIKE gt_out,
wa_tmp LIKE gt_out.
DATA: i_fieldcat TYPE STANDARD TABLE OF slis_fieldcat_alv,
gs_fieldcat LIKE LINE OF i_fieldcat,
ex_fcode TYPE ui_functions,
gs_layout TYPE slis_layout_alv.
DATA:BEGIN OF gs_excel,
matnr TYPE matnr , "物料
meinh TYPE mean-meinh, "计量单位
ean11 TYPE mean-ean11, "EAN编码
ean_flag TYPE c, "主EAN码标示为
END OF gs_excel.
DATA:gt_excel LIKE gs_excel OCCURS 0 WITH HEADER LINE.
FIELD-SYMBOLS <fs_excel>.
FIELD-SYMBOLS <fs_out> LIKE LINE OF gt_out.
"选择屏幕
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-005.
PARAMETERS: p_modi RADIOBUTTON GROUP p1 ,
p_del RADIOBUTTON GROUP p1 .
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-002.
PARAMETERS: p_file(128) TYPE c DEFAULT 'C:\' OBLIGATORY .
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN: FUNCTION KEY 1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
PERFORM get_lujing. "***上传文件的路径
INITIALIZATION.
sscrfields-functxt_01 = '下载模板'.
AT SELECTION-SCREEN.
PERFORM frm_download."****下载模板
START-OF-SELECTION.
PERFORM loaddata. "***上载数据
PERFORM checkdata. "***数据检查 & 批量处理
END-OF-SELECTION.
PERFORM alvdata. "***show处理结果
*&---------------------------------------------------------------------*
*& Form GET_LUJING
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_lujing .
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
* DEF_FILENAME = ' '
def_path = 'C:\ '
mask = ',Excel files (*.XLS),*.XLS,'
mode = 'O'
title = '请选择需要导入的数据文件 '
IMPORTING
filename = p_file
* RC =
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
ENDFORM. " GET_LUJING
*&---------------------------------------------------------------------*
*& Form FRM_DOWNLOAD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_download .
CASE sscrfields-ucomm.
WHEN 'FC01'.
PERFORM frm_download_excel.
ENDCASE.
ENDFORM. " FRM_DOWNLOAD
*&---------------------------------------------------------------------*
*& Form FRM_DOWNLOAD_EXCEL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_download_excel .
DATA : ls_title TYPE gtyp_title,
l_file TYPE string,
l_filename(128) TYPE c.
IF gt_title IS INITIAL.
ls_title-title1 = '物料'.
ls_title-title2 = '单位'.
ls_title-title3 = 'EAN编码'.
APPEND ls_title TO gt_title.
ENDIF.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
def_path = ''
mask = ' (*.xls),*.xls,'
mode = 'S'
title = text-004
IMPORTING
filename = l_filename
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
IF sy-subrc <> 0.
CLEAR: l_filename.
ENDIF.
l_file = l_filename.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = l_file
filetype = 'DAT'
codepage = '8400'
TABLES
data_tab = gt_title.
ENDFORM. " FRM_DOWNLOAD_EXCEL
*&---------------------------------------------------------------------*
*& Form LOADDATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM loaddata .
DATA:lt_intern TYPE kcde_cells OCCURS 0 WITH HEADER LINE.
DATA:l_index TYPE i.
FIELD-SYMBOLS <local> LIKE LINE OF gt_excel.
IF p_file IS NOT INITIAL.
CALL FUNCTION 'KCD_EXCEL_OLE_TO_INT_CONVERT'
EXPORTING
filename = p_file
i_begin_col = 1
i_begin_row = 1
i_end_col = 256
i_end_row = 65536
TABLES
intern = lt_intern
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE w999 WITH '无上载数据'.
LEAVE TO CURRENT TRANSACTION.
ENDIF.
ENDIF.
SORT lt_intern BY row col.
*** 对模板的判断
LOOP AT lt_intern WHERE row = 1.
IF ( lt_intern-col = 1 AND lt_intern-value NE '物料') OR
( lt_intern-col = 2 AND lt_intern-value NE '单位') OR
( lt_intern-col = 3 AND lt_intern-value NE 'EAN编码').
MESSAGE i999 WITH '导入模板错误!' DISPLAY LIKE 'E'.
LEAVE TO CURRENT TRANSACTION.
ENDIF.
IF lt_intern-col GT 6.
MESSAGE i999 WITH '导入模板错误!' DISPLAY LIKE 'E'.
LEAVE TO CURRENT TRANSACTION.
ENDIF.
ENDLOOP.
*** 上载数据的内表转换
LOOP AT lt_intern WHERE row GT 1.
MOVE lt_intern-col TO l_index.
ASSIGN COMPONENT l_index OF STRUCTURE gt_excel TO <fs_excel>.
MOVE lt_intern-value TO <fs_excel>.
AT END OF row.
APPEND gt_excel.
CLEAR gt_excel.
ENDAT.
ENDLOOP.
LOOP AT gt_excel ASSIGNING <local>.
"物料补充零
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = <local>-matnr
IMPORTING
output = <local>-matnr.
"只识别内部单位 单位转换
TRANSLATE <local>-meinh TO UPPER CASE.
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
input = <local>-meinh
language = sy-langu
IMPORTING
output = <local>-meinh
EXCEPTIONS
unit_not_found = 1
OTHERS = 2.
ENDLOOP.
ENDFORM. " LOADDATA
*&---------------------------------------------------------------------*
*& Form CHECKDATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM checkdata .
DATA lt_t006a TYPE STANDARD TABLE OF t006a WITH HEADER LINE .
DATA lt_marav TYPE STANDARD TABLE OF marav WITH HEADER LINE.
IF gt_excel[] IS NOT INITIAL .
SELECT * FROM t006a
INTO CORRESPONDING FIELDS OF TABLE lt_t006a
FOR ALL ENTRIES IN gt_excel
WHERE msehi = gt_excel-meinh
AND spras = sy-langu.
SELECT * FROM marav
INTO TABLE lt_marav
FOR ALL ENTRIES IN gt_excel
WHERE matnr = gt_excel-matnr
AND spras = sy-langu.
SORT lt_t006a BY msehi.
SORT lt_marav BY matnr.
ENDIF.
LOOP AT gt_excel.
MOVE-CORRESPONDING gt_excel TO gt_out.
gt_out-id = sy-tabix ."序号
IF p_del = 'X'.
gt_out-do_type = '删除'.
ELSE.
gt_out-do_type = '新增'.
ENDIF.
READ TABLE lt_marav WITH KEY matnr = gt_out-matnr BINARY SEARCH.
IF sy-subrc <> 0.
gt_out-msg = '【ABAP】物料号维护错误!'.
gt_out-sel = 'X'.
gt_out-msg_type = 'E'.
ELSE.
gt_out-maktx = lt_marav-maktx.
ENDIF.
READ TABLE lt_t006a WITH KEY msehi = gt_out-meinh BINARY SEARCH.
IF sy-subrc <> 0 AND gt_out-sel IS INITIAL.
gt_out-msg = '【ABAP】当前语言下单位维护有误!'.
gt_out-msg_type = 'E'.
gt_out-sel = 'X'. " 数据维护错误标示位
* gt_out-warn =
'@0A@'. "预警
ENDIF.
****"删除处理***********************************************************
IF p_del = 'X' AND gt_out-sel IS INITIAL.
DATA wa TYPE mean.
SELECT SINGLE * FROM mean INTO wa WHERE matnr = gt_out-matnr
AND meinh = gt_out-meinh
AND ean11 = gt_out-ean11 .
IF sy-subrc <> 0.
gt_out-msg = '【ABAP】EAN码不存在或不存在于该物料中无需删除!'.
gt_out-msg_type = 'E'.
gt_out-sel = 'X'. "数据维护错误标示位
ELSE.
IF wa-hpean = 'X'.
PERFORM del_ean_01 USING gt_out. "删除主EAN码
ELSE.
PERFORM del_ean_02 USING gt_out. "删除非主EAN码
ENDIF.
PERFORM bapi.
ENDIF.
ENDIF.
****"新增处理***********************************************************
DATA l_msg TYPE string.
IF p_modi = 'X' AND gt_out-sel IS INITIAL.
IF gt_out-sel IS INITIAL.
"新增EAN码时,先判断是否新增主EAN码
DATA wa_01 TYPE mean.
SELECT SINGLE * FROM mean INTO wa_01 WHERE matnr = gt_out-matnr AND
meinh = gt_out-meinh.
IF sy-subrc = 0.
DATA wa_02 TYPE mean.
SELECT SINGLE * FROM mean INTO wa_02 WHERE matnr = gt_out-matnr
AND meinh = gt_out-meinh
AND ean11 = gt_out-ean11 .
IF sy-subrc = 0.
gt_out-msg = '【ABAP】EAN码已存在该物料中无需新增!'.
gt_out-msg_type = 'E'.
gt_out-sel = 'X'. "数据维护错误标示位
ELSE.
PERFORM modi_ean_02 USING gt_out. "新增非主EAN码
PERFORM bapi.
ENDIF.
ELSE.
PERFORM modi_ean_01 USING gt_out. "新增主EAN码
PERFORM bapi.
ENDIF.
ENDIF.
ENDIF.
APPEND gt_out.
CLEAR gt_out.
ENDLOOP.
ENDFORM. " CHECKDATA
*&---------------------------------------------------------------------*
*& Form ALVDATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM alvdata .
PERFORM get_fieldcat.
gs_layout-zebra = 'X'."条纹格式输出
gs_layout-colwidth_optimize = 'X'.
gs_layout-box_fieldname = 'FLAG'.
PERFORM display.
ENDFORM. " ALVDATA
*&---------------------------------------------------------------------*
*& Form GET_FIELDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_fieldcat .
DATA n TYPE i VALUE 1.
DEFINE edit_field.
clear gs_fieldcat.
gs_fieldcat-col_pos = n.
gs_fieldcat-fieldname = &1.
gs_fieldcat-seltext_l = &2.
gs_fieldcat-seltext_m = &2.
gs_fieldcat-seltext_s = &2.
* wa_fieldcat-just = 'R'.
n = n + 1.
append gs_fieldcat to i_fieldcat.
END-OF-DEFINITION.
edit_field 'ID' '序号'.
edit_field 'MATNR' '物料号'.
edit_field 'MAKTX' '物料描述'.
edit_field 'MEINH' '单位'.
edit_field 'EAN11' 'EAN编码'.
edit_field 'DO_TYPE' '操作类型'.
edit_field 'MSG_TYPE' '消息类型'.
edit_field 'MSG' '消息文本'.
* edit_field 'WARN' '警示灯'.
LOOP AT i_fieldcat INTO gs_fieldcat WHERE fieldname = 'MATNR'.
gs_fieldcat-no_zero = 'X'.
MODIFY i_fieldcat FROM gs_fieldcat.
ENDLOOP.
ENDFORM. " GET_FIELDCAT
*&---------------------------------------------------------------------*
*& Form DISPLAY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM display .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
is_layout = gs_layout
it_fieldcat = i_fieldcat
i_save = 'A'
TABLES
t_outtab = gt_out[]
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. " DISPLAY
*&---------------------------------------------------------------------*
*& Form DEL_EAN_01
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_GT_OUT text
*----------------------------------------------------------------------*
FORM del_ean_01 USING p_gt_out TYPE ty_out.
* CLEAR gs_unitsofmeasure.
* gs_unitsofmeasure-alt_unit = p_gt_out-meinh.
* APPEND gs_unitsofmeasure TO gt_unitsofmeasure.
*
* CLEAR gs_unitsofmeasurex.
* gs_unitsofmeasurex-alt_unit = p_gt_out-meinh..
* gs_unitsofmeasurex-ean_upc = 'X'.
* gs_unitsofmeasurex-ean_cat = 'X'.
* APPEND gs_unitsofmeasurex TO gt_unitsofmeasurex.
DATA l_wa TYPE mean.
SELECT SINGLE * FROM mean INTO l_wa WHERE matnr = p_gt_out-matnr
AND meinh = p_gt_out-meinh
AND hpean = ''.
"=0 删除主EAN后要分配主EAN码
IF sy-subrc = 0.
""物料及基本视图
CLEAR gs_unitsofmeasure.
gs_unitsofmeasure-ean_upc = l_wa-ean11.
gs_unitsofmeasure-alt_unit = l_wa-meinh.
APPEND gs_unitsofmeasure TO gt_unitsofmeasure.
CLEAR gs_unitsofmeasurex.
gs_unitsofmeasurex-alt_unit = p_gt_out-meinh..
gs_unitsofmeasurex-ean_upc = 'X'.
gs_unitsofmeasurex-ean_cat = 'X'.
APPEND gs_unitsofmeasurex TO gt_unitsofmeasurex.
PERFORM del_ean_02 USING p_gt_out. "删除非主EAN码
ELSE.
CLEAR headdata.
headdata-material = p_gt_out-matnr.
headdata-basic_view = 'X'.
"<>0:直接删除主EAN无需分配
CLEAR gs_unitsofmeasure.
gs_unitsofmeasure-alt_unit = p_gt_out-meinh.
APPEND gs_unitsofmeasure TO gt_unitsofmeasure.
CLEAR gs_unitsofmeasurex.
gs_unitsofmeasurex-alt_unit = p_gt_out-meinh..
gs_unitsofmeasurex-ean_upc = 'X'.
gs_unitsofmeasurex-ean_cat = 'X'.
APPEND gs_unitsofmeasurex TO gt_unitsofmeasurex.
ENDIF.
ENDFORM. " DEL_EAN_01
*&---------------------------------------------------------------------*
*& Form DEL_EAN_02
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_GT_OUT text
*----------------------------------------------------------------------*
FORM del_ean_02 USING p_gt_out TYPE ty_out.
""物料及基本视图
CLEAR headdata.
headdata-material = p_gt_out-matnr.
headdata-basic_view = 'X'.
CLEAR gs_internationalartnos.
gs_internationalartnos-unit = p_gt_out-meinh. "单位
gs_internationalartnos-ean_upc = p_gt_out-ean11. "EAN码
* gs_internationalartnos-ean_cat = 'HE'. "类别
gs_internationalartnos-del_flag = 'X'. "删除标记
APPEND gs_internationalartnos TO gt_internationalartnos.
ENDFORM. " DEL_EAN_02
*&---------------------------------------------------------------------*
*& Form BAPI
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM bapi .
REFRESH gt_returnmessages[] .
CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
EXPORTING
headdata = headdata
* no_rollback_work = 'X'
IMPORTING
return = return
TABLES
* MATERIALDESCRIPTION =
unitsofmeasure = gt_unitsofmeasure
unitsofmeasurex = gt_unitsofmeasurex
internationalartnos = gt_internationalartnos
* MATERIALLONGTEXT =
* TAXCLASSIFICATIONS =
returnmessages = gt_returnmessages[] .
READ TABLE gt_returnmessages WITH KEY type = 'E'.
IF sy-subrc = 0 .
gt_out-msg = gt_returnmessages-message.
gt_out-msg_type = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
READ TABLE gt_returnmessages WITH KEY type = 'W'.
IF sy-subrc = 0 .
gt_out-msg = gt_returnmessages-message.
gt_out-msg_type = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
IF p_del = 'X'.
gt_out-msg = '【ABAP】EAN编码 删除 成功!'.
gt_out-msg_type = 'S'.
ELSE.
gt_out-msg = '【ABAP】EAN编码 导入 成功!'.
gt_out-msg_type = 'S'.
ENDIF.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
ENDIF.
REFRESH :gt_unitsofmeasure,gt_unitsofmeasurex,gt_internationalartnos.
CLEAR : headdata,return.
ENDFORM. " BAPI
*&---------------------------------------------------------------------*
*& Form MODI_EAN_01
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_GT_OUT text
*----------------------------------------------------------------------*
FORM modi_ean_01 USING p_gt_out TYPE ty_out.
""物料及基本视图
CLEAR headdata.
headdata-material = p_gt_out-matnr.
headdata-basic_view = 'X'.
CLEAR gs_unitsofmeasure.
gs_unitsofmeasure-ean_upc = p_gt_out-ean11.
gs_unitsofmeasure-alt_unit = p_gt_out-meinh.
APPEND gs_unitsofmeasure TO gt_unitsofmeasure.
CLEAR gs_unitsofmeasurex.
gs_unitsofmeasurex-alt_unit = p_gt_out-meinh..
gs_unitsofmeasurex-ean_upc = 'X'.
gs_unitsofmeasurex-ean_cat = 'X'.
APPEND gs_unitsofmeasurex TO gt_unitsofmeasurex.
ENDFORM. " MODI_EAN_01
*&---------------------------------------------------------------------*
*& Form MODI_EAN_02
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_GT_OUT text
*----------------------------------------------------------------------*
FORM modi_ean_02 USING p_gt_out TYPE ty_out.
""物料及基本视图
CLEAR headdata.
headdata-material = p_gt_out-matnr.
headdata-basic_view = 'X'.
CLEAR gs_internationalartnos.
gs_internationalartnos-unit = p_gt_out-meinh. "单位
gs_internationalartnos-ean_upc = p_gt_out-ean11. "EAN码
* gs_internationalartnos-ean_cat = 'HE'. "类别
* gs_internationalartnos-del_flag = 'X'. "删除标记
APPEND gs_internationalartnos TO gt_internationalartnos.
ENDFORM. " MODI_EAN_02