ABAP学习笔记之——第十二章:SALV

本文介绍了SAP系统中SALV(Simple ALV)的应用,包括全屏模式、利用控制器模式的实现方式,并探讨了如何设置SALV的输出样式、修改字段属性、数据排序等高级特性。

一、概要

在Net Weaver 2004 平台上集合了利用函数和 GRID 的功能发布的 SALV 包程序 (SALV也称为 New ALV)。SALV 可以像利用函数生成 ALV 的不用创建屏幕就可以调用的全屏式ALV,还可以利用控制器在屏幕的控制器中显示 ALV。利用GRID 的ALV 虽然不能注册成 Batch Job 在后台运行,但 SALV 却可以。SALV 与现有的方法 (Function ALV) 相比,为了方便以接口的方式提供更整合及细微的功能,但是 SALV 不提供编辑功能。

二、SALV类型与实现

定义数据,为下面例子声明共同的变量:

DATA:gt_itab  TYPE TABLE OF sflight,
     gr_table TYPE REF TO cl_salv_table.

SELECT * FROM sflight INTO CORRESPONDING FIELDS OF TABLE gt_itab.

类型:

全屏模式


*全屏模式
cl_salv_table=>factory(
IMPORTING
  r_salv_table = gr_table
  CHANGING
    t_table = gt_itab
).
CALL METHOD gr_table->display.

全屏模式-Classic报表模式

*全屏Classic List模式
cl_salv_table=>factory(
EXPORTING
  list_display = abap_true
  IMPORTING
    r_salv_table = gr_table
    CHANGING
      t_table = gt_itab
      ).
CALL METHOD gr_table->display.

利用控制器模式(此处还需要创建一个屏幕和自定义控件container)

*利用控制器的模式
DATA:gui TYPE REF TO cl_gui_custom_container,
      ok_code LIKE sy-ucomm .
CALL SCREEN 100.
INCLUDE z_salv_test_status_0100o01.
INCLUDE z_salv_test_user_command_01i01.



*----------------------------------------------------------------------*
***INCLUDE Z_SALV_TEST_STATUS_0100O01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS '100'.
  IF gui is INITIAL.
    CREATE OBJECT gui
    EXPORTING
      container_name = 'CONTAINER'.
    TRY.
    CALL METHOD cl_salv_table=>factory
      EXPORTING
        r_container    = gui
        container_name = 'CONTAINER'
      IMPORTING
        r_salv_table   = gr_table
      CHANGING
        t_table        = gt_itab
        .
      CATCH cx_salv_msg.
    ENDTRY.
    CALL METHOD gr_table->display.
  ENDIF.
ENDMODULE.


*----------------------------------------------------------------------*
***INCLUDE Z_SALV_TEST_USER_COMMAND_01I01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  CASE ok_code.
    WHEN 'EXIT'.
      set SCREEN 0.
      leave SCREEN.
  ENDCASE.
ENDMODULE.

在画面上显示 ALV,使用以下两种方法已足够。

(1) FACTORY

- 定义要显示在画面上的数据

-定义ALV 报表样式。

(2) DISPLAY

-调用此方法画面上就显示 ALV。

FACTORY 方法是静态方法,因此使用 =>符号,而DISPLAY 方法是 Instance 方法,因此使用-> 符号。

三、设置SALV输出样式

1、SALV与子类

定义子类的引用对象变量:

DATA gr_display TYPE REF TO cl_salv_display_settings

调用子类类型对应的主类方法:

gr_display = gr_table->get display_settings ( ).

利用子类方法设置详细事项:

gr_display->set_striped_pattern(value = 'X')

2、设置标题

3、设置SALV的垂直/水平区分行

4、保存布局

*****设置布局
DATA gr_display TYPE REF TO cl_salv_display_settings.
DATA gr_layout TYPE REF TO cl_salv_layout.
DATA g_program TYPE salv_s_layout_key.

cl_salv_table=>factory(
IMPORTING
  r_salv_table = gr_table
  CHANGING
    t_table = gt_itab
).

*设置标题
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_display->set_horizontal_lines( cl_salv_display_settings=>false ).
gr_display->set_vertical_lines( cl_salv_display_settings=>false ).

*保存布局
gr_layout = gr_table->get_layout( ).
g_program-report = sy-repid.
gr_layout->set_key( g_program ).
gr_layout->set_save_restriction( cl_salv_layout=>restrict_none ).

CALL METHOD gr_table->display.

5、修改字段属性

******修改字段属性
DATA:gr_columns TYPE REF TO cl_salv_columns_table,
     gr_column  TYPE REF TO cl_salv_column_table.

cl_salv_table=>factory(
IMPORTING
  r_salv_table = gr_table
  CHANGING
    t_table = gt_itab
).
gr_columns = gr_table->get_columns( ).

*隐藏字段属性
gr_column ?= gr_columns->get_column( 'MANDT' ).
gr_column->set_visible( cl_salv_column_table=>false ).

*修改字段描述
gr_column ?= gr_columns->get_column( 'CARRID' ).
gr_column->set_long_text( 'long text' ).
gr_column->set_medium_text( 'medium text' ).
gr_column->set_short_text( 'short text' ).

