ALV详解:OO SALV

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4291387.html

OOSALV.. 123

三种显示模式... 123

全屏模式... 125

全屏经典列表模式... 126

可控模式... 126

CL_SALV_TABLE设置相关方法... 128

样式设置... 130

显示设置... 130

布局变式... 131

类似的Fieldcat. 133

隐藏字段(列)... 134

设置列标题... 135

设置列的颜色... 136

优化列宽... 137

SALV行列选择模式... 138

以弹出框显示SALV.. 139

排序、分类汇总... 140

设置数据过滤条件... 145

GUI Status. 147

使用预置的GUI Status. 147

在预设置工具栏上附加按钮... 148

事件... 150

DOUBLE_CLICK双击事件... 150

LINK_CLICK热点点击事件... 152

ADDED_FUNCTION附加功能(按钮)事件... 154

红绿灯、灯提示信息... 156

图标显示、图标提示信息... 158

设置单元格颜色

OOSALV

在Net Weaver2004平台上集合了利用函数和GRID的功能发布的SALV包程序(SALV也称为New ALV)。

SALV可以像使用函数方式生成ALV那样,不用创建屏幕就可以调用的全屏方式显示的ALV

SALV的GRID报表可以在后台运行,但以前函数方式或OO方式生成的GRID不能?

SALV与现有的方法(Function ALV)相比,为了方便以接口的方式提供更整合及细微的功能,但SALV不提供编辑功能(但可以通过SALV适配器调用CL_GUI_ALV_GRID修改成编辑模式,就可以在ALV中修改数据了)

更多的实例请参考SALV程序包(Package),里面有大量示例

SALV有以下三种类型的报表:

三种显示模式

l  全屏模式

l  全屏模式——Classic 报表模式(普通List列表)

l  利用控制器的模式(利用用户自定义控件区域来控制ALV显示大小)

与CL_GUI_ALV_GRID相似的是CL_SALV_TABLE类,通过其factory方法,生成SALV实例:

要显示ALV,只需要调用以下两个方法即可:

factory:静态方法。定义要显示在屏幕上的数据;定义ALV报表样式;调用此方法就会返回CL_SALV_TABLE类型的实例对象

display:实例方法。调用此方法屏幕上就显示ALV

LIST_DISPLAY:参数决定了列表显示的模式:是以List普通列表方式显示,还是Grid网格方式显示

R_CONTAINER用户自定义控件区域的引用对象,类型为CL_GUI_CONTAINER

CONTAINER_NAME:屏幕上用户自定义控件区域(Custom Control)的名称

上面三个参数与显示模式关系如下:


LIST_DISPLAY


R_CONTAINER


CONTAINER_NAME


全屏


ABAP_FALSE


初始值


初始值


Classic List


ABAP_TRUE


初始值


初始值


利用控制器


ABAP_FALSE


CL_GUI_CONTAINER对象引用


用户自定义控件区域(Custom Control)名称

全屏模式

与通过REUSE_ALV_GRID_DISPLAY函数产生的ALV相当:

DATA: gr_table TYPE REF TO cl_salv_table.
DATA:BEGIN OF gt_data OCCURS 0,
  key1 TYPE mara-matnr,"ALV标题行会参照词典类型
  key2(2),
  END OF gt_data.

START-OF-SELECTION.
  PERFORM inital.
  cl_salv_table=>factory(
    IMPORTINGr_salv_table = gr_table"用来接收工厂产生的实例
    CHANGING t_table = gt_data[] ).

gr_table->display( )."调用实例方法显示表报

FORM inital .
  gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  APPEND gt_data.
ENDFORM.

全屏经典列表模式

与通过REUSE_ALV_LIST_DISPLAY函数产生的ALV相当:

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_functions TYPE REF TO cl_salv_functions_list.
DATA:BEGIN OF gt_data OCCURS 0,
  key1 TYPE mara-matnr,"ALV标题行会参照词典类型
  key2(2),
  END OF gt_data.

START-OF-SELECTION.
  PERFORM inital.
  cl_salv_table=>factory(
   EXPORTINGlist_display = abap_true"以列表形式显示
    IMPORTING r_salv_table = gr_table"用来接收工厂产生的实例
    CHANGING t_table = gt_data[] ).
  gr_functions = gr_table->get_functions( ).
  gr_functions->set_default( )."Activate Standard Selection of Generic ALV Functions。激活工具栏中通用的选择性按钮。根据当前显示是List模式、还是Grid模式,来设置工具条上最基本的默认按钮,比gr_functions->set_all( abap_true)设置的按钮要少很多
  gr_table->display( ).

FORM inital .
  gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  APPEND gt_data.
ENDFORM.

可控模式

先绘制屏幕 100,然后在其上面放上用户自定义控件区域(Custom Control),并命名为CONTAINER_1:

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_functions TYPE REF TO cl_salv_functions_list.
DATA:gr_container TYPE REF TO cl_gui_custom_container.
DATA: ok_code TYPE syucomm.
DATA:BEGIN OF gt_data OCCURS 0,
  key1 TYPE mara-matnr,"ALV标题行会参照词典类型
  key2(2),
  END OF gt_data.

START-OF-SELECTION.
  CALL SCREEN 100.

FORM inital .
  gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  APPEND gt_data.
ENDFORM.

