OO实现ALV(二)<转>

一、ALV的功能设计

细心的读者肯定已经注意前面的两个例子少了点什么,少了ALV提供的标准功能,比如排序,过滤,汇总,等,以及用户可以在ALV的功能栏上加上自己自定义的功能按钮。

ALV的标准功能可以通过类CL_SALV_FUNCTIONS和CL_SALV_FUNCTION来设计,通过这两个类你可以对ALV提供的标准功能可见或不可见。也可以自己创建GUI STATUS设置自己的ALV功能,通过GUI STATUS来设置ALV的功能是通过类CL_SALV_TABLE的方法SET_SCREEN_STATUS来实现的。

1.首先我们要取得类CL_SALV_FUNCTIONS的实例,根据类CL_SALV_TABLE的方法get_functions可以取得功能实例。

lr_functions = gr_table->get_functions( ).

lr_functions->set_all( 'X' ).

2.根据类CL_SALV_TABLE的方法设置功能栏。

gr_table->set_screen_status(

pfstatus = 'SALV_STANDARD'

report = sy-repid

set_functions = gr_table->c_functions_all ).

3.自定义功能的实现。ALV的自定义功能的实现动作要通过类的事件来处理。

首先定义事件的操作类

CLASS lcl_handle_events DEFINITION.

PUBLIC SECTION.

CLASS-METHODS: on_user_command FOR EVENT added_function OF cl_salv_events

IMPORTING e_salv_function.

ENDCLASS. "lcl_handle_events DEFINITION

实现事件的操作类

CLASS lcl_handle_events IMPLEMENTATION.

METHOD on_user_command.

DATA l_string TYPE string.

CONCATENATE 'Function is ' e_salv_function

INTO l_string

SEPARATED BY space.

MESSAGE i000(0k) WITH l_string.

ENDMETHOD. "on_user_command

ENDCLASS. "lcl_handle_events IMPLEMENTATION

注册事件

SET HANDLER lcl_handle_events=>on_user_command FOR lr_events.

下面是程序的所有代码:

REPORT y_xin_002.

TYPES ty_spfli TYPE spfli OCCURS 0. "变量定义

DATA: gr_table TYPE REF TO cl_salv_table.

*----------------------------------------------------------------------*

* CLASS lcl_handle_events DEFINITION

*----------------------------------------------------------------------*

* 事件处理类(定义)

*----------------------------------------------------------------------*

CLASS lcl_handle_events DEFINITION.

PUBLIC SECTION.

CLASS-METHODS: on_user_command FOR EVENT added_function OF cl_salv_events

IMPORTING e_salv_function.

ENDCLASS. "lcl_handle_events DEFINITION

*----------------------------------------------------------------------*

* CLASS lcl_handle_events IMPLEMENTATION

*----------------------------------------------------------------------*

* 事件处理类(实现)

*----------------------------------------------------------------------*

CLASS lcl_handle_events IMPLEMENTATION.

METHOD on_user_command.

DATA l_string TYPE string.

CONCATENATE 'Function is ' e_salv_function

INTO l_string

SEPARATED BY space.

MESSAGE i000(0k) WITH l_string.

ENDMETHOD. "on_user_command

ENDCLASS. "lcl_handle_events IMPLEMENTATION

*----------------------------------------------------------------------*

* CLASS lcl_alv DEFINITION

*----------------------------------------------------------------------*

* ALV操作类(定义)

*----------------------------------------------------------------------*

CLASS lcl_alv DEFINITION.

PUBLIC SECTION.

METHODS: getdata "取得要显示的数据

RETURNING value(lt_tab) TYPE ty_spfli,

alv_full "全屏Grid列表处理方法

IMPORTING value(lt_tab) TYPE ty_spfli,

main. "主方法

ENDCLASS. "lcl_alv DEFINITION

*----------------------------------------------------------------------*

* CLASS lcl_alv IMPLEMENTATION

*----------------------------------------------------------------------*

* ALV操作类(实现)

*----------------------------------------------------------------------*

CLASS lcl_alv IMPLEMENTATION.

METHOD getdata. "取得要显示的数据==========================

SELECT * INTO TABLE lt_tab FROM spfli.

ENDMETHOD. "getdata

METHOD alv_full. "输出全屏网格列表的方法==========================

DATA: lr_functions TYPE REF TO cl_salv_functions,

lr_events TYPE REF TO cl_salv_events.

TRY.

cl_salv_table=>factory( "创建实例

IMPORTING

r_salv_table = gr_table

CHANGING

t_table = lt_tab).

