按最近的FS的需求,完成了一个ALV程序,做一个备忘吧。



全面代码:
*&---------------------------------------------------------------------*
*& Report ZMME0017B
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZMME0017B.
TABLES: ZTMM0089B,sscrfields,marc,MAKT.
TYPES:
BEGIN OF ty_excel,
MATNR TYPE MATNR,
WERKS TYPE WERKS_D,
LIFNR TYPE LIFNR,
GROES TYPE ZTMM0089B-GROES,
ZSNP TYPE ZTMM0089B-ZSNP,
ICON_LIGHT(4) TYPE C,
STATUS TYPE C,
message(100) TYPE C,
END OF ty_excel.
DATA gt_excel TYPE TABLE OF ty_excel.
DATA gt_89b LIKE TABLE OF ZTMM0089B.
DATA:gs_functxt TYPE smp_dyntxt.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001 .
PARAMETERS: p_putin RADIOBUTTON GROUP rg1 DEFAULT 'X' USER-COMMAND uc01,
p_cx RADIOBUTTON GROUP rg1.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.
PARAMETER P_PATH1 LIKE RLGRAP-FILENAME MODIF ID M02.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-003.
SELECT-OPTIONS:s_MATNR FOR marc-MATNR MODIF ID M03,
s_LIFNR FOR ZTMM0089B-LIFNR MODIF ID M03, "供应商
s_werks FOR marc-werks MODIF ID M03.
SELECTION-SCREEN END OF BLOCK b3.
SELECTION-SCREEN: FUNCTION KEY 1.
INITIALIZATION.
CLEAR gs_functxt.
gs_functxt-text = '包装系数导入模板'.
gs_functxt-icon_id = icon_export.
gs_functxt-icon_text = '包装系数导入模板'.
gs_functxt-quickinfo = '包装系数导入模板'.
sscrfields-functxt_01 = gs_functxt.
AT SELECTION-SCREEN OUTPUT.
PERFORM frm_select_screen.
AT SELECTION-SCREEN.
CASE sscrfields-ucomm.
WHEN 'FC01'.
PERFORM frm_download_template_a1.
ENDCASE.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path1.
PERFORM frm_sel_file CHANGING p_path1.
START-OF-SELECTION.
IF p_putin = 'X'. "导入
PERFORM frm_excel_import.
PERFORM frm_table_save.
ELSEIF p_cx = 'X'. "查询
PERFORM frm_display_cx.
ENDIF.
"===========子函数如下===========
"选择屏幕切换4个功能的函数
FORM frm_select_screen .
CASE 'X'.
WHEN p_putin.
LOOP AT SCREEN.
IF screen-group1 = 'M02'. screen-active = 1. MODIFY SCREEN. ENDIF.
IF screen-group1 = 'M03'. screen-active = 0. MODIFY SCREEN. ENDIF.
ENDLOOP.
WHEN p_cx.
LOOP AT SCREEN.
IF screen-group1 = 'M02'. screen-active = 0. MODIFY SCREEN. ENDIF.
IF screen-group1 = 'M03'. screen-active = 1. MODIFY SCREEN. ENDIF.
ENDLOOP.
ENDCASE.
ENDFORM. " FRM_SET_SCREEN
FORM FRM_EXCEL_IMPORT .
DATA CL_EX TYPE REF TO CX_ROOT.
CHECK P_PATH1 IS NOT INITIAL.
TRY .
CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
FILENAME = P_PATH1
I_BEGIN_COL = 1
I_BEGIN_ROW = 4
I_END_COL = 5
I_END_ROW = 5000
* SHEET_NAME =
TABLES
INTERN = gt_excel
EXCEPTIONS
INCONSISTENT_PARAMETERS = 1
UPLOAD_OLE = 2
OTHERS = 3.
CATCH CX_ROOT INTO CL_EX.
MESSAGE CL_EX->GET_TEXT( ) TYPE 'E'.
ENDTRY.
ENDFORM.
FORM FRM_TABLE_SAVE .
DATA gs_89b type ZTMM0089B.
LOOP AT GT_excel ASSIGNING FIELD-SYMBOL(<gs180>).
CLEAR gs_89b.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = <gs180>-MATNR
IMPORTING
output = gs_89b-MATNR.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = <gs180>-LIFNR
IMPORTING
output = gs_89b-LIFNR.
SELECT SINGLE MAKTX FROM MAKT WHERE MATNR = @gs_89b-MATNR AND SPRAS = '1' INTO @gs_89b-MAKTX.
SELECT SINGLE NAME1 FROM LFA1 WHERE LIFNR = @gs_89b-LIFNR INTO @gs_89b-NAME1.
gs_89b-WERKS = <gs180>-WERKS.
gs_89b-GROES = <gs180>-GROES.
gs_89b-ZSNP = <gs180>-ZSNP.
SELECT *
FROM MARC
WHERE matnr EQ @gs_89b-MATNR
and WERKS EQ @gs_89b-WERKS
into TABLE @DATA(lt_temp).
IF sy-subrc <> 0.
gs_89b-STATUS = 'E'.
gs_89b-MESSAGE = '物料和工厂在MARC表中没有,物料不存在或视图未维护!'.
gs_89b-ICON_LIGHT = icon_red_light.
ENDIF.
SELECT *
FROM EINA
WHERE matnr EQ @gs_89b-MATNR
and LIFNR EQ @gs_89b-LIFNR
into TABLE @DATA(lt_temp2).
IF sy-subrc <> 0.
gs_89b-STATUS = 'E'.
gs_89b-MESSAGE = '物料供应商关系未维护!'.
gs_89b-ICON_LIGHT = icon_red_light.
ENDIF.
APPEND gs_89b TO gt_89b.
ENDLOOP.
DATA: LT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
LS_FIELDCAT TYPE SLIS_FIELDCAT_ALV,
WS_FIELDGROUPS_TAB TYPE SLIS_T_SP_GROUP_ALV,
WS_LAYOUT TYPE SLIS_LAYOUT_ALV,
WS_SORTFIELDS_TAB TYPE SLIS_T_SORTINFO_ALV WITH HEADER LINE,
WS_EVENTS TYPE SLIS_T_EVENT.
DATA: lv_pos TYPE I VALUE 0.
DATA: TITLE TYPE LVC_TITLE.
DATA: COLOR TYPE SLIS_T_SPECIALCOL_ALV WITH HEADER LINE.
DEFINE macro_fieldcat.
lv_pos = lv_pos + 1.
ls_fieldcat-col_pos = lv_pos.
ls_fieldcat-tabname = 'gt_89b'.
ls_fieldcat-fieldname = &1.
ls_fieldcat-seltext_l = &2.
ls_fieldcat-inttype = &3.
ls_fieldcat-intlen = &4.
append ls_fieldcat to lt_fieldcat .
clear ls_fieldcat.
END-OF-DEFINITION.
macro_fieldcat:
'MATNR' '物料编码' '' '',
'MAKTX' '描述' '' '',
'WERKS' '工厂' '' '',
'LIFNR' '供应商' '' '',
'NAME1' '供应商名称' '' '',
'GROES' '规格型号' '' '',
'ZSNP' 'SNP' '' '',
'ZCNAME' '创建人' '' '',
'ZCDATE' '创建日期' '' '',
'ZCTIME' '创建时间' '' '',
'ZAENAME' '更新人' '' '',
'ZAEDATE' '更新日期' '' '',
'ZAETIME' '更新时间' '' '',
'ICON_LIGHT' '图标' '' '',
'STATUS' '状态' '' '',
'message' '消息描述' '' ''.
WS_LAYOUT-ZEBRA = 'X'.
WS_LAYOUT-GET_SELINFOS = 'X'.
WS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
WS_LAYOUT-DETAIL_POPUP = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
I_CALLBACK_PF_STATUS_SET = 'ALV_STATUS_SET'
I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND'
IS_LAYOUT = WS_LAYOUT
IT_FIELDCAT = LT_FIELDCAT
IT_SPECIAL_GROUPS = WS_FIELDGROUPS_TAB[]
IT_SORT = WS_SORTFIELDS_TAB[]
IT_EVENTS = WS_EVENTS[]
I_GRID_TITLE = TITLE
I_DEFAULT = 'X'
I_SAVE = 'A'
TABLES
T_OUTTAB = GT_89b
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
ENDFORM.
FORM ALV_STATUS_SET USING PT_EXTAB TYPE SLIS_T_EXTAB.
CLEAR: PT_EXTAB[].
SET PF-STATUS 'ZS100'.
ENDFORM.
FORM FRM_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD.
CASE R_UCOMM.
WHEN '&GO1'.
PERFORM FRM_PROCESS.
rs_selfield-refresh = 'X'.
WHEN OTHERS.
ENDCASE.
ENDFORM.
FORM FRM_PROCESS .
LOOP AT GT_89b ASSIGNING FIELD-SYMBOL(<gs300>) WHERE STATUS <> 'E'.
SELECT SINGLE *
FROM ZTMM0089B
WHERE MATNR = @<gs300>-MATNR
AND WERKS = @<gs300>-WERKS
AND LIFNR = @<gs300>-LIFNR
INTO @DATA(ls_line).
IF sy-subrc = 0. "有就修改
UPDATE ZTMM0089B
SET
GROES = <gs300>-GROES
ZSNP = <gs300>-ZSNP
STATUS = 'S'
ICON_LIGHT = icon_green_light
MESSAGE = '修改数据完成'
ZAENAME = SY-UNAME
ZAEDATE = SY-DATUM
ZAETIME = SY-UZEIT
WHERE MATNR = <gs300>-MATNR
AND WERKS = <gs300>-WERKS
AND LIFNR = <gs300>-LIFNR.
COMMIT WORK AND WAIT.
ELSE. "没有就新增
<gs300>-GUID = cl_uuid_factory=>create_system_uuid( )->create_uuid_c32( ).
<gs300>-ZCNAME = SY-UNAME.
<gs300>-ZCDATE = SY-DATUM.
<gs300>-ZCTIME = SY-UZEIT.
<gs300>-STATUS = 'S'.
<gs300>-ICON_LIGHT = icon_green_light .
<gs300>-MESSAGE = '新建数据完成' .
INSERT ZTMM0089B FROM <gs300>.
COMMIT WORK AND WAIT.
ENDIF.
ENDLOOP.
ENDFORM.
FORM FRM_DISPLAY_CX .
DATA lt_89b LIKE TABLE OF ZTMM0089B.
SELECT *
FROM ZTMM0089B
WHERE MATNR IN @s_MATNR
AND WERKS IN @s_werks
AND LIFNR IN @S_LIFNR
INTO TABLE @lt_89b.
DATA: LT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
LS_FIELDCAT TYPE SLIS_FIELDCAT_ALV,
WS_FIELDGROUPS_TAB TYPE SLIS_T_SP_GROUP_ALV,
WS_LAYOUT TYPE SLIS_LAYOUT_ALV,
WS_SORTFIELDS_TAB TYPE SLIS_T_SORTINFO_ALV WITH HEADER LINE,
WS_EVENTS TYPE SLIS_T_EVENT.
DATA: lv_pos TYPE I VALUE 0.
DATA: TITLE TYPE LVC_TITLE.
DATA: COLOR TYPE SLIS_T_SPECIALCOL_ALV WITH HEADER LINE.
DEFINE macro_fieldcat.
lv_pos = lv_pos + 1.
ls_fieldcat-col_pos = lv_pos.
ls_fieldcat-tabname = 'lt_89b'.
ls_fieldcat-fieldname = &1.
ls_fieldcat-seltext_l = &2.
ls_fieldcat-inttype = &3.
ls_fieldcat-intlen = &4.
append ls_fieldcat to lt_fieldcat .
clear ls_fieldcat.
END-OF-DEFINITION.
macro_fieldcat:
'MATNR' '物料编码' '' '',
'MAKTX' '描述' '' '',
'WERKS' '工厂' '' '',
'LIFNR' '供应商' '' '',
'NAME1' '供应商名称' '' '',
'GROES' '规格型号' '' '',
'ZSNP' 'SNP' '' '',
'ZCNAME' '创建人' '' '',
'ZCDATE' '创建日期' '' '',
'ZCTIME' '创建时间' '' '',
'ZAENAME' '更新人' '' '',
'ZAEDATE' '更新日期' '' '',
'ZAETIME' '更新时间' '' ''.
WS_LAYOUT-ZEBRA = 'X'.
WS_LAYOUT-GET_SELINFOS = 'X'.
WS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
WS_LAYOUT-DETAIL_POPUP = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
IS_LAYOUT = WS_LAYOUT
IT_FIELDCAT = LT_FIELDCAT
IT_SPECIAL_GROUPS = WS_FIELDGROUPS_TAB[]
IT_SORT = WS_SORTFIELDS_TAB[]
IT_EVENTS = WS_EVENTS[]
I_GRID_TITLE = TITLE
I_DEFAULT = 'X'
I_SAVE = 'A'
TABLES
T_OUTTAB = lt_89b
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
ENDFORM.
"下载导入模板函数
FORM frm_download_template_a1 .
DATA: lv_objname TYPE text40, "object
lv_def_filename TYPE string,
lv_filename TYPE string,
lv_fullpath TYPE string,
lv_path TYPE string,
lv_len TYPE i,
lv_rc TYPE char01,
lv_msg TYPE string.
CLEAR:lv_def_filename,lv_objname.
lv_objname = 'ZMME0017B'.
lv_def_filename = '包装系数导入模板.xlsx'.
CLEAR:lv_filename,lv_path,lv_fullpath.
lv_rc = '1'.
PERFORM frm_open_save_dialog USING lv_def_filename
CHANGING lv_filename
lv_path
lv_fullpath
lv_rc.
IF lv_rc = '0'.
lv_len = 0.
CALL METHOD cl_abap_list_utilities=>dynamic_output_length
EXPORTING
field = lv_fullpath
RECEIVING
len = lv_len.
IF lv_len = 0.
MESSAGE '文件路径长度为0!' TYPE 'S' DISPLAY LIKE 'E'.
ELSEIF lv_len > 128.
MESSAGE '文件路径长度过长!' TYPE 'S' DISPLAY LIKE 'E'.
ELSE.
"get file from smw0 and download it to local
lv_rc = 'X'.
CLEAR lv_msg.
PERFORM frm_down_template USING lv_objname
lv_fullpath
CHANGING lv_rc
lv_msg.
IF lv_rc EQ ''.
MESSAGE '模板下载完成!' TYPE 'S'.
ELSE.
IF lv_msg IS NOT INITIAL.
MESSAGE lv_msg TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ENDIF.
ENDIF.
ELSEIF lv_rc = '1'.
MESSAGE '下载模板出错.' TYPE 'S' DISPLAY LIKE 'E'.
ELSEIF lv_rc = '9'.
MESSAGE '用户取消操作.' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ENDFORM.
FORM frm_open_save_dialog USING uv_def_filename TYPE string
CHANGING cv_filename TYPE string
cv_path TYPE string
cv_fullpath TYPE string
cv_rc TYPE c.
DATA: lv_filter TYPE string,
lv_filename TYPE string,
lv_path TYPE string,
lv_fullpath TYPE string,
lv_user_action TYPE i.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = 'Save as'
default_extension = 'XLSX' "Set detault to XLS when opening a dialog
default_file_name = uv_def_filename
file_filter = cl_gui_frontend_services=>filetype_excel
CHANGING
filename = lv_filename
path = lv_path
fullpath = lv_fullpath
user_action = lv_user_action
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
cv_rc = '1'.
ELSE.
IF lv_user_action = cl_gui_frontend_services=>action_ok.
cv_filename = lv_filename.
cv_path = lv_path.
cv_fullpath = lv_fullpath.
cv_rc = '0'.
ELSEIF lv_user_action = cl_gui_frontend_services=>action_cancel.
cv_rc = '9'.
ENDIF.
ENDIF.
ENDFORM. " FRM_OPEN_SAVE_DIALOG
FORM frm_down_template USING uv_objname TYPE text40
uv_fullpath TYPE string
CHANGING cv_rc TYPE char01
cv_msg TYPE string.
DATA: lv_objname TYPE w3objid, "WWWDATATAB-OBJID, "object
lv_dest TYPE localfile,
ls_objdata TYPE wwwdatatab,
lv_strmsg TYPE string,
lv_rc LIKE sy-subrc.
CLEAR: lv_dest.
IF uv_fullpath IS INITIAL.
cv_msg = 'The path length is 0'.
cv_rc = 'X'.
EXIT.
ELSE.
lv_dest = uv_fullpath.
ENDIF.
CLEAR: lv_objname.
IF uv_objname IS INITIAL.
cv_msg = 'Object name is empty'.
cv_rc = 'X'.
EXIT.
ELSE.
lv_objname = uv_objname.
ENDIF.
CLEAR: ls_objdata.
SELECT SINGLE relid objid
FROM wwwdata
INTO CORRESPONDING FIELDS OF ls_objdata
WHERE srtf2 = 0
AND relid = 'MI'
AND objid = lv_objname.
IF sy-subrc = 0 AND ls_objdata-objid <> space.
CONDENSE lv_dest.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = ls_objdata
destination = lv_dest
IMPORTING
rc = lv_rc.
IF lv_rc <> 0.
CLEAR lv_strmsg.
CONCATENATE 'Failed to download the Object:' lv_objname
INTO lv_strmsg.
cv_msg = lv_strmsg.
cv_rc = 'X'.
ELSE.
"success
cv_rc = ''.
cv_msg = ''.
ENDIF.
ELSE.
CLEAR lv_strmsg.
CONCATENATE 'The Object:' lv_objname 'is not exist.'
INTO lv_strmsg.
cv_msg = lv_strmsg.
cv_rc = 'X'.
ENDIF.
ENDFORM. " FRM_DOWN_TEMPLATE
*&---------------------------------------------------------------------*
*& Form FRM_SEL_FILE
*&---------------------------------------------------------------------*
* text 选择文件
*----------------------------------------------------------------------*
FORM frm_sel_file CHANGING po_path.
DATA:
lt_filetable TYPE filetable,
ls_filetable TYPE file_table,
lv_rc TYPE sy-subrc,
lv_filename TYPE string,
lv_initial_path TYPE string VALUE 'C:\'.
CLEAR lv_filename.
lv_filename = po_path.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
default_filename = lv_filename
initial_directory = lv_initial_path
CHANGING
file_table = lt_filetable
rc = lv_rc
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4.
IF sy-subrc NE 0 OR lv_rc LT 0.
MESSAGE '上传文件选择失败' TYPE 'E' ."上传文件选择失败
ELSE.
IF lv_rc = 1.
READ TABLE lt_filetable INTO ls_filetable INDEX 1.
po_path = ls_filetable-filename.
ELSE.
EXIT.
ENDIF.
ENDIF.
ENDFORM.