MODULE 100_pbo OUTPUT.
  PERFORM inital.
  "判断是否已分配了一个有效引用
  IF gr_container IS NOT BOUND.
    "创建容器
    CREATE OBJECT gr_container
      EXPORTING
        container_name = ‘CONTAINER_1‘."屏幕上用户自定义控件名
    "创建ALV
    cl_salv_table=>factory(
      EXPORTING
          r_container = gr_container
          container_name = ‘CONTAINER_1‘
      IMPORTING
          r_salv_table = gr_table
      CHANGING
          t_table = gt_data[] ).
   "设置工具栏
   gr_functions= gr_table->get_functions( ).
   gr_functions->set_all( abap_true). "Activate All Generic ALV Functions,将激活所有的ALV内置通用按钮

"显示
    gr_table->display( ).

ENDIF.
ENDMODULE.

CL_SALV_TABLE设置相关方法

对SALV进行设置,先需要通过CL_SALV_TABLE对象实例获取相关设置对象,然后再对这些设置对进行操作

如对样式的设置,需要先通过CL_SALV_TABLE对象的GET_LAYOUT( )方法拿到CL_SALV_LAYOUT对象,实后通过该对象相关方法对SALV进行设置;除样式外,如排序、工具栏设置、事件等,都是先通过某个GET*方法拿到相应对象,再通过该对象相关方法对SALV进行设置,这与以前Function ALV、及OO ALV不太一样。如上面程序中对SALV工具栏进行设置是这样的:

DATA: gr_functions TYPE REF TO cl_salv_functions_list.
gr_functions = gr_table->get_functions( ).
gr_functions->set_all( abap_true).

CL_SALV_TABLE类GET*相关方法:

样式设置

显示设置

SET_VERTICAL_LINES:设置是否显示垂直线

SET_HORIZONTAL_LINES:设置是否显示水平线

SET_STRIPED_PATTERN:斑马条纹(行颜色交替)

SET_LIST_HEADER_SIZE:报表头

SET_FIT_COLUMN_TO_TABLE_SIZE:列自适应表格宽度

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_display TYPE REF TO cl_salv_display_settings.
DATA:BEGIN OF gt_data OCCURS 0,
  key1 TYPE mara-matnr,"ALV标题行会参照词典类型
  key2(2),
  END OF gt_data.

START-OF-SELECTION.
  PERFORM inital.
  cl_salv_table=>factory(
    IMPORTING r_salv_table = gr_table"用来接收工厂产生的实例
    CHANGING t_table = gt_data[] ).

gr_display = gr_table->get_display_settings( ).
  gr_display->set_striped_pattern( cl_salv_display_settings=>true ).
  gr_display->set_list_header(‘Header Test‘).

gr_table->display( ). "调用实例方法显示表报

FORM inital .
  gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  APPEND gt_data.
  gt_data-key1 = ‘b‘.
  gt_data-key2 = ‘bb‘.
  APPEND gt_data.
ENDFORM.

布局变式

F4_LAYOUTS

SET_DEFAULT

SET_INITIAL_LAYOUT

SET_KEY

SET_SAVE_RESTRICTION

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_layout TYPE REF TO cl_salv_layout.
DATA: gs_program TYPE salv_s_layout_key."该结构包含了布局变式所属程序名
DATA:BEGIN OF gt_data OCCURS 0,
  key1 TYPE mara-matnr,"ALV标题行会参照词典类型
  key2(2),
  END OF gt_data.

START-OF-SELECTION.
  PERFORM inital.
  cl_salv_table=>factory(
    IMPORTING r_salv_table = gr_table"用来接收工厂产生的实例
    CHANGING t_table = gt_data[] ).

gr_layout = gr_table->get_layout( ).
  gs_program-report = sy-repid.
  gr_layout->set_key( gs_program )."设置布局保存为变式时,这些变式应属性此Key(本程序名)
  gr_layout->set_save_restriction( cl_salv_layout=>restrict_none )."允许保存布局为变式

gr_table->display( ).

FORM inital .
  gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  APPEND gt_data.
  gt_data-key1 = ‘b‘.
  gt_data-key2 = ‘bb‘.
  APPEND gt_data.
ENDFORM.

类似的Fieldcat

Function ALV、OO ALV可通过Fieldcat对列进行相关设置,SALV也有类似于这样的东西,只不过不是Fieldcat,而是通过CL_SALV_COLUMN对象来实现的。CL_SALV_COLUMN的获取过程如下:

隐藏字段(列)

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.

DATA:BEGIN OF gt_data OCCURS 0,
  key1 TYPE mara-matnr,"ALV标题行会参照词典类型
  key2(2),
  END OF gt_data.

START-OF-SELECTION.
  PERFORM inital.
  cl_salv_table=>factory(
    IMPORTING r_salv_table = gr_table"用来接收工厂产生的实例
    CHANGING t_table = gt_data[] ).

gr_columns = gr_table->get_columns( ).
  gr_column ?= gr_columns->get_column( ‘KEY1‘ )."需处理的列
  gr_column->set_visible( cl_salv_column_table=>false )."隐藏列,注:这里虽然是隐藏了,但在布局设置里还是可以看到此列的,如果使布局里也看不到,则需要gr_column->set_technical( ‘X‘ ).

gr_table->display( ).

FORM inital .
  gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  APPEND gt_data.
ENDFORM.

设置列标题

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.

DATA:BEGIN OF gt_data OCCURS 0,
  key1 TYPE mara-matnr,"ALV标题行会参照词典类型
  key2(2),
  END OF gt_data.

START-OF-SELECTION.
  PERFORM inital.
cl_salv_table=>factory(
    IMPORTING r_salv_table = gr_table"用来接收工厂产生的实例
    CHANGING t_table = gt_data[] ).