CATCH cx_salv_msg.

ENDTRY.

lr_events = gr_table->get_event( ).

gr_table->set_screen_status( "设置ALV功能

pfstatus = 'SALV_STANDARD'

report = sy-repid

set_functions = gr_table->c_functions_all )

SET HANDLER lcl_handle_events=>on_user_command FOR lr_events. "注册事件

gr_table->display( ). "显示列表

ENDMETHOD. "alv_full

METHOD main. "主方法,整合数据==================================

DATA: lt_tab TYPE TABLE OF spfli.

lt_tab = me->getdata( ). "取得要显示的数据

me->alv_full( lt_tab ). "显示数据

ENDMETHOD. "main

ENDCLASS. "lcl_alv IMPLEMENTATION

START-OF-SELECTION. "报表执行========================================

DATA lr_alv TYPE REF TO lcl_alv.

CREATE OBJECT lr_alv.

lr_alv->main( ).

二、ALV的显示样式

通过类CL_SALV_DISPLAY_SETTINGS我们可以设置ALV的显示样式,主要包括ALV表头名称,列表颜色间隔显示,水平线是否显示,竖线是否显示等。

1.首先我们要取得类CL_SALV_DISPLAY_SETTINGS的实例,根据类CL_SALV_TABLE的方法get_display_settings可以取得显示样式的实例。

lr_display = gr_table->get_display_settings( ).

2.然后通过类CL_SALV_DISPLAY_SETTINGS的方法设置显示属性。

lr_display = gr_table->get_display_settings( ).

lr_display->set_striped_pattern( 'X' ). "设置颜色间隔显示

lr_display->set_list_header( 'Xin''s ALV' ). "设置ALV的抬头

lr_display->set_horizontal_lines( '' ). "设置水平线是否显示

lr_display->set_vertical_lines( '' ). "设置垂直线是否显示

下面是程序的所有代码:

REPORT y_xin_002.

*变量定义

TYPES ty_spfli TYPE spfli OCCURS 0.

DATA: gr_table TYPE REF TO cl_salv_table.

*----------------------------------------------------------------------*

* CLASS lcl_alv DEFINITION

*----------------------------------------------------------------------*

* ALV操作类(定义)

*----------------------------------------------------------------------*

CLASS lcl_alv DEFINITION.

PUBLIC SECTION.

METHODS: getdata "取得要显示的数据

RETURNING value(lt_tab) TYPE ty_spfli,

alv_full "全屏Grid列表处理方法

IMPORTING value(lt_tab) TYPE ty_spfli,

main. "主方法

ENDCLASS. "lcl_alv DEFINITION

*----------------------------------------------------------------------*

* CLASS lcl_alv IMPLEMENTATION

*----------------------------------------------------------------------*

* ALV操作类(实现)

*----------------------------------------------------------------------*

CLASS lcl_alv IMPLEMENTATION.

*取得要显示的数据=======================================================

METHOD getdata.

SELECT * INTO TABLE lt_tab FROM spfli.

ENDMETHOD. "getdata

*输出全屏网格列表的方法==================================================

METHOD alv_full.

DATA: lr_functions TYPE REF TO cl_salv_functions,

lr_display TYPE REF TO cl_salv_display_settings.

data boolean type c.

"创建实例

TRY.

cl_salv_table=>factory(

IMPORTING

r_salv_table = gr_table

CHANGING

t_table = lt_tab

).

CATCH cx_salv_msg.

ENDTRY.

"显示ALV的标准功能

lr_functions = gr_table->get_functions( ).

lr_functions->set_all( 'X' ).

"设置ALV的显示样式

lr_display = gr_table->get_display_settings( ).

lr_display->set_striped_pattern( 'X' ). "设置颜色间隔显示

lr_display->set_list_header( 'Xin''s ALV' ). "设置ALV的抬头

lr_display->set_horizontal_lines( '' ). "设置水平线是否显示

lr_display->set_vertical_lines( '' ). "设置垂直线是否显示

"显示列表

gr_table->display( ).

ENDMETHOD. "alv_full

*主方法,整合数据=======================================================

METHOD main.

DATA: lt_tab TYPE TABLE OF spfli.

"取得要显示的数据

lt_tab = me->getdata( ).

me->alv_full( lt_tab ).

ENDMETHOD. "main

ENDCLASS. "lcl_alv IMPLEMENTATION

*报表执行=======================================================

START-OF-SELECTION.

DATA lr_alv TYPE REF TO lcl_alv.

