【转载】 OO ALV详解 BY 江正军


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有以下三种类型的报表:

image096

三种显示模式

l  全屏模式

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

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

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

image097

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

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

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

image098

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

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

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

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

 

LIST_DISPLAY

R_CONTAINER

CONTAINER_NAME

全屏

ABAP_FALSE

初始值

初始值

Classic List

ABAP_TRUE

初始值

初始值

利用控制器

ABAP_FALSE

CL_GUI_CONTAINER对象引用

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

全屏模式

image099

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

DATAgr_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(
    IMPORTING r_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.

全屏经典列表模式

image100

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

DATAgr_table TYPE REF TO cl_salv_table.
DATAgr_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(
    EXPORTING list_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)image064[1],并命名为CONTAINER_1:

image101

image102

 

DATAgr_table TYPE REF TO cl_salv_table.
DATAgr_functions TYPE REF TO cl_salv_functions_list.
DATA:gr_container TYPE REF TO cl_gui_custom_container.
DATAok_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_allabap_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工具栏进行设置是这样的:

DATAgr_functions TYPE REF TO cl_salv_functions_list.
gr_functions gr_table->get_functions( ).
gr_functions->set_allabap_true).

 

CL_SALV_TABLE类GET*相关方法:

image103

样式设置

显示设置

image104

SET_VERTICAL_LINES:设置是否显示垂直线

SET_HORIZONTAL_LINES:设置是否显示水平线

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

SET_LIST_HEADER_SIZE:报表头

SET_FIT_COLUMN_TO_TABLE_SIZE:列自适应表格宽度

image105

DATAgr_table TYPE REF TO cl_salv_table.
DATAgr_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_patterncl_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.

布局变式

image106

F4_LAYOUTS

SET_DEFAULT

SET_INITIAL_LAYOUT

SET_KEY

SET_SAVE_RESTRICTION

image107

DATAgr_table TYPE REF TO cl_salv_table.
DATAgr_layout TYPE REF TO cl_salv_layout.
DATAgs_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_keygs_program )."设置布局保存为变式时,这些变式应属性此Key(本程序名)
  gr_layout->set_save_restrictioncl_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的获取过程如下:

image108

image109

image110

隐藏字段(列)

image111

DATAgr_table TYPE REF TO cl_salv_table.
DATAgr_columns TYPE REF TO cl_salv_columns_table.
DATAgr_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.

设置列标题

image112


DATAgr_table TYPE REF TO cl_salv_table.
DATAgr_columns TYPE REF TO cl_salv_columns_table.
DATAgr_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.

设置列的颜色

image113
DATAgr_table TYPE REF TO cl_salv_table.
DATAgr_columns TYPE REF TO cl_salv_columns_table.
DATAgr_column TYPE REF TO cl_salv_column_table.
DATAg_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_colorg_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属性

优化前:image114

优化后:image115

DATAgr_table TYPE REF TO cl_salv_table.
DATAgr_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行列选择模式

image116

image117

DATAgr_table TYPE REF TO cl_salv_table.
DATAgr_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_modeif_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是不能以弹出框来显示的

image118

DATAgr_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 ).
  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的示例效果是一样的

image119

DATAgr_table TYPE REF TO cl_salv_table.
DATAgr_sorts TYPE REF TO cl_salv_sorts.
DATAgr_columns TYPE REF TO cl_salv_columns_table.
DATAgr_column TYPE REF TO cl_salv_column_table.
DATAgr_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 "排序的顺序,如果根据多个字段来排时,决定哪个先排
    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 的标准按钮中已经有过滤的功能,我们也可以在初始显示的时候就设置过滤条件

image120

DATAgr_table TYPE REF TO cl_salv_table.
DATAgr_sorts TYPE REF TO cl_salv_sorts.
DATAgr_columns TYPE REF TO cl_salv_columns_table.
DATAgr_column TYPE REF TO cl_salv_column_table.
DATAgr_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

DATAgr_table TYPE REF TO cl_salv_table.
DATAgr_columns TYPE REF TO cl_salv_columns_table.
DATAgr_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