gr_columns= gr_table->get_columns( ).
  gr_column ?= gr_columns->get_column( ‘KEY2‘ )."需处理的列
  gr_column->set_long_text( ‘key2‘ ).
  gr_column->set_medium_text( ‘key2‘ ).
  gr_column->set_short_text( ‘key2‘ ).
 gr_table->display( ).

FORM inital .
  gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  APPEND gt_data.
ENDFORM.

设置列的颜色


DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
DATA: g_color TYPE lvc_s_colo.

DATA:BEGIN OF gt_data OCCURS 0,
  key1 TYPE mara-matnr,"ALV标题行会参照词典类型
  key2(2),
  END OF gt_data.

START-OF-SELECTION.
  PERFORM inital.
  cl_salv_table=>factory(
    IMPORTING r_salv_table = gr_table"用来接收工厂产生的实例
    CHANGING t_table = gt_data[] ).

gr_columns = gr_table->get_columns( ).
  gr_column ?= gr_columns->get_column( ‘KEY2‘ )."需处理的列
  g_color-col = ‘6‘.
  g_color-int = ‘1‘.
  g_color-inv = ‘0‘.
  gr_column->set_color( g_color ).

gr_table->display( ).

FORM inital .
  gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  APPEND gt_data.
  gt_data-key1 = ‘b‘.
  gt_data-key2 = ‘bb‘.
  APPEND gt_data.
ENDFORM.

优化列宽

相当于Function ALV所使用Layout的colwidth_optimize属性

优化前:

优化后:

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.

DATA:BEGIN OF gt_data OCCURS 0,
  key1 TYPE mara-matnr,"ALV标题行会参照词典类型
  key2(20),
  END OF gt_data.

START-OF-SELECTION.
  PERFORM inital.
  cl_salv_table=>factory(
    IMPORTING r_salv_table = gr_table"用来接收工厂产生的实例
    CHANGING t_table = gt_data[] ).

gr_columns = gr_table->get_columns( ).
  gr_columns->set_optimize( ‘X‘ ).

gr_table->display( ).

FORM inital .
  gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  APPEND gt_data.
  gt_data-key1 = ‘b‘.
  gt_data-key2 = ‘bbbbbbbb‘.
  APPEND gt_data.
ENDFORM.

SALV行列选择模式

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_selection TYPE REF TO cl_salv_selections.

DATA:BEGIN OF gt_data OCCURS 0,
  key1 TYPE mara-matnr,"ALV标题行会参照词典类型
  key2(20),
  END OF gt_data.

START-OF-SELECTION.
  PERFORM inital.
  cl_salv_table=>factory(
    IMPORTING r_salv_table = gr_table"用来接收工厂产生的实例
    CHANGING t_table = gt_data[] ).

gr_selection = gr_table->get_selections( ).
  gr_selection->set_selection_mode( if_salv_c_selection_mode=>row_column )."可以以行、列的方式进行选择

gr_table->display( ).

FORM inital .
  gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  APPEND gt_data.
  gt_data-key1 = ‘b‘.
  gt_data-key2 = ‘bbbbbbbb‘.
  APPEND gt_data.
ENDFORM.

以弹出框显示SALV

可控模式(利用控制器的模式)的SALV是不能以弹出框来显示的

DATA: gr_table TYPE REF TO cl_salv_table.

DATA:BEGIN OF gt_data OCCURS 0,
  key1 TYPE mara-matnr,"ALV标题行会参照词典类型
  key2(20),
  END OF gt_data.

START-OF-SELECTION.
  PERFORM inital.
  cl_salv_table=>factory(
    IMPORTING r_salv_table = gr_table
    CHANGING t_table = gt_data[] ).
  gr_table->set_screen_popup(
    start_column = 1
    end_column = 50
    start_line = 1
    end_line = 5 ).
  gr_table->display( ).

FORM inital .
  gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  APPEND gt_data.
  gt_data-key1 = ‘b‘.
  gt_data-key2 = ‘bbbbbbbb‘.
  APPEND gt_data.
ENDFORM.

排序、分类汇总

该示例与前面Function ALV的示例效果是一样的

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_sorts TYPE REF TO cl_salv_sorts.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
DATA: gr_agg TYPE REF TO cl_salv_aggregations.

DATA:BEGIN OF gt_data OCCURS 0,
  key1(1),
  key2(2),
  str(3),
  int1 TYPE i,
  int2 TYPE i,
  int3 TYPE i,
  END OF gt_data.

START-OF-SELECTION.
  PERFORM inital.

cl_salv_table=>factory(
      IMPORTING r_salv_table = gr_table
      CHANGING t_table = gt_data[] ).

gr_columns= gr_table->get_columns( ).
  gr_column ?= gr_columns->get_column( ‘KEY1‘ ).
  gr_column->set_long_text( ‘key1‘ ).
  gr_column ?= gr_columns->get_column( ‘KEY2‘ ).
  gr_column->set_long_text( ‘key2‘ ).
  gr_column ?= gr_columns->get_column( ‘STR‘ ).
  gr_column->set_long_text( ‘str‘ ).
  gr_column ?= gr_columns->get_column( ‘INT1‘ ).
  gr_column->set_long_text( ‘int1‘ ).
  gr_column ?= gr_columns->get_column( ‘INT2‘ ).
  gr_column->set_long_text( ‘int2‘ ).
  gr_column ?= gr_columns->get_column( ‘INT3‘ ).
  gr_column->set_long_text( ‘int3‘ ).