CREATE OBJECT lr_alv.

lr_alv->main( ).

三、ALV的栏位属性

ALV的栏位属性是SAP提供的ALV功能的比较重要的一个,详细的功能包括异常状态图标、图标、符号、复选框、按钮、热点、超链接、单元格类型、单元格颜色、某一栏位颜色、某一行颜色,栏位隐藏等等。ALV的栏位功能主要是通过CL_SALV_COLUMN_TABLE和CL_SALV_COLUMNS_TABLE这两个类的实现的。

1.首先我们要取得类CL_SALV_COLUMNS_TABLE的实例。

DATA lr_columns TYPE REF TO cl_salv_columns_table.

lr_columns = gr_table->get_columns( ).

2.然后通过类CL_SALV_COLUMNS_TABLE的方法get_column(value)取得指定的栏位的CL_SALV_COLUMN_TABLE的实例,取指定的栏位的实例之后,你就可以对这个栏位的相关属性进行设置。

DATA lr_column TYPE REF TO cl_salv_column_table

lr_column ?= lr_columns->get_column( 'MANDT' ).

3.取得指定的栏位的实例之后,在这个实例的基础上进行相关的属性设置。

a) 异常状态图标

lr_columns->set_exception_column( 'EXCEPTION' ).

lr_column ?= lr_columns->get_column( 'EXCEPTION' ).

lr_column->set_short_text( 'except' ).

b) 图标

lr_column ?= lr_columns->get_column( 'ICON' ).

lr_column->set_icon( 'X' ).

lr_column->set_long_text( 'ICON' ).

c) 符号

lr_column ?= lr_columns->get_column( 'SYMBOL' ).

lr_column->set_symbol( 'X' ).

lr_column->set_long_text( 'SYMBOL' ).

d) 复选框

lr_column ?= lr_columns->get_column( 'CHECKBOX' ).

lr_column->set_cell_type( if_salv_c_cell_type=>checkbox ).

lr_column->set_long_text( 'CHECKBOX' ).

e) 热点

lr_column ?= lr_columns->get_column( 'HOTSPOT' ).

lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).

lr_column->set_long_text( 'HOTSPOT' ).

f) 栏位不可见

lr_column ?= lr_columns->get_column( 'MANDT' ).

lr_column->set_visible( '' ).

g) 超链接[likai1]

lr_columns->set_hyperlink_entry_column( 'T_HYPERLINK' ).

lr_column ?= lr_columns->get_column( 'HYPERLINK' ).

lr_column->set_cell_type( if_salv_c_cell_type=>link ).

lr_column->set_long_text( 'HYPERLINK' ).

lr_hyperlinks = lr_functional_settings->get_hyperlinks().

LOOP AT gt_hyperlink INTO wa_hyperlink.

lr_hyperlinks->add_hyperlink(

handle = wa_hyperlink-handle

hyperlink = wa_hyperlink-hyperlink ).

ENDLOOP.

h) 栏位颜色

lr_column ?= lr_columns->get_column( 'FLTIME' ).

ls_color-col = 6.

ls_color-int = 0.

ls_color-inv = 0.

lr_column->set_color( ls_color ).

i) 行颜色和单元格颜色

lr_columns->set_color_column( 'T_COLOR' ).

j) 设置栏位显示长度最优化

lr_columns->set_optimize( 'X' ).

k) 设置标题栏是否可见

lr_columns->set_headers_visible( 'X' )

下面是程序的所有代码:

REPORTy_xin_002.

*变量定义

INCLUDE .

INCLUDE .

TYPES: BEGIN OF gs_spfli,

exception TYPE char1,

mandt TYPE spfli-mandt,

carrid TYPE spfli-carrid,

connid TYPE spfli-connid,

countryfr TYPE spfli-countryfr,

cityfrom TYPE spfli-cityfrom,

airpfrom TYPE spfli-airpfrom,

countryto TYPE spfli-countryto,

cityto TYPE spfli-cityto,

airpto TYPE spfli-airpto,

fltime TYPE spfli-fltime,

deptime TYPE spfli-deptime,

arrtime TYPE spfli-arrtime,

distance TYPE spfli-distance,

distid TYPE spfli-distid,

fltype TYPE spfli-fltype,

period TYPE spfli-period,

icon TYPE icon_d,

symbol TYPE icon_d,

checkbox TYPE char1,

hotspot TYPE icon_d,

hyperlink TYPE char255,

t_hyperlink TYPE salv_t_int4_column,

t_color TYPE lvc_t_scol,

