1.创建屏幕.
2.屏幕绘制容器(CUSTOMER CONTROL)
3.定义变量
TYPES: BEGIN OF TY_01.
INCLUDE STRUCTURE ZGROUP_2.
TYPES:
FIELD_COLOR TYPE LVC_T_SCOL, "下载嵌套内表错误,存储颜色信息
FIELD_MODIFY TYPE LVC_T_STYL, "存储编辑信息
END OF TY_01.
DATA GT_GROUP TYPE TABLE OF TY_01.
DATA GS_GROUP TYPE TY_01.
DATA GS_ALV TYPE REF TO CL_GUI_ALV_GRID . "参照CL_GUI_ALV_GRID 创建对象 GS_ALV
DATA GS_PARENT TYPE REF TO CL_GUI_CUSTOM_CONTAINER . "参照CL_GUI_CUSTOM_CONTAINER创建对象
DATA IT_FIFLDCAT TYPE LVC_T_FCAT."定义列结构
DATA IS_FIFLDCAT TYPE LVC_S_FCAT."定义列结构 - 工作区
DATA GS_LAYOUT TYPE LVC_S_LAYO. "存储LAYOUT 布局信息
DATA GS_STABLE TYPE LVC_S_STBL. " ALV刷新参数
4.创建ALV 对象
"创建容器对象GS_PARENT,将ALV放在容器中
FORM CREATE_ALV .
CREATE OBJECT GS_PARENT
EXPORTING
CONTAINER_NAME = 'CON1'.
CREATE OBJECT GS_ALV
EXPORTING
I_PARENT = GS_PARENT.
ENDFORM.
4.1为ALV定义列结构,采用宏定义的方法
DEFINE %%ADD_FIFLDCAT.
CLEAR IS_FIFLDCAT .
GV_POS = GV_POS + 1 . " 列数自动加一
IS_FIFLDCAT-COL_POS = GV_POS.
IS_FIFLDCAT-FIELDNAME = &1. "字段名
IS_FIFLDCAT-SCRTEXT_S = &2. "字段描述
IS_FIFLDCAT-OUTPUTLEN = &3. "输出长度
CASE &1.
WHEN 'MAKTX'.
* IS_FIFLDCAT-EMPHASIZE = 'C310'. "设置单元格颜色
IS_FIFLDCAT-EDIT = 'X'. "是否可编辑
WHEN 'MATKL'.
IS_FIFLDCAT-EDIT = 'X'.
ENDCASE.
APPEND IS_FIFLDCAT TO IT_FIFLDCAT .
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*& Form BUILD_FIFLDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM BUILD_FIFLDCAT .
%%ADD_FIFLDCAT:
'MANDT' '集团' '5',
'MATNR' '物料编号' '10',
'MAKTX' '物料描述' '10',
'MATKL' '物料组' '5',
'MEINS' '基本计量单位' '5',
'ERSDA' '创建日期' '10',
'ERNAM' '创建人员名称' '10',
'CBOX' 'SHENGPI' '3'.
ENDFORM.
4.2 为ALV设置LAYOUT
FORM BUILD_LAYOUT .
GS_LAYOUT-CWIDTH_OPT = 'X'. "优化列宽
GS_LAYOUT-ZEBRA = 'X'. "斑马纹
GS_LAYOUT-CTAB_FNAME = 'FIELD_COLOR' . "单元格颜色设置
* GS_LAYOUT-EDIT = 'X'.
GS_LAYOUT-STYLEFNAME = 'FIELD_MODIFY'. "单元格可编辑
ENDFORM.
4.2.1 删除没用的按钮 toolbar事件
FORM frm_event_toolbar USING icl_object TYPE REF TO cl_alv_event_toolbar_set
iv_interactive TYPE c.
DATA: ls_toolar TYPE stb_button.
CLEAR: ls_toolar.
ls_toolar-butn_type = '3'.
APPEND ls_toolar TO icl_object->mt_toolbar.
"删除按钮
DELETE icl_object->mt_toolbar WHERE function = '&CHECK'.
DELETE icl_object->mt_toolbar WHERE function = '&LOCAL&CUT'.
DELETE icl_object->mt_toolbar WHERE function = '&LOCAL©'.
DELETE icl_object->mt_toolbar WHERE function = '&LOCAL&PASTE'.
DELETE icl_object->mt_toolbar WHERE function = '&LOCAL&UNDO'.
DELETE icl_object->mt_toolbar WHERE function = '&LOCAL&APPEND'.
DELETE icl_object->mt_toolbar WHERE function = '&LOCAL&INSERT_ROW'.
DELETE icl_object->mt_toolbar WHERE function = '&LOCAL&DELETE_ROW'.
DELETE icl_object->mt_toolbar WHERE function = '&LOCAL©_ROW'.
DELETE icl_object->mt_toolbar WHERE function = '&INFO'.
DELETE icl_object->mt_toolbar WHERE function = '&MB_VIEW'.
DELETE icl_object->mt_toolbar WHERE function = '&PRINT_BACK'.
DELETE icl_object->mt_toolbar WHERE function = '&LOCAL©_ROW'.
ENDFORM.
5.显示ALV,GS_ALV对象调用SET_TABLE_FOR_FIRST_DISPLAY方法
*&---------------------------------------------------------------------*
*& Form BUILD_ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM BUILD_ALV .
CALL METHOD GS_ALV->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
* I_BUFFER_ACTIVE =
* I_BYPASSING_BUFFER =
* I_CONSISTENCY_CHECK =
* I_STRUCTURE_NAME =
* IS_VARIANT =
* I_SAVE =
* I_DEFAULT = 'X'
IS_LAYOUT = GS_LAYOUT
* IS_PRINT =
* IT_SPECIAL_GROUPS =
IT_TOOLBAR_EXCLUDING = GT_EXCLUDE ”隐藏按钮
* IT_HYPERLINK =
* IT_ALV_GRAPHICS =
* IT_EXCEPT_QINFO =
* IR_SALV_ADAPTER =
CHANGING
IT_OUTTAB = GT_GROUP
IT_FIELDCATALOG = IT_FIFLDCAT
* IT_SORT =
* IT_FILTER =
* EXCEPTIONS
* INVALID_PARAMETER_COMBINATION = 1
* PROGRAM_ERROR = 2
* TOO_MANY_LINES = 3
* OTHERS = 4
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
6.ALV的刷新
*&---------------------------------------------------------------------*
*& Form REFRESH_ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM REFRESH_ALV .
GS_STABLE-ROW = 'X'.
GS_STABLE-COL = 'X'.
CALL METHOD GS_ALV->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = GS_STABLE
* I_SOFT_REFRESH =
EXCEPTIONS
FINISHED = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
6.1 REFRESH_TABLE_DISPLAY参数信息参照
7. AlV 单元格颜色,单元格可编辑
执行步骤: 颜色 1)在相关内表中增加相关字段 (本例: FIELD_COLOR)
2)给输出内表获取数据时,给COLOR赋值
3)设置LAYOUT,给相关字段赋值
可编辑: 1)在相关内表中增加相关字段 (本例:FIELD_MODIFY )
2)STYLE,可修改属性 可修改: CL_GUI_ALV_GRID=>MC_STYLE_ENABLED
不可修改: CL_GUI_ALV_GRID=>MC_STYLE_DISABLED
3)设置LAYOUT,给相关字段赋值
当设置编辑 仍不可编辑时,修改input默认值
CALL METHOD PS_ALV->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 1
.
FORM GET_DATA .
DATA LS_SCOL LIKE LINE OF GS_GROUP-FIELD_COLOR.
DATA LS_STYL TYPE LVC_S_STYL.
SELECT *
FROM ZGROUP_2
INTO CORRESPONDING FIELDS OF TABLE GT_GROUP
WHERE MATNR IN S_MATNR.
LOOP AT GT_GROUP INTO GS_GROUP.
* CLEAR: GS_GROUP-FIELD_MODIFY,GS_GROUP.
"单元格颜色设置
IF GS_GROUP-MATNR IS NOT INITIAL .
LS_SCOL-FNAME = 'MATNR'.
LS_SCOL-COLOR-COL = '3'.
APPEND LS_SCOL TO GS_GROUP-FIELD_COLOR.
ENDIF.
"单元格可编辑
IF GS_GROUP-MAKTX EQ 'SAP_GJX1'.
LS_STYL-FIELDNAME = 'MAKTX'.
* LS_STYL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
LS_STYL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
INSERT LS_STYL INTO TABLE GS_GROUP-FIELD_MODIFY.
ENDIF.
"单元格可编辑 MATKL
LS_STYL-FIELDNAME = 'MATKL'.
* LS_STYL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
LS_STYL-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
INSERT LS_STYL INTO TABLE GS_GROUP-FIELD_MODIFY.
MODIFY GT_GROUP FROM GS_GROUP.
ENDLOOP.
ENDFORM.
8 TOOLBAR,USER_COMMAND,DATA_CHANGED, DOUBLE_CLICK 事件
事件执行步骤:1.ALV实现相关变量定义
2)创建本地类声明实现
3)创建界面,实例化container,以及ALV格式化
4)注册相关事件 (1.为类声明事件对象SET HANDLER 事件对象->方法 FOR ALV.)
5) 执行ALV显示
CLASS LCL_COMPT DEFINITION.
PUBLIC SECTION.
METHODS HANDLE_TOOLBAR FOR EVENT TOOLBAR
OF CL_GUI_ALV_GRID
IMPORTING E_OBJECT .
METHODS HANDLER_USER_COMMAND FOR EVENT USER_COMMAND
OF CL_GUI_ALV_GRID
IMPORTING E_UCOMM.
METHODS HANDLE_DOUBLE FOR EVENT DOUBLE_CLICK
OF CL_GUI_ALV_GRID
IMPORTING E_ROW
E_COLUMN.
METHODS HANDLE_DATA_CHANGED FOR EVENT DATA_CHANGED
OF CL_GUI_ALV_GRID
IMPORTING ER_DATA_CHANGED .
ENDCLASS.
CLASS LCL_COMPT IMPLEMENTATION.
* ANDLE_TOOLBAR.
METHOD HANDLE_TOOLBAR.
PERFORM CL_HANDLE_TOOLBAR USING E_OBJECT.
ENDMETHOD.
* HANDLER_USER_COMMAND.
METHOD HANDLER_USER_COMMAND.
PERFORM FM_USER_COMMAND USING E_UCOMM .
ENDMETHOD.
* HANDLE_DOUBLE
METHOD HANDLE_DOUBLE .
PERFORM CL_HANDLE_DOUBLE USING E_ROW
E_COLUMN.
ENDMETHOD .
* HANDLE_DATA_CHANGED .
METHOD HANDLE_DATA_CHANGED .
PERFORM FM_HANDLE_DATA_CHANGED USING ER_DATA_CHANGED->MT_MOD_CELLS.
ENDMETHOD.
ENDCLASS.
" 事件注册
" 1.声明事件对象
CLASS LCL_COMPT DEFINITION DEFERRED .
DATA EVENT_HANDLER TYPE REF TO LCL_COMPT .
" 2.开始相关注册
FORM SET_HANDLER .
CREATE OBJECT EVENT_HANDLER.
SET HANDLER EVENT_HANDLER->HANDLE_TOOLBAR FOR GS_ALV.
SET HANDLER EVENT_HANDLER->HANDLER_USER_COMMAND FOR GS_ALV.
SET HANDLER EVENT_HANDLER->HANDLE_DOUBLE FOR GS_ALV.
"HANDLE_DATA_CHANGED 事件注册分两步
SET HANDLER EVENT_HANDLER->HANDLE_DATA_CHANGED FOR GS_ALV.
* DATA CHANGED 事件触发
CALL METHOD GS_ALV->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER
EXCEPTIONS
ERROR = 1
OTHERS = 2
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
”DATA_CHANGED 事件
FORM FM_HANDLE_DATA_CHANGED using PT_CELLS TYPE LVC_T_MODI.
DATA PS_CELL TYPE LVC_S_MODI.
LOOP AT PT_CELLS INTO PS_CELL.
READ TABLE GT_GROUP INTO GS_GROUP INDEX PS_CELL-ROW_ID.
IF SY-SUBRC = 0.
CASE PS_CELL-FIELDNAME.
WHEN 'MAKTX'.
GS_GROUP-MAKTX = PS_CELL-VALUE.
ENDCASE.
ENDIF.
MODIFY GT_GROUP FROM GS_GROUP INDEX PS_CELL-ROW_ID .
ENDLOOP.
ENDFORM.
9.表单下载
相关函数:1)'WS_FILENAME_GET' 2)'GUI_DOWNLOAD'
FORM DOWNLOAD_FILE .
DATA LV_FILENAME TYPE STRING .
*1. 获取文件名
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
DEF_FILENAME = '物料信息表 '
* DEF_PATH = ' '
MASK = ',EXCEL,*.XLS. '
MODE = 'S'
TITLE = '整个表单保存 '
IMPORTING
FILENAME = LV_FILENAME
* RC =
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
EXIT.
* Implement suitable error handling here
ENDIF.
*2. 表单下载
CHECK LV_FILENAME IS NOT INITIAL .
*2.1 下载内表的转换,设置表头
IF GT_FIELDNAME IS INITIAL .
GT_FIELDNAME-FIELDNAME = '集团'.
APPEND GT_FIELDNAME .
GT_FIELDNAME-FIELDNAME = '物料编号'.
APPEND GT_FIELDNAME .
GT_FIELDNAME-FIELDNAME = '物料描述'.
APPEND GT_FIELDNAME .
GT_FIELDNAME-FIELDNAME = '物料组' .
APPEND GT_FIELDNAME .
GT_FIELDNAME-FIELDNAME = '基本计量单位'.
APPEND GT_FIELDNAME .
GT_FIELDNAME-FIELDNAME = '创建日期'.
APPEND GT_FIELDNAME .
GT_FIELDNAME-FIELDNAME = '创建人员名称'.
APPEND GT_FIELDNAME .
GT_FIELDNAME-FIELDNAME = '审批状态'.
APPEND GT_FIELDNAME .
ENDIF.
REFRESH GT_DOWNLOAD.
LOOP AT GT_GROUP INTO GS_GROUP .
CLEAR GS_DOWNLOAD.
MOVE-CORRESPONDING GS_GROUP TO GS_DOWNLOAD .
APPEND GS_DOWNLOAD TO GT_DOWNLOAD .
ENDLOOP.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
* BIN_FILESIZE =
FILENAME = LV_FILENAME
* FILETYPE = 'ASC'
* APPEND = ' '
WRITE_FIELD_SEPARATOR = 'X'
* HEADER = '00'
* TRUNC_TRAILING_BLANKS = ' '
* WRITE_LF = 'X'
* COL_SELECT = ' '
* COL_SELECT_MASK = ' '
* DAT_MODE = ' '
* CONFIRM_OVERWRITE = ' '
* NO_AUTH_CHECK = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* WRITE_BOM = ' '
* TRUNC_TRAILING_BLANKS_EOL = 'X'
* WK1_N_FORMAT = ' '
* WK1_N_SIZE = ' '
* WK1_T_FORMAT = ' '
* WK1_T_SIZE = ' '
* WRITE_LF_AFTER_LAST_LINE = ABAP_TRUE
* SHOW_TRANSFER_STATUS = ABAP_TRUE
* VIRUS_SCAN_PROFILE = '/SCET/GUI_DOWNLOAD'
* IMPORTING
* FILELENGTH =
TABLES
DATA_TAB = GT_DOWNLOAD
FIELDNAMES = GT_FIELDNAME[]
EXCEPTIONS
FILE_WRITE_ERROR = 1
NO_BATCH = 2
GUI_REFUSE_FILETRANSFER = 3
INVALID_TYPE = 4
NO_AUTHORITY = 5
UNKNOWN_ERROR = 6
HEADER_NOT_ALLOWED = 7
SEPARATOR_NOT_ALLOWED = 8
FILESIZE_NOT_ALLOWED = 9
HEADER_TOO_LONG = 10
DP_ERROR_CREATE = 11
DP_ERROR_SEND = 12
DP_ERROR_WRITE = 13
UNKNOWN_DP_ERROR = 14
ACCESS_DENIED = 15
DP_OUT_OF_MEMORY = 16
DISK_FULL = 17
DP_TIMEOUT = 18
FILE_NOT_FOUND = 19
DATAPROVIDER_EXCEPTION = 20
CONTROL_FLUSH_ERROR = 21
OTHERS = 22.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.