gr_sorts = gr_table->get_sorts( ).
  gr_sorts->add_sort(
    columnname = ‘KEY1‘
    position = 1 "排序的顺序,如果根据多个字段来排时,决定哪个先排
    sequence = if_salv_c_sort=>sort_up "升序
    "是否需要以此字段进行分类小计
    subtotal = if_salv_c_bool_sap=>true
  ).

gr_sorts->add_sort(
    columnname = ‘KEY2‘
    position = 2
    sequence = if_salv_c_sort=>sort_down "降序
    subtotal = if_salv_c_bool_sap=>true
  ).

gr_agg = gr_table->get_aggregations( ).
  "需要进行分类小计及汇总的字段:INT1、INT2
  gr_agg->add_aggregation( ‘INT1‘ ). "决定此列是否进行分类汇总。注:如果先不进行排序,则只有汇总,不会进行分类小计
  gr_agg->add_aggregation( ‘INT2‘ ).

gr_table->display( ).

FORM inital .
  gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  gt_data-str = ‘aaa‘.
  gt_data-int1 = 2.
  gt_data-int2 = 1.
  gt_data-int3 = 8.
  APPEND gt_data.

gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  gt_data-str = ‘aab‘.
  gt_data-int1 = 3.
  gt_data-int2 = 2.
  gt_data-int3 = 7.
  APPEND gt_data.

gt_data-key1 = ‘c‘.
  gt_data-key2 = ‘aa‘.
  gt_data-str = ‘aab‘.
  gt_data-int1 = 4.
  gt_data-int2 = 2.
  gt_data-int3 = 6.
  APPEND gt_data.

gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘ab‘.
  gt_data-str = ‘aba‘.
  gt_data-int1 = 6.
  gt_data-int2 = 1.
  gt_data-int3 = 2.
  APPEND gt_data.

gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘ab‘.
  gt_data-str = ‘abb‘.
  gt_data-int1 = 3.
  gt_data-int2 = 4.
  gt_data-int3 = 2.
  APPEND gt_data.

gt_data-key1 = ‘e‘.
  gt_data-key2 = ‘ca‘.
  gt_data-str = ‘eca‘.
  gt_data-int1 = 2.
  gt_data-int2 = 2.
  gt_data-int3 = 4.
  APPEND gt_data.

gt_data-key1 = ‘b‘.
  gt_data-key2 = ‘ba‘.
  gt_data-str = ‘bba‘.
  gt_data-int1 = 8.
  gt_data-int2 = 5.
  gt_data-int2 = 2.
  APPEND gt_data.

gt_data-key1 = ‘b‘.
  gt_data-key2 = ‘bb‘.
  gt_data-str = ‘bbb‘.
  gt_data-int1 = 1.
  gt_data-int2 = 2.
  gt_data-int3 = 4.
  APPEND gt_data.

gt_data-key1 = ‘c‘.
  gt_data-key2 = ‘ca‘.
  gt_data-str = ‘cca‘.
  gt_data-int1 = 5.
  gt_data-int2 = 1.
  gt_data-int2 = 3.
  APPEND gt_data.

gt_data-key1 = ‘c‘.
  gt_data-key2 = ‘cc‘.
  gt_data-str = ‘ccc‘.
  gt_data-int1 = 2.
  gt_data-int2 = 1.
  gt_data-int3 = 5.
  APPEND gt_data.

gt_data-key1 = ‘d‘.
  gt_data-key2 = ‘ca‘.
  gt_data-str = ‘dca‘.
  gt_data-int1 = 4.
  gt_data-int2 = 6.
  gt_data-int3 = 2.
  APPEND gt_data.
ENDFORM.

设置数据过滤条件

ALV 的标准按钮中已经有过滤的功能,我们也可以在初始显示的时候就设置过滤条件

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_sorts TYPE REF TO cl_salv_sorts.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
DATA: gr_filter TYPE REF TO cl_salv_filters.

DATA:BEGIN OF gt_data OCCURS 0,
  key1(1),
  key2(2),
  str(3),
  int1 TYPE i,
  int2 TYPE i,
  int3 TYPE i,
  END OF gt_data.

START-OF-SELECTION.
  PERFORM inital.

cl_salv_table=>factory(
      IMPORTING r_salv_table = gr_table
      CHANGING t_table = gt_data[] ).

gr_columns = gr_table->get_columns( ).
  gr_column ?= gr_columns->get_column( ‘KEY1‘ ).
  gr_column->set_long_text( ‘key1‘ ).
  gr_column ?= gr_columns->get_column( ‘KEY2‘ ).
  gr_column->set_long_text( ‘key2‘ ).
  gr_column ?= gr_columns->get_column( ‘STR‘ ).
  gr_column->set_long_text( ‘str‘ ).
  gr_column ?= gr_columns->get_column( ‘INT1‘ ).
  gr_column->set_long_text( ‘int1‘ ).
  gr_column ?= gr_columns->get_column( ‘INT2‘ ).
  gr_column->set_long_text( ‘int2‘ ).
  gr_column ?= gr_columns->get_column( ‘INT3‘ ).
  gr_column->set_long_text( ‘int3‘ ).

gr_filter = gr_table->get_filters( ).
  "只有Key1为 a,str以ab开头的数据才显示出来
  gr_filter->add_filter(
    columnname = ‘KEY1‘
    sign = ‘I‘
    option = ‘EQ‘
    low = ‘a‘).
  gr_filter->add_filter(
    columnname = ‘STR‘
    sign = ‘I‘
    option = ‘CP‘
    low = ‘ab*‘).

gr_table->display( ).