t_celltype TYPE salv_t_int4_column,

END OF gs_spfli.

TYPES ty_spfli TYPE gs_spfli OCCURS 0.

DATA: gr_table TYPE REF TO cl_salv_table.

*----------------------------------------------------------------------*

* CLASS lcl_alv DEFINITION

*----------------------------------------------------------------------*

* ALV操作类(定义)

*----------------------------------------------------------------------*

CLASS lcl_alv DEFINITION.

PUBLIC SECTION.

METHODS: getdata "取得要显示的数据

RETURNING value(lt_tab) TYPE ty_spfli,

alv_full "全屏Grid列表处理方法

IMPORTING value(lt_tab) TYPE ty_spfli,

column_setting, "设置字段属性

main. "主方法

PRIVATE SECTION.

DATA: BEGIN OF wa_hyperlink,

handle TYPE salv_de_hyperlink_handle,

hyperlink TYPE service_rl,

END OF wa_hyperlink.

DATA gt_hyperlink LIKE TABLE OF wa_hyperlink.

ENDCLASS. "lcl_alv DEFINITION

*----------------------------------------------------------------------*

* CLASS lcl_alv IMPLEMENTATION

*----------------------------------------------------------------------*

* ALV操作类(实现)

*----------------------------------------------------------------------*

CLASS lcl_alv IMPLEMENTATION.

*取得要显示的数据=======================================================

METHOD getdata.

FIELD-SYMBOLS TYPE gs_spfli.

DATA: lwa_hyperlink TYPE LINE OF salv_t_int4_column,

lt_hyperlink LIKE TABLE OF lwa_hyperlink,

l_tabix TYPE sy-tabix,

ls_color TYPE lvc_s_scol,

lt_color TYPE lvc_t_scol,

ls_celltype TYPE salv_s_int4_column,

lt_celltype TYPE salv_t_int4_column.

DEFINE add_color.

clear ls_color.

ls_color-fname = &1.

ls_color-color-col = &2.

ls_color-color-int = 1.

ls_color-color-inv = 0.

ls_color-nokeycol = 'X'.

append ls_color to lt_color.

END-OF-DEFINITION.

SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_tab FROM spfli.

LOOP AT lt_tab ASSIGNING . "循环,为EXCEPTION等栏位赋值

l_tabix = sy-tabix.

-exception = '3'.

-icon = icon_okay.

-symbol = sym_document.

-checkbox = 'X'.

-hotspot = icon_overview.

REFRESH lt_hyperlink.

lwa_hyperlink-value = l_tabix.

lwa_hyperlink-columnname = 'HYPERLINK'.

APPEND lwa_hyperlink TO lt_hyperlink.

-t_hyperlink = lt_hyperlink.

-hyperlink = 'www.sina.com.cn'.

wa_hyperlink-handle = l_tabix.

wa_hyperlink-hyperlink = 'www.sina.com.cn'.

APPEND wa_hyperlink TO gt_hyperlink.

REFRESH lt_color.

IF -distance >= 5000.

CLEAR ls_color.

ls_color-fname = 'DISTANCE'.

ls_color-color-col = 5.

ls_color-color-int = 1.

ls_color-color-inv = 0.

APPEND ls_color TO lt_color.

ENDIF.

CLEAR ls_color.

ls_color-fname = 'COUNTRYFR'.

ls_color-color-col = 5.

ls_color-color-int = 1.

ls_color-color-inv = 0.

APPEND ls_color TO lt_color.

IF -countryfr IS NOT INITIAL.

add_color 'EXCEPTION' 4.

add_color 'MANDT' 4.

add_color 'CARRID' 4.

add_color 'CONNID' 4.

add_color 'COUNTRYFR' 4.

add_color 'CITYFROM' 4.

add_color 'AIRPFROM' 4.

add_color 'COUNTRYTO' 4.

add_color 'CITYTO' 4.

add_color 'AIRPTO' 4.

add_color 'FLTIME' 4.

add_color 'DEPTIME' 4.

add_color 'ARRTIME' 4.

add_color 'DISTANCE' 4.

add_color 'DISTID' 4.

add_color 'FLTYPE' 4.

add_color 'PERIOD' 4.

add_color 'ICON' 4.

add_color 'SYMBOL' 4.

add_color 'CHECKBOX' 4.

add_color 'HOTSPOT' 4.

add_color 'HYPERLINK' 4.

ENDIF.

-t_color = lt_color.

ENDLOOP.

ENDMETHOD. "getdata

*输出全屏网格列表的方法============================================