image121
DATAgr_table TYPE REF TO cl_salv_table.
DATAgr_functions TYPE REF TO cl_salv_functions_list.
DATA:gr_container TYPE REF TO cl_gui_custom_container.
DATAok_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[] ).

    "附加刷新按钮
    DATAlr_functions TYPE REF TO cl_salv_functions_list.
    lr_functions gr_table->get_functions( ).
    lr_functions->set_allabap_true )."Activate All Generic ALV Functions,将激活所有的ALV内置通用按钮
    INCLUDE <icon>.
    DATAl_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双击事件

image122

CLASS l_cl_handle_events DEFINITION.
  PUBLIC SECTION.
    METHODSon_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.

DATAgr_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[] ).

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

  "=====事件注册
  DATAlr_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.
  DATAl_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(00WITH p_text.

ENDFORM.
FORM inital .
  gt_data-key1 'a'.
  gt_data-key2 'aa'.
  APPEND gt_data.
ENDFORM.

LINK_CLICK热点点击事件

image123

CLASS l_cl_handle_events DEFINITION.
  PUBLIC SECTION.
    METHODSon_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.

DATAgr_table TYPE REF TO cl_salv_table.
DATAgr_columns TYPE REF TO cl_salv_columns_table.
DATAgr_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_typeif_salv_c_cell_type=>hotspot ).

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

  "=====事件注册
  DATAlr_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.
  DATAl_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(00WITH p_text.

ENDFORM.
FORM inital .
  gt_data-key1 'a'.
  gt_data-key2 'aa'.
  APPEND gt_data.
ENDFORM.

ADDED_FUNCTION附加功能(按钮)事件

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

image124

CLASS l_cl_handle_events DEFINITION.
  PUBLIC SECTION.
    METHODSon_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.

DATAgr_table TYPE REF TO cl_salv_table.
DATAgr_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[] ).

    "附加刷新按钮
    DATAlr_functions TYPE REF TO cl_salv_functions_list.
    lr_functions gr_table->get_functions( ).
    lr_functions->set_allabap_true ).
    INCLUDE <icon>.
    DATAl_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 ).

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

    "=====事件注册
    DATAlr_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.

红绿灯、灯提示信息

image125

DATAgr_table TYPE REF TO cl_salv_table.
DATAgr_columns TYPE REF TO cl_salv_columns_table.
DATAgr_column TYPE REF TO cl_salv_column_table.

DATABEGIN 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'异常灯).
  DATAs_ddic TYPE salv_s_ddic_reference.
  s_ddic-field 'FIELD'.
  s_ddic-table 'SALV_S_DDIC_REFERENCE'.

  gr_column->set_ddic_references_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( ).
  DATAlr_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.

图标显示、图标提示信息

image126

DATAgr_table TYPE REF TO cl_salv_table.
DATAgr_columns TYPE REF TO cl_salv_columns_table.
DATAgr_column TYPE REF TO cl_salv_column_table.
INCLUDE <icon>.
DATABEGIN 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_iconif_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( ).
  DATAlr_tooltips TYPE REF TO cl_salv_tooltips.
  lr_tooltips lr_functional_settings->get_tooltips( ).

  DATAlvc_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 `=@06@`.
  APPEND gt_data .

  gt_data-icon icon_message_warning.
  gt_data-val `=@1A@`.
  APPEND gt_data .

  gt_data-icon icon_unlocked.
  gt_data-val `=@07@`.
  APPEND gt_data .
ENDFORM.

设置单元格颜色

image127

DATAgr_table TYPE REF TO cl_salv_table.
DATAgr_columns TYPE REF TO cl_salv_columns_table.
DATAgr_column TYPE REF TO cl_salv_column_table.

DATAg_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.
  DATAlt_color TYPE lvc_t_scol,
        ls_color TYPE lvc_s_scol.

  LOOP AT gt_data ASSIGNING <ls_outtab>.
    CLEARls_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.

原文出自  江正军 技术博客,博客链接: www.cnblogs.com/jiangzhengjun
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值