FORM inital .
  gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  gt_data-str = ‘aaa‘.
  gt_data-int1 = 2.
  gt_data-int2 = 1.
  gt_data-int3 = 8.
  APPEND gt_data.

gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  gt_data-str = ‘aab‘.
  gt_data-int1 = 3.
  gt_data-int2 = 2.
  gt_data-int3 = 7.
  APPEND gt_data.

gt_data-key1 = ‘c‘.
  gt_data-key2 = ‘aa‘.
  gt_data-str = ‘aab‘.
  gt_data-int1 = 4.
  gt_data-int2 = 2.
  gt_data-int3 = 6.
  APPEND gt_data.

gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘ab‘.
  gt_data-str = ‘aba‘.
  gt_data-int1 = 6.
  gt_data-int2 = 1.
  gt_data-int3 = 2.
  APPEND gt_data.

gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘ab‘.
  gt_data-str = ‘abb‘.
  gt_data-int1 = 3.
  gt_data-int2 = 4.
  gt_data-int3 = 2.
  APPEND gt_data.
ENDFORM.

GUI Status

使用预置的GUI Status

注:若要设置自定义的GUI Status,只适用于全屏模式与全屏幕经典列表模式的SALV

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.

DATA:BEGIN OF gt_data OCCURS 0,
  key1 TYPE mara-matnr,
  key2(2),
  END OF gt_data.

START-OF-SELECTION.
  PERFORM inital.
  cl_salv_table=>factory("全屏模式的SALV
    IMPORTING r_salv_table = gr_table
    CHANGING t_table = gt_data[] ).

"设置工具条:只适用于全屏模式与全屏幕经典列表模式的SALV
  gr_table->set_screen_status(
     pfstatus = ‘T002‘"系统提示的标准Status为SAPLSALV_METADATA_STATUS程序中的SALV_TABLE_STANDARD
     report = sy-repid
     "注:此参数只对SALV标准的预设保留按钮起作用,也就是说,当 T001 GUI Status是从
     "系统中提供的标准Gui Staus拷贝时才起作用,即通用此参数来屏蔽或显示某些预置按钮
     "对自己完全新创建的GUI Status是的按钮(实质上是根据 FunCode来判断的)不起作用
     set_functions = gr_table->c_functions_all )."显示所有通用的预设按钮
     "set_functions = gr_table->c_functions_default )."显示基本默认选择性的预设按钮
     "set_functions = gr_table->c_functions_none )."所有预设按钮都将不会显示

gr_table->display( ).

FORM inital .
  gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  APPEND gt_data.
ENDFORM.

在预设置工具栏上附加按钮

附加按钮只适用于可控制模式(即用户对话屏幕)的SALV


DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_functions TYPE REF TO cl_salv_functions_list.
DATA:gr_container TYPE REF TO cl_gui_custom_container.
DATA: ok_code TYPE syucomm.
DATA:BEGIN OF gt_data OCCURS 0,
  key1 TYPE mara-matnr,
  key2(2),
  END OF gt_data.

START-OF-SELECTION.
  CALL SCREEN 100.

FORM inital .
  gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  APPEND gt_data.
ENDFORM.

MODULE 100_pbo OUTPUT.
  PERFORM inital.
  "判断是否已分配了一个有效引用
  IF gr_container IS NOT BOUND.
    "创建容器
    CREATE OBJECT gr_container
      EXPORTING
        container_name = ‘CONTAINER_1‘."屏幕上用户自定义控件名
    "创建ALV
    cl_salv_table=>factory(
      EXPORTING
          r_container = gr_container
          container_name = ‘CONTAINER_1‘
      IMPORTING
          r_salv_table = gr_table
      CHANGING
          t_table = gt_data[] ).

"附加刷新按钮
    DATA: lr_functions TYPE REF TO cl_salv_functions_list.
    lr_functions = gr_table->get_functions( ).
    lr_functions->set_all( abap_true )."Activate All Generic ALV Functions,将激活所有的ALV内置通用按钮
    INCLUDE <icon>.
    DATA: l_icon TYPE string.
    l_icon = icon_refresh.
    "附加按钮,只适用于 可控模式 下的SALV
    lr_functions->add_function(
      name = ‘refresh‘
      icon = l_icon
      text = ‘刷新按钮‘
      tooltip = ‘刷新数据‘
      "按钮存放的位置:这里在右边附加。该参数的其他取值可以查看该方法源码,可以
      "找到该参数其他取值的蛛丝马迹
      position = if_salv_c_function_position=>right_of_salv_functions ).

"显示
    gr_table->display( ).
  ENDIF.
ENDMODULE.

事件

DOUBLE_CLICK双击事件

CLASSl_cl_handle_events DEFINITION.
  PUBLIC SECTION.
    METHODS: on_double_click FOR EVENT double_click OF cl_salv_events_table
                  IMPORTING
                    row "事件触发所在的行号
                    column."事件触发所在的列名
ENDCLASS.

CLASS l_cl_handle_events IMPLEMENTATION.
  METHOD on_double_click.
    PERFORM show_cell_info USING row column ‘is selected‘.
  ENDMETHOD.
ENDCLASS.

DATA: gr_table TYPE REF TO cl_salv_table.

DATA:BEGIN OF gt_data OCCURS 0,
  key1 TYPE mara-matnr,
  key2(2),
  END OF gt_data.

START-OF-SELECTION.
  PERFORM inital.
  cl_salv_table=>factory(
    IMPORTING r_salv_table = gr_table
    CHANGING t_table = gt_data[] ).