METHOD alv_full.

DATA: lr_functions TYPE REF TO cl_salv_functions.

TRY.

cl_salv_table=>factory( "创建实例

IMPORTING

r_salv_table = gr_table

CHANGING

t_table = lt_tab).

CATCH cx_salv_msg.

ENDTRY.

lr_functions = gr_table->get_functions( ). "显示ALV的标准功能

lr_functions->set_all( 'X' ).

me->column_setting( ). "设置栏位属性

gr_table->display( ). "显示列表

ENDMETHOD. "alv_full

*设置字段属性=======================================================

METHOD column_setting.

DATA: lr_columns TYPE REF TO cl_salv_columns_table,

lr_column TYPE REF TO cl_salv_column_table,

lr_functional_settings TYPE REF TO cl_salv_functional_settings,

lr_hyperlinks TYPE REF TO cl_salv_hyperlinks.

DATA: ls_color TYPE lvc_s_colo.

lr_columns = gr_table->get_columns( ).

lr_columns->set_optimize( 'X' ).

lr_columns->set_headers_visible( 'X' ). "设置标题栏是否可见

lr_functional_settings = gr_table->get_functional_settings( ).

TRY. "设置栏位不可见

lr_column ?= lr_columns->get_column( 'MANDT' ).

lr_column->set_visible( '' ).

lr_column ?= lr_columns->get_column( 'PERIOD' ).

lr_column->set_visible( '' ).

lr_column ?= lr_columns->get_column( 'FLTYPE' ).

lr_column->set_visible( '' ).

lr_column ?= lr_columns->get_column( 'DISTID' ).

lr_column->set_visible( '' ).

lr_column ?= lr_columns->get_column( 'DEPTIME' ).

lr_column->set_visible( '' ).

lr_column ?= lr_columns->get_column( 'ARRTIME' ).

lr_column->set_visible( '' ).

lr_columns->set_exception_column( 'EXCEPTION' )."设置异常栏位

lr_column ?= lr_columns->get_column( 'EXCEPTION' ).

lr_column->set_short_text( 'except' ).

lr_column->set_medium_text( 'exception' ).

lr_column->set_long_text( 'my exception' ).

lr_column ?= lr_columns->get_column( 'ICON' )."设置图标栏位

lr_column->set_icon( 'X' ).

lr_column->set_long_text( 'ICON' ).

lr_column ?= lr_columns->get_column( 'SYMBOL' )."设置符号栏位

lr_column->set_symbol( 'X' ).

lr_column->set_long_text( 'SYMBOL' ).

lr_column ?= lr_columns->get_column( 'CHECKBOX' )."设置复选框栏位

lr_column->set_cell_type( if_salv_c_cell_type=>checkbox ).

lr_column->set_long_text( 'CHECKBOX' ).

lr_column ?= lr_columns->get_column( 'HOTSPOT' )."设置热点

lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).

lr_column->set_long_text( 'HOTSPOT' ).

lr_columns->set_hyperlink_entry_column( 'T_HYPERLINK' )."设置超链接

lr_column ?= lr_columns->get_column( 'HYPERLINK' ).

lr_column->set_cell_type( if_salv_c_cell_type=>link ).

lr_column->set_long_text( 'HYPERLINK' ).

lr_hyperlinks = lr_functional_settings->get_hyperlinks( ).

LOOP AT gt_hyperlink INTO wa_hyperlink.

lr_hyperlinks->add_hyperlink(

handle = wa_hyperlink-handle

hyperlink = wa_hyperlink-hyperlink ).

ENDLOOP.

lr_column ?= lr_columns->get_column( 'FLTIME' )."设置栏位颜色

ls_color-col = 6.

ls_color-int = 0.

ls_color-inv = 0.

lr_column->set_color( ls_color ).

lr_columns->set_color_column( 'T_COLOR' ). "设置行颜色

CATCH cx_salv_not_found.

CATCH cx_salv_data_error.

CATCH cx_salv_existing.

ENDTRY.

ENDMETHOD. "column_setting

*主方法,整合数据=======================================================

METHOD main.

DATA: lt_tab TYPE ty_spfli.

lt_tab = me->getdata( ). "取得要显示的数据

me->alv_full( lt_tab ).

ENDMETHOD. "main

ENDCLASS. "lcl_alv IMPLEMENTATION

*报表执行=============================================================

START-OF-SELECTION.

DATA lr_alv TYPE REF TO lcl_alv.

CREATE OBJECT lr_alv.

lr_alv->main( ).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值