本文目录
一、主要使用的类和方法
1、主要使用的类
2、主要使用的方法
二、执行步骤
1、基本表单流程
2、ALV类的创建
3、设置fieldcat
4、可修改属性设置
①报表的可修改
②容器按钮隐藏
5、用户交互事件
*声明
*事件的实现
*注册和调用
OO ALV,即采用面向对象(Object-Oriented)编程方式实现的ALV输出,其基本使用原理是通过界面调用,在界面的Customer Control控件中进行ALV的输出展示。CLASS ALV的优势在于它使用了面向对象的编程方式,这不仅提高了代码的灵活性和可维护性,而且通过使用容器技术,允许在一个界面的指定位置进行ALV的输出,从而优化了用户界面的布局和交互体验。
一、主要使用的类和方法
1、主要使用的类
类的声明
Data for ALV
DATA: gs_alv TYPE REF TO cl_gui_alv_grid, “用于表单输出
gs_con TYPE REF TO cl_gui_custom_container, “用于定义容器
gs_dyndoc_id TYPE REF TO cl_dd_document, “用于表头书写
gs_splitter TYPE REF TO cl_gui_splitter_container. “用于分割容器
2、主要使用的方法
如何在类中找到我们需要的方法以及里面的需要用到的参数等,步骤如下:
事务码:se24 打开后输入用到的类名,点击查看
点击查询按钮,找到需要用到的方法,选中哪一行点击参数,进入后可以找到需要的参数名称或者必输的参数等
二、执行步骤
创建一个report程序,定义输出的内表和选择界面,创建界面0100,调用界面
参照CL_GUI_ALV_GUID ,创建对象
参照容器CL_GUI_CUSTOM_CONTAINER,创建对象
取数 select
输出:1、创建fieldcat,把学生表中的所有字段,创建fieldcat
2、实例化容器
3、实例化AVL
4、调用方法set_table_for_first_display
调用界面,并在逻辑流里面的PBO部分进行对输出的定义,设置fieldcat及layout等属性,通过调用方法执行ALV的初次输出或刷新。
1、基本表单流程
在END-OF-SELECTION中执行输出,创建界面0100,调用界面
在TOP INCLUDE中增加基本定义
在界面中增加customer control控件,例名称为GS_CON
在界面的PBO部分增加module,用于ALV输出
2、ALV类的创建
接上面初始report创建,现实例化容器对象,给CONSTRUCTOR构造方法传值 CONTAINER_NAME,界面中用户定义容器名称 实例化ALV对象,给CONSTRUCTOR构造方法传I_PARENT值实例化的容器对象。
FORM create_alv .
*实例化 CREATE OBJECT ...
CREATE OBJECT gs_parent "GS_PARENT实例化
EXPORTING
container_name = 'GC_CON'. "界面中的CUSTOMER CONTROL 控件名称
CREATE OBJECT gs_alv
EXPORTING
i_parent = gs_parent. "必输参数
ENDFORM.
3、设置fieldcat
定义内表:LVC_T_FCAT 结构:LVC_S_FCAT并对fieldcat表单进行赋值和设计等
DATA gt_fieldcat TYPE lvc_t_fcat . "列结构
DATA gs_fieldcat TYPE lvc_s_fcat . "列结构-工作区
*定义宏
DATA gv_pos TYPE i.
DEFINE %%add_fieldcat .
CLEAR gs_fieldcat.
gv_pos = gv_pos + 1.
gs_fieldcat-col_pos = gv_pos.
gs_fieldcat-fieldname = &1.
gs_fieldcat-scrtext_m = &2.
gs_fieldcat-outputlen = &3.
CASE &1.
WHEN 'ZSCHOOL'.
GS_FIELDCAT-HOTSPOT ='X'.
WHEN 'WEIGH'.
gs_fieldcat-qfieldname = 'ZUNIT'."内表中表明当前数值的单位的字段,不同单位数量合计
gs_fieldcat-edit = 'X'."以列为单位修改
gs_fieldcat-decimals = 2."给输出添加小数点,不然修改数字时,小数点会自己左移。
* gs_fieldcat-emphasize = 'C600'."颜色设置 第一位标明数字,第二位标明是否加重,第三位标明文字或底纹
* WHEN 'ZUNIT'.
* gs_fieldcat-emphasize = 'C601'."颜色设置1是文字0是底纹
WHEN 'SEX'.
gs_fieldcat-edit = 'X'.
ENDCASE.
APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
4、可修改属性设置
①报表的可修改
- 以表单为单位 设置LAYOUT-EDIT,为X,可修改整个表单即所有的单元格都是可修改状态;
- 以列为单位 设置FIELDCAT-EDIT,为X,列可修改,即该列所有单元格都是可修改状态;
- 以单元格为单位 在内表中增加一个字段,类型为LVC_T_STYL ,例CELLSTL 在需要设置修改属性的位置,通过结构给CELLSTL字段内表赋值 FIELDNAME,需要设置属性的字段名 STYLE,可修改属性;
- 若要设置不可修改:CL_GUI_ALV_GRID=>MC_STYLE_DISABLED
可修改:CL_GUI_ALV_GRID=>MC_STYLE_ENALBED
特别的,如果将某一列中部分字段设置为可修改状态,一般通过以下方式完成:FIELDCAT中,设置该列属性为可修改;在表单赋值时,将不应为可修改状态的字段,设置为不可修改 (不是将需要修改的单元格设置为可修改,防止可修改属性设置与静态属性设置冲突)
②容器按钮隐藏
在OO ALV输出过程中,默认输出按钮栏,包含标准按钮如果布局中的按钮太多,需要隐藏,则使用下面的方法:
FORM build_exclude .
CLEAR gt_exclude[].
*用来隐藏容器上方按钮
* gs_exclude = CL_GUI_ALV_GRID=>MC_FC_LOC_INSERT_ROW.
* APPEND GS_EXCLUDE TO GT_EXCLUDE.
*
* gs_exclude = CL_GUI_ALV_GRID=>MC_FC_LOC_DELETE_ROW.
* APPEND GS_EXCLUDE TO GT_EXCLUDE.
*
* gs_exclude = CL_GUI_ALV_GRID=>MC_FC_LOC_APPEND_ROW.
* APPEND GS_EXCLUDE TO GT_EXCLUDE.
*
* gs_exclude = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY_ROW.
* APPEND GS_EXCLUDE TO GT_EXCLUDE.
* "上下效果相同,下面需要调用
PERFORM append_alv_exclude_functions TABLES gt_exclude
USING :
cl_gui_alv_grid=>mc_fc_loc_insert_row,
cl_gui_alv_grid=>mc_fc_loc_delete_row,
cl_gui_alv_grid=>mc_fc_loc_append_row,
cl_gui_alv_grid=>mc_fc_loc_copy_row,
cl_gui_alv_grid=>mc_fc_loc_cut.
ENDFORM.
FORM append_alv_exclude_functions TABLES pt_exclude TYPE ui_functions
USING p_exclude TYPE ui_func.
APPEND p_exclude TO pt_exclude.
ENDFORM .
5、用户交互事件
ALV类中,提供定义好的事件,创建本地类(event handler),对事件创建方法执行相关处理。例:在执行ALV事件的“TOOLBAR”操作时,主要的工作是针对E_OBJECT对象进行操作,通过构建相应的结构体,我们将所需的值赋给MT_TOOLBAR,以此来定制按钮功能等。一些参数的详解:
并可以在TOOLBAR事件中增加的按钮进行功能处理等设置,定义ALV事件USER_COMMAND等,或者定义其他ALV事件等,具体代码如下:
*声明
CLASS lcl_app_compt DEFINITION .
PUBLIC SECTION.
METHODS handle_toolbar FOR EVENT toolbar
OF cl_gui_alv_grid
IMPORTING e_object.
METHODS handle_user_command FOR EVENT user_command
OF cl_gui_alv_grid
IMPORTING e_ucomm.
METHODS handle_hotspot_click FOR EVENT hotspot_click "单击
OF cl_gui_alv_grid
IMPORTING e_row_id
e_column_id
es_row_no.
METHODS handle_double_click 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_app_compt IMPLEMENTATION .
* HANDLE TOOLBAR
METHOD handle_toolbar. "向MT_TOOLBAR 中增加行,增加按钮
PERFORM fm_handle_toolbar USING e_object.
ENDMETHOD.
* HANDLE user_command
METHOD handle_user_command.
PERFORM fm_user_command USING e_ucomm.
ENDMETHOD.
* HANDLE hotspot_click
METHOD handle_hotspot_click.
PERFORM fm_hotspot_click USING e_row_id e_column_id.
ENDMETHOD.
* HANDLE double_click
METHOD handle_double_click.
PERFORM fm_double_click USING e_row e_column.
ENDMETHOD.
* HANDLE_DATA_CHANGED
METHOD handle_data_changed .
PERFORM fm_DATA_CHANGED USING er_data_changed->mt_mod_cells.
ENDMETHOD.
ENDCLASS .
*事件的实现
FORM fm_handle_toolbar USING p_object TYPE REF TO cl_alv_event_toolbar_set.
"向mt_toolbar内表中增加行,增加按钮
DATA ls_button TYPE stb_button.
CLEAR: ls_button.
ls_button-butn_type = '3'."插入分割线 和前面的按钮统一风格
APPEND ls_button TO p_object->mt_toolbar."传入参数E_OBJECT
CLEAR: ls_button.
ls_button-function = 'CALLSF'.
ls_button-text = '调用sf'.
ls_button-icon = icon_failure.
APPEND ls_button TO p_object->mt_toolbar.
CLEAR: ls_button.
ls_button-function = 'EDIT'.
ls_button-text = '修改选中行'.
ls_button-icon = icon_toggle_display_change.
APPEND ls_button TO p_object->mt_toolbar.
CLEAR: ls_button.
ls_button-function = 'DOWNLOAD'.
ls_button-text = '下载表单'.
ls_button-icon = icon_layout_control.
APPEND ls_button TO p_object->mt_toolbar.
ENDFORM.
FORM fm_user_command USING p_ucomm TYPE sy-ucomm.
CASE p_ucomm.
WHEN 'CALLSF'.
MESSAGE s000 WITH '点击调用了SF的按钮'.
WHEN 'EDIT'.
PERFORM change_edit_mode.
WHEN 'DOWNLOAD'.
PERFORM download_file.
ENDCASE.
ENDFORM.
FORM fm_hotspot_click USING p_row_id TYPE lvc_s_row
p_column_id TYPE lvc_s_col.
IF p_column_id-fieldname = 'ZSCHOOL'.
READ TABLE gt_student INTO gs_student INDEX p_row_id-index.
MESSAGE s000 WITH '单击了第 ' p_row_id-index '行,学校字段的值为' gs_student-zschool.
ENDIF.
ENDFORM.
FORM fm_double_click USING p_row TYPE lvc_s_row
p_column TYPE lvc_s_col.
DATA lv_value TYPE c LENGTH 20.
DATA ls_col TYPE lvc_s_col.
CALL METHOD gs_alv->get_current_cell
IMPORTING
* e_row =
e_value = lv_value
* e_col =
* es_row_id =
es_col_id = ls_col
* es_row_no =
.
* 单击了xxx字段,值为xxx
MESSAGE s000 WITH '单击了' ls_col-fieldname '字段,值为' lv_value.
ENDFORM.
FORM change_edit_mode .
DATA lv_lines TYPE i.
DATA ls_modify TYPE lvc_s_styl.
* 1.获取选中的行 - 一行
CALL METHOD gs_alv->get_selected_rows
IMPORTING
et_index_rows = gt_rows
* et_row_no =
.
DESCRIBE TABLE gt_rows LINES lv_lines."行数
IF lv_lines <> 1.
MESSAGE s000 WITH '只可以选择单行进行可编辑操作' DISPLAY LIKE 'E'.
EXIT.
ENDIF.
* 2.修改当前行的可修改状态
READ TABLE gt_rows INTO gs_rows INDEX 1."读取选中的行的序号
CHECK sy-subrc = 0.
READ TABLE gt_student INTO gs_student INDEX gs_rows-index.
IF sy-subrc = 0.
*GS_STUDENT-FIELD MODIFY
*查看表中是否已经存在针WEIGH字段的可编辑状态
READ TABLE gs_student-field_modify INTO ls_modify WITH KEY fieldname = 'WEIGH'.
IF sy-subrc = 0."当前已经存在设定的状杰-当前是不可修改的状态
DELETE gs_student-field_modify INDEX sy-tabix ."把不可修改的状态去趋
ELSE ."当前是可修改的状态
"不用做操作
ENDIF.
MODIFY gt_student FROM gs_student INDEX gs_rows-index.
ENDIF.
* 3.刷新界面
PERFORM refresh_alv.
ENDFORM.
*注册和调用
FORM set_handler .
CREATE OBJECT event_handle.
SET HANDLER event_handle->handle_toolbar FOR gs_alv.
SET HANDLER event_handle->handle_user_command FOR gs_alv.
SET HANDLER event_handle->handle_HOTSPOT_CLICK FOR gs_alv.
SET HANDLER event_handle->handle_DOUBLE_CLICK FOR gs_alv.
SET HANDLER event_handle->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.