"=====获取事件对象
  DATA: lr_event TYPE REF TO cl_salv_events_table.
  lr_event = gr_table->get_event( ).

"=====事件注册
  DATA: lr_handle_event TYPE REF TO l_cl_handle_events.
  CREATE OBJECT lr_handle_event.
  SET HANDLER lr_handle_event->on_double_click FOR lr_event.

gr_table->display( ).

FORM show_cell_info USING p_row TYPE i
                          p_column TYPE lvc_fname
                          p_text TYPE string.
  DATA: l_row TYPE char10.
  WRITE p_row TO l_row LEFT-JUSTIFIED.

CONCATENATE l_row ‘Line,‘ p_column ‘Column‘ p_text INTO p_text SEPARATED BY space.
  MESSAGE i001(00) WITH p_text.

ENDFORM.
FORM inital .
  gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  APPEND gt_data.
ENDFORM.

LINK_CLICK热点点击事件

CLASS l_cl_handle_events DEFINITION.
  PUBLIC SECTION.
    METHODS: on_link_click FOR EVENT link_click OF cl_salv_events_table
                  IMPORTING
                    row "事件触发所在的行号
                    column."事件触发所在的列名
ENDCLASS.

CLASS l_cl_handle_events IMPLEMENTATION.
  METHOD on_link_click.
    PERFORM show_cell_info USING row column ‘is selected with hotspot‘.
  ENDMETHOD.
ENDCLASS.

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.

DATA:BEGIN OF gt_data OCCURS 0,
  key1 TYPE mara-matnr,
  key2(2),
  END OF gt_data.

START-OF-SELECTION.
  PERFORM inital.
  cl_salv_table=>factory(
    IMPORTING r_salv_table = gr_table
    CHANGING t_table = gt_data[] ).

"设置热点列
  gr_columns = gr_table->get_columns( ).
  gr_column ?= gr_columns->get_column( ‘KEY1‘).
  gr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).

"=====获取事件对象
  DATA: lr_event TYPE REF TO cl_salv_events_table.
  lr_event = gr_table->get_event( ).

"=====事件注册
  DATA: lr_handle_event TYPE REF TO l_cl_handle_events.
  CREATE OBJECT lr_handle_event.
  SET HANDLER lr_handle_event->on_link_click FOR lr_event.

gr_table->display( ).

FORM show_cell_info USING p_row TYPE i
                          p_column TYPE lvc_fname
                          p_text TYPE string.
  DATA: l_row TYPE char10.
  WRITE p_row TO l_row LEFT-JUSTIFIED.

CONCATENATE l_row ‘Line,‘ p_column ‘Column‘ p_text INTO p_text SEPARATED BY space.
  MESSAGE i001(00) WITH p_text.

ENDFORM.
FORM inital .
  gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  APPEND gt_data.
ENDFORM.

ADDED_FUNCTION附加功能(按钮)事件

在“在预设置工具栏上附加按钮”示例的基础上,增加按钮事件

CLASS l_cl_handle_events DEFINITION.
  PUBLIC SECTION.
    METHODS: on_user_command FOR EVENT added_function OF cl_salv_events_table
                  IMPORTING e_salv_function.
ENDCLASS.

CLASS l_cl_handle_events IMPLEMENTATION.
  METHOD on_user_command.
    PERFORM handle_user_command USING e_salv_function.
  ENDMETHOD.
ENDCLASS.

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_functions TYPE REF TO cl_salv_functions_list.
DATA:gr_container TYPE REF TO cl_gui_custom_container.

DATA:BEGIN OF gt_data OCCURS 0,
  key1 TYPE mara-matnr,
  key2(2),
  END OF gt_data.

START-OF-SELECTION.
  CALL SCREEN 100.

FORM inital .
  gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  APPEND gt_data.
ENDFORM.

MODULE 100_pbo OUTPUT.
  PERFORM inital.
  "判断是否已分配了一个有效引用
  IF gr_container IS NOT BOUND.
    "创建容器
    CREATE OBJECT gr_container
      EXPORTING
        container_name = ‘CONTAINER_1‘."屏幕上用户自定义控件名
    "创建ALV
    cl_salv_table=>factory(
      EXPORTING
          r_container = gr_container
          container_name = ‘CONTAINER_1‘
      IMPORTING
          r_salv_table = gr_table
      CHANGING
          t_table = gt_data[] ).

"附加刷新按钮
    DATA: lr_functions TYPE REF TO cl_salv_functions_list.
    lr_functions = gr_table->get_functions( ).
    lr_functions->set_all( abap_true ).
    INCLUDE <icon>.
    DATA: l_icon TYPE string.
    l_icon = icon_refresh.
    "附加按钮,只适用于 可控模式 下的SALV
    lr_functions->add_function(
      name = ‘REFRESH‘
      icon = l_icon
      text = ‘刷新按钮‘
      tooltip = ‘刷新数据‘
      "按钮存放的位置:这里在右边附加。该参数的其他取值可以查看该方法源码,可以
      "找到该参数其他取值的蛛丝马迹
      position = if_salv_c_function_position=>right_of_salv_functions ).

"=====获取事件对象
    DATA: lr_event TYPE REF TO cl_salv_events_table.
    lr_event = gr_table->get_event( ).

"=====事件注册
    DATA: lr_handle_event TYPE REF TO l_cl_handle_events.
    CREATE OBJECT lr_handle_event.
    SET HANDLER lr_handle_event->on_user_command FOR lr_event.

"显示
    gr_table->display( ).

ENDIF.
ENDMODULE.