*设置字段颜色
DATA g_color TYPE lvc_s_colo.
gr_column ?= gr_columns->get_column( 'PRICE' ).
g_color-col = '6'.
g_color-int = '1'.
g_color-inv = '0'.
gr_column->set_color( g_color ).

*设置字段的最佳长度
gr_columns->set_optimize( 'X' ).

gr_table->display( ).

6、SALV选择模式

******SALV选择模式
DATA gr_selection TYPE REF TO cl_salv_selections.

cl_salv_table=>factory(
IMPORTING
  r_salv_table = gr_table
  CHANGING
    t_table = gt_itab
).
gr_selection = gr_table->get_selections( ).
gr_selection->set_selection_mode( if_salv_c_selection_mode=>row_column ).

CALL METHOD gr_table->display.

7、以弹出窗口形式显示

可以在弹出窗口下显示 SALV,可以通过 set_screen _popup 方法实现,但利用控制器的方法中是无法使用的。利用控制器的 SALV 是在屏幕属性中选择 Dialog Box 来实现此功能的

******以弹出窗口显示
cl_salv_table=>factory(
IMPORTING
  r_salv_table = gr_table
  CHANGING
    t_table = gt_itab
).
CALL METHOD gr_table->set_screen_popup
  EXPORTING
    start_column = 1
    end_column   = 100
    start_line   = 1
    end_line     = 20 .

CALL METHOD gr_table->display.

8、数据排序

数据排序利用参照 CL_SALV_SORTS 类的对象参照变量实现。利用 GR_TABLE 的GET_SORT 方法与负责排序的 ALV 对象链接通过 ADD_SORT 方法追加要排序的字段。

****数据排序
DATA gr_sort TYPE REF TO cl_salv_sorts.

cl_salv_table=>factory(
IMPORTING
  r_salv_table = gr_table
  CHANGING
    t_table = gt_itab
).
gr_sort = gr_table->get_sorts( ).
gr_sort->add_sort( 'CONNID' ).
CALL METHOD gr_table->display.

9、设置 Aggregation

利用 CL_SALV_AGGREATIONS 类可以合计 Numeric 类型的字段数据。若只是在字段级别上进行合计就没必要排序数据,但是根据主键值进行小计 (Subtotal) 就需要先进行排序。

*****设置Aggregation
DATA gr_sorts TYPE REF TO cl_salv_sorts.
DATA gr_agg TYPE REF TO cl_salv_aggregations.

cl_salv_table=>factory(
IMPORTING
  r_salv_table = gr_table
  CHANGING
    t_table = gt_itab
).
gr_sorts = gr_table->get_sorts( ).
gr_sorts->add_sort( columnname = 'CONNID' subtotal = 'X' ).
gr_agg = gr_table->get_aggregations( ).
gr_agg->add_aggregation( 'PRICE' ).

CALL METHOD gr_table->display.

10、设置过滤字段

过滤功能可以限制显示在 ALV 报表中的数据。利用 CL_SALV_FILTERS 类设置GR_TABLE 的GET_FILTERS 方法。通过 ADD_FILTER 方法追加过滤设置条件及字段。

****设置过滤字段
DATA gr_filter TYPE REF TO cl_salv_filters.

cl_salv_table=>factory(
IMPORTING
  r_salv_table = gr_table
  CHANGING
    t_table = gt_itab
).
gr_filter = gr_table->get_filters( ).
gr_filter->add_filter( columnname = 'CONNID'
sign = 'I'
option = 'EQ'
low = '555' ).
CALL METHOD gr_table->display.

事件

事件是没有继承关系的类之间互相调用方法时使用的特殊方法。对像(或者类)为了调用 (Trigger)其他对象(或者类)的事件的方法而使用事件。通过 CALLMETHOD 语句调用一般方法的时候一个方法会由多个对象调用。与此类似,所有对象都可以调用事件且只有事件主体的对象才能执行事件。调用一般方法时程序可以决定要调用的方法。与此相同,在事件中可以决定事件要反映的事件。

(1)定义事件

(2)定义事件控制器方法

(3)注册事件控制器方法

(4)调用事件

(5)执行事件控制方法

DOUBLE CLICK 事件

HOTSPOTCLICK 事件

Toolbar 事件

USER-COMMAND 事件

SALV  GRID要素

处理信号灯

处理信号灯(Exception)是将界限值利用图表按区间显示数据的属性。如[图 17-14]所示SALV 字段用图表显示按钮根据特定字段的值修改颜色。这可以方便最终用户识别数据的紧急性、重要性。

处理按钮

在SALV 中可以利用ALV Object 类以图标形式显示单元格。为了显示图标,追加 icon d类型的字段。

 

修改单元格颜色

在 SALV GRID 中可以修改需要强调的单元格的颜色。一般字段单位的颜色强调更常使用系统资源。内表中追加LVC T SCOL 类型的颜色表。此逻辑与在 ALV GRID 中设置单元格颜色的过程相似。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值