FORM handle_user_command USING p_function TYPE salv_de_function.
  CASE p_function.
    WHEN ‘REFRESH‘.
      PERFORM inital.
      gr_table->refresh( ).
  ENDCASE.
ENDFORM.

红绿灯、灯提示信息

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.

DATA: BEGIN OF gt_data OCCURS 0,
  light(1), "信息灯列
  val(1),
END OF gt_data.

START-OF-SELECTION.
  PERFORM inital.
  cl_salv_table=>factory(
    IMPORTING r_salv_table = gr_table
    CHANGING t_table = gt_data[] ).

gr_columns = gr_table->get_columns( ).
  gr_columns->set_exception_column( ‘LIGHT‘ ).

gr_column ?= gr_columns->get_column( ‘LIGHT‘ ).
  "如果不通过下面set_ddic_reference方法来设置参
  "照某词典类型,则异常列标题固定显示为 Exception
  gr_column->set_long_text( ‘异常灯‘ ).
  DATA: s_ddic TYPE salv_s_ddic_reference.
  s_ddic-field = ‘FIELD‘.
  s_ddic-table = ‘SALV_S_DDIC_REFERENCE‘.

gr_column->set_ddic_reference( s_ddic ).
  gr_column ?= gr_columns->get_column( ‘VAL‘ ).
  gr_column->set_long_text( ‘异常值‘ ).

"==========为异常列单无格不同的值添加不同的冒泡提示
  DATA:lr_functional_settings TYPE REF TO cl_salv_functional_settings.
  lr_functional_settings = gr_table->get_functional_settings( ).
  DATA: lr_tooltips TYPE REF TO cl_salv_tooltips.
  lr_tooltips = lr_functional_settings->get_tooltips( ).

lr_tooltips->add_tooltip(
  "单元格显示类型:异常灯、图标、符号。即这里针对的是类型为 异常列 所有的单元格
    type = cl_salv_tooltip=>c_type_exception
    value = space"不同的图形不同的冒泡提示
    tooltip = ‘Undefined‘).
  lr_tooltips->add_tooltip(
    type = cl_salv_tooltip=>c_type_exception
    value = ‘1‘
    tooltip = ‘红灯‘).
  lr_tooltips->add_tooltip(
    type = cl_salv_tooltip=>c_type_exception
    value = ‘2‘
    tooltip = ‘黄灯‘).
  lr_tooltips->add_tooltip(
    type = cl_salv_tooltip=>c_type_exception
    value = ‘3‘
    tooltip = ‘绿灯‘).
  gr_table->display( ). "调用实例方法显示表报

FORM inital .
  gt_data-light = ‘ ‘. "取值范围为:空、1~3
  gt_data-val = ‘空‘.
  APPEND gt_data .

gt_data-light = ‘1‘.
  gt_data-val = ‘1‘.
  APPEND gt_data .

gt_data-light = ‘2‘.
  gt_data-val = ‘2‘.
  APPEND gt_data .

gt_data-light = ‘3‘.
  gt_data-val = ‘3‘.
  APPEND gt_data .
ENDFORM.

图标显示、图标提示信息

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
INCLUDE <icon>.
DATA: BEGIN OF gt_data OCCURS 0,
  icon TYPE icon_d, "图标
  val TYPE string,
END OF gt_data.

START-OF-SELECTION.
  PERFORM inital.
  cl_salv_table=>factory(
    IMPORTING r_salv_table = gr_table
    CHANGING t_table = gt_data[] ).

gr_columns= gr_table->get_columns( ).
  gr_column ?= gr_columns->get_column( ‘ICON‘ ).
  gr_column->set_icon( if_salv_c_bool_sap=>true ).
  gr_column->set_long_text( ‘图标‘ ).

gr_column ?= gr_columns->get_column( ‘VAL‘ ).
  gr_column->set_long_text( ‘图标值‘ ).

"==========为图标列单无格不同的值添加不同的冒泡提示
  DATA:lr_functional_settings TYPE REF TO cl_salv_functional_settings.
  lr_functional_settings = gr_table->get_functional_settings( ).
  DATA: lr_tooltips TYPE REF TO cl_salv_tooltips.
  lr_tooltips = lr_functional_settings->get_tooltips( ).

DATA: lvc_value TYPE lvc_value.
  lvc_value = icon_locked.
  lr_tooltips->add_tooltip(
  "单元格显示类型:异常灯、图标、符号。即这里针对的是类型为 图标列 所有的单元格
    type = cl_salv_tooltip=>c_type_icon
    value = lvc_value"不同的图形不同的冒泡提示
    tooltip = ‘锁定‘).
  lvc_value = icon_message_warning.
  lr_tooltips->add_tooltip(
    type = cl_salv_tooltip=>c_type_icon
    value = lvc_value
    tooltip = ‘警告‘).
  lvc_value = icon_unlocked.
  lr_tooltips->add_tooltip(
    type = cl_salv_tooltip=>c_type_icon
    value = lvc_value
    tooltip = ‘解锁‘).

gr_table->display( ). "调用实例方法显示表报

FORM inital .

gt_data-icon = icon_locked.
  "在前面加了等号,如果不加,也会直接输出图标,而不是文字
  gt_data-val = `[email protected]@`.
  APPEND gt_data .

gt_data-icon = icon_message_warning.
  gt_data-val = `[email protected]@`.
  APPEND gt_data .

gt_data-icon = icon_unlocked.
  gt_data-val = `[email protected]@`.
  APPEND gt_data .
ENDFORM.

设置单元格颜色

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.

DATA: g_color TYPE lvc_s_colo.

DATA:BEGIN OF gt_data OCCURS 0,
  key1 TYPE mara-matnr,
  key2(2),
  color TYPE lvc_t_scol,
  END OF gt_data.

START-OF-SELECTION.
  PERFORM inital.
  cl_salv_table=>factory(
    IMPORTING r_salv_table = gr_table"用来接收工厂产生的实例
    CHANGING t_table = gt_data[] ).

FIELD-SYMBOLS: <ls_outtab> LIKE gt_data.
  DATA: lt_color TYPE lvc_t_scol,
        ls_color TYPE lvc_s_scol.

LOOP AT gt_data ASSIGNING <ls_outtab>.
    CLEAR: ls_color,lt_color.
    IF <ls_outtab>-key1 = ‘a‘.
      ls_color-fname = ‘KEY1‘."为哪列设置颜色
      ls_color-color-col = ‘6‘."颜色值
      ls_color-color-int = ‘0‘."加深
      ls_color-color-inv = ‘0‘."前景背景颜色反转
      APPEND ls_color TO  lt_color.
    ENDIF.
    IF <ls_outtab>-key2 = ‘bb‘.
      ls_color-fname = ‘KEY2‘.
      ls_color-color-col = ‘5‘.
      ls_color-color-int = ‘0‘.
      ls_color-color-inv = ‘0‘.
      APPEND ls_color TO  lt_color.
    ENDIF.
    <ls_outtab>-color = lt_color.
  ENDLOOP.

gr_columns = gr_table->get_columns( ).
  gr_columns->set_color_column( ‘COLOR‘ ).
  gr_table->display( ).

FORM inital .
  gt_data-key1 = ‘a‘.
  gt_data-key2 = ‘aa‘.
  APPEND gt_data.
  gt_data-key1 = ‘b‘.
  gt_data-key2 = ‘bb‘.
  APPEND gt_data.
ENDFORM.

时间: 2024-10-11 06:56:25

ALV详解:OO SALV的相关文章

ALV详解:OO ALV

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4291373.html OO ALV.. 79 EnjoySAP Controls and CFW... 79 LVC_S_FCAT. 84 LVC_S_LAYO.. 88 set_table_for_first_dispaly()方法参数.

ALV详解:Function ALV(一)

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4291337.html Function ALV.. 5 Layout结构... 5 Fieldcat结构... 7 ALV相关函数... 9 简单实例... 13 Fieldcat动态创建... 15 通过编程创建... 15 通过REUS

ALV详解:Function ALV(二)

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4291344.html Function ALV.. 5 单元格数据修改后立即同步(即立即触发DATA_CHANGED事件)输出内表... 37 方法一:通过REUSE_ALV_GRID_DISPLAY 函数的i_grid_settings-

POSIX 线程详解(经典必看)

总共三部分: 第一部分:POSIX 线程详解                                   Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  2000 年 7 月 01 日 第二部分:通用线程:POSIX 线程详解,第 2部分       Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  20

Java--设计模式详解(23种)

一.设计模式的理解 刚开始“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把锁的模式,目的仅仅是着眼于解决现在的问题,而设计模式的“复杂”就在于它是要构造一个“万能钥匙”,目的是提出一种对所有锁的开锁方案.在真正理解设计模式之前我一直在编写“简单”的代码.这个“简单”不是功能的简单,而是设计的简单.简单的设计意味着缺少灵活性,代码很钢硬,只在这个项目里有用,拿到其它的项目中就是垃圾,我

PHP5.2至5.6的新增功能详解

截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5.3 [注].因为 PHP 那"集百家之长"的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣.本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征. PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束 PHP5.2:JSON 支持 PHP5.3:弃用的功能,匿名函数

WPF依赖属性详解

WPF依赖属性详解 WPF 依赖属性 英文译为 Dependency Properties,是WPF引入的一种新类型的属性,在WPF中有着极为广泛的应用,在WPF中对于WPF Dependency Properties 的使用贯穿样式的使用,数据绑定,动画等等,在刚刚接触Dependency Properties的时候可能觉得有些奇怪,但是,当你了解他要解决的问题的时候,你可能就不觉得奇怪了.Dependency Properties第一个要解决的问题就是控件的属性共享问题,由于大部分的WPF控

Linux find命令详解

find详解 Linux系统有两个命令可用于查找文件系统上符合查询条件的文件: locate find 1. locate命令 locate命令主要用于查找系统文件,其工作特性如下: 查找速度快.locate命令是基于linux的文件系统之外构建的一个文件目录索引数据库进行文件查询的,即locate命令是依赖于事先构建好的索引库,而非直接遍历linux系统下的所有文件来进行文件查找的. 模糊查找.如果不加任何参数进行搜索,只要包含搜索字符的目录.文件都会全部搜索出来. 非实时查找.locate的

.NET 高级架构师0004 架构师之路(3)---详解面向对象

 详解面向对象的编程(OOP) 3.5.1 什么是面向对象    刚接触编程的时候,多数人本能的反映可能是面向过程(OP)的,而不是面向对象(OO)的.这种现象其实是很正常的,改变思维方式是需要一个过程的,我大体归纳了一下其形成的原因: 1.直接原因    你还没有养成面向对象分析问题和解决问题的习惯.建立面向对象的思维方式需要一定时间的训练和揣摩才能形成,所以你可以在学习或具体项目中刻意地强化这种意识.一般情况下,经过一段时间之后,你会觉得这是自然而然的事情,只有心中OO,眼中自然OO了. 2