ALV Report with CL_SALV_TABLE Utilities


How to make ALV report much more easily? As we know there are about 3 ways to implement ALV report, that is REUSE_ALV, ALV_GRID classs, and SALV, in this section, I will show you on how to use SALV with a common include that makes ALV Report as simple as possible.

First, I list some classes that combine with SALV_TABLE to fit most of your requirements.

1.1   CL_SALV_DISPLAY_SETTINGS  — Setting display options

1.2   CL_SALV_COLUMNS_TABLE — All columns table

1.3   CL_SALV_COLUMN_TABLE  — Single column table

1.4   CL_SALV_EVENTS_TABLE  — Events table

1.5   CL_SALV_SORTS         — Sorts options

1.6   CL_SALV_AGGREGATIONS — Aggregations for many fields

1.7   CL_SALV_AGGREGATION  —-Single aggregation

1.8   CL_SALV_FUNCTIONS_LIST —Function code list

1.9   CL_SALV_DROPDOWN  —single dropdown event processing

1.10    CL_SALV_DROPDOWNS

1.11    CL_SALV_FILTER  —Filter option

1.12    CL_SALV_FILTERS

1.13    CL_SALV_HEADER —Header config

1.14    CL_SALV_FOOTER —Footer config

Now the main part comes, an include that makes SALV ustilities:

*&---------------------------------------------------------------------*
*&  Author: 翱翔云天
*&  Web Site: www.abaptech.com
*&  Mail: bob.xu@abaptech.com
*&  Desc: This utilities is used for ALV report programming
*&        The one who not used to CL_SALV* utilities could reference
*&         this document, and make it include in your main program,
*&         call the methods in this utilities
*&  中文描述:ALV大概分成3种实现方式,在这里我们使用CL_SALV*去实现,
*&           这个和工厂模式非常匹配,也算是工厂模式在sap中的典型应用吧
*&---------------------------------------------------------------------*
*&  Include           ZBOBO_SALV_UTILITIES
*&---------------------------------------------------------------------*
 
* 定义一个全局的field-symbol,传输数据使用
* Define global data
FIELD-SYMBOLS  TYPE ANY TABLE.
 
*----------------------------------------------------------------------*
*       CLASS lcl_alv DEFINITION
*----------------------------------------------------------------------*
*       Main utilities class definition
*----------------------------------------------------------------------*
CLASS LCL_ALV_UTL DEFINITION.
  PUBLIC SECTION.
 
*-->Set ALV output table contents 设置alv输出表
    METHODS SET_ALV  IMPORTING IN_ALV_TAB  TYPE ANY TABLE.
 
*-->Show ALV 显示ALV
    METHODS DISPLAY_ALV.
 
*-->Handle hotspot event 事件处理
    METHODS ON_LINK_CLICK   "Hotspot click
                FOR EVENT LINK_CLICK OF CL_SALV_EVENTS_TABLE
                IMPORTING ROW COLUMN.
*-->Handle double click event
    METHODS ON_DOUBLE_CLICK "双击
               FOR EVENT DOUBLE_CLICK OF CL_SALV_EVENTS_TABLE
               IMPORTING ROW COLUMN.
*-->Hand user defined event
    METHODS ON_USER_COMMAND "自定义功能
               FOR EVENT ADDED_FUNCTION OF CL_SALV_EVENTS
               IMPORTING E_SALV_FUNCTION.
 
  PROTECTED SECTION.
 
*-->ALV related object definition
    DATA: O_TABLE        TYPE REF TO CL_SALV_TABLE,
          O_DISPLAY      TYPE REF TO CL_SALV_DISPLAY_SETTINGS,
          O_COLUMNS      TYPE REF TO CL_SALV_COLUMNS_TABLE,
          O_COLUMN       TYPE REF TO CL_SALV_COLUMN_TABLE,
          O_EVENTS       TYPE REF TO CL_SALV_EVENTS_TABLE,
          O_SORTS        TYPE REF TO CL_SALV_SORTS,
          O_AGGREGATIONS TYPE REF TO CL_SALV_AGGREGATIONS,
          O_FUNCTIONS    TYPE REF TO CL_SALV_FUNCTIONS_LIST.
 
*-->Display table contents
    DATA T_ALV TYPE REF TO DATA.
 
ENDCLASS.                    "lcl_alv DEFINITION
 
*----------------------------------------------------------------------*
*       CLASS lcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
*        Main utilities class implementation
*----------------------------------------------------------------------*
CLASS LCL_ALV_UTL IMPLEMENTATION.
 
  METHOD SET_ALV.
*-->Table type
    DATA: O_TABLE_NEW  TYPE REF TO CL_ABAP_TABLEDESCR.
 
    TRY.
*----->Get table type 获取结构类型
        O_TABLE_NEW ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( IN_ALV_TAB ).
      CATCH CX_SY_TABLE_CREATION.
    ENDTRY.
 
*--->Create table type
    CREATE DATA T_ALV TYPE HANDLE O_TABLE_NEW.
*--->Assign structure
    ASSIGN T_ALV->* TO .
*--->Value assign
    [] = IN_ALV_TAB.
 
  ENDMETHOD.                    "SET_ALV
 
  METHOD DISPLAY_ALV.
 
    TRY.
*------>Get salv_table object with table contents
        CL_SALV_TABLE=>FACTORY(
          IMPORTING
            R_SALV_TABLE = O_TABLE
          CHANGING
            T_TABLE      =  ).
      CATCH CX_SALV_MSG.
    ENDTRY.
 
    TRY.
*------>Turn on the standard gui status
*------>For status, please check function group: SALV_METADATA_STATUS
        O_TABLE->SET_SCREEN_STATUS(
        PFSTATUS      =  'SALV_STANDARD'
        REPORT        =  SY-REPID
        SET_FUNCTIONS = O_TABLE->C_FUNCTIONS_ALL ).
 
*---------Funciton process, here you can deactive some funciton
*------>Get function code in alv
*--->关于function的详细内容,请参考CL_SALV_FUNCTIONS_LIST
        O_FUNCTIONS = O_TABLE->GET_FUNCTIONS( ).
        O_FUNCTIONS->SET_ALL( ABAP_TRUE ).
        O_FUNCTIONS->SET_EXPORT_SPREADSHEET( ABAP_FALSE ).
*----------------------------------------------------------------------*
 
*---------Column process, you can determine column property as your request
*-->关于column的更多选项,请参考CL_SALV_COLUMNS_TABLE
        O_COLUMNS = O_TABLE->GET_COLUMNS( ).
        O_COLUMNS->SET_OPTIMIZE( ABAP_TRUE ).
*----------------------------------------------------------------------*
 
      CATCH CX_SALV_OBJECT_NOT_FOUND.
    ENDTRY.
 
*-->Set display options
*-->关于更多display选项,请参考CL_SALV_DISPLAY_SETTINGS
    O_DISPLAY = O_TABLE->GET_DISPLAY_SETTINGS( ).
    O_DISPLAY->SET_STRIPED_PATTERN( CL_SALV_DISPLAY_SETTINGS=>TRUE ).
 
*-->Edit single column property
*-->下面部分相当于修改fieldcat
    TRY.
        O_COLUMN ?= O_COLUMNS->GET_COLUMN( 'EBELN' ).
        O_COLUMN->SET_CELL_TYPE( IF_SALV_C_CELL_TYPE=>HOTSPOT ).
      CATCH CX_SALV_NOT_FOUND.
    ENDTRY.
 
*-->How to set currency
*    TRY.
*        O_COLUMN ?= O_COLUMNS->GET_COLUMN( 'STPRS' ).
*        O_COLUMN->SET_CURRENCY_COLUMN( 'T001-WAERS' ).
*
*      CATCH CX_SALV_NOT_FOUND.
*    ENDTRY.
 
*-->Set column text on display
*    TRY.
*        O_COLUMN ?= O_COLUMNS->GET_COLUMN( 'MATCH_TEXT' ).
*        O_COLUMN->SET_SHORT_TEXT( 'TEXT' ).
*        O_COLUMN->SET_MEDIUM_TEXT( 'MATCHING TEXT' ).
*        O_COLUMN->SET_LONG_TEXT( 'MATCHING TEXT' ).
*      CATCH CX_SALV_NOT_FOUND.
*    ENDTRY.
 
*-->Get and set sort options
    O_SORTS = O_TABLE->GET_SORTS( ).
    O_SORTS->ADD_SORT( COLUMNNAME = 'BSART'
                       POSITION   = 1
                       SUBTOTAL   = 'X'
                       GROUP      = IF_SALV_C_SORT=>GROUP_WITH_UNDERLINE ).
    O_SORTS->ADD_SORT( COLUMNNAME = 'BUKRS'
                       POSITION   = 2
                       GROUP     = IF_SALV_C_SORT=>GROUP_WITH_UNDERLINE ).
 
*-->Get and set aggregation options
    TRY.
        O_AGGREGATIONS = O_TABLE->GET_AGGREGATIONS( ).
      CATCH CX_SALV_NOT_FOUND.
    ENDTRY.
    TRY.
        O_AGGREGATIONS->ADD_AGGREGATION( 'WKURS' ).
      CATCH CX_SALV_NOT_FOUND CX_SALV_DATA_ERROR CX_SALV_EXISTING. "#EC NO_HANDLER
    ENDTRY.
 
*-->Get events for list
    O_EVENTS = O_TABLE->GET_EVENT( ).
 
*-->Set handler for ALV events
*-->注册事件
    SET HANDLER: ME->ON_LINK_CLICK FOR O_EVENTS,
                 ME->ON_DOUBLE_CLICK FOR O_EVENTS,
                 ME->ON_USER_COMMAND FOR O_EVENTS.
 
*-->Display whole list
    O_TABLE->DISPLAY( ).
 
  ENDMETHOD.                    "display_alv
 
*---------------------------------------------------------------------*
* 以下部分可以根据自己的功能需要修改
*---------------------------------------------------------------------*
  METHOD ON_LINK_CLICK.
 
*-->这里为具体的数据处理,注意要定义自己的alv显示结构
    DATA: ITAB             TYPE TABLE OF EKKO.
    FIELD-SYMBOLS  LIKE LINE OF ITAB.
 
*-->Assign display table value
    ITAB[] = [].
 
*-->Get selected row
    READ TABLE ITAB ASSIGNING  INDEX ROW.
 
    CHECK SY-SUBRC = 0.
    IF -EBELN IS NOT INITIAL.
*---->Hotspot click
      SET PARAMETER ID 'BES' FIELD -EBELN.
      CALL TRANSACTION 'ME23N'.
    ENDIF.
 
    UNASSIGN .
 
  ENDMETHOD.                    "on_single_click
 
  METHOD ON_DOUBLE_CLICK.
*-->Do something on double click events
  ENDMETHOD.                    "on_double_click
 
  METHOD ON_USER_COMMAND.
*-->Do something on double click events
    CASE E_SALV_FUNCTION.
      WHEN 'MYFUNCTION'.  "ADD
*---Add you own cotrol code
      WHEN 'MYREFRESH'.    "REFRESH Contents
*---Add you own cotrol code and then
        CALL METHOD O_TABLE->REFRESH( ).
      WHEN OTHERS.
    ENDCASE.
  ENDMETHOD.                    "on_user_command
 
ENDCLASS.                    "lcl_alv IMPLEMENTATIONDefining Objects

How to use utilities as below:

*&---------------------------------------------------------------------*
*& Report  ZBOBO_SALV_DEMO
*&
*&---------------------------------------------------------------------*
*& Desc: Demo on how to use ZBOBO_SALV_UTILITIES
*&
*&---------------------------------------------------------------------*
 
REPORT  ZBOBO_SALV_DEMO.
 
* Include the utilities
INCLUDE: ZBOBO_SALV_UTILITIES.
 
* Define type
data: itab type STANDARD TABLE OF ekko.
* Define salv utilities object
data: o_alv type ref to lcl_alv_utl.
 
START-OF-SELECTION.
*data extraction
select * from ekko UP TO 30 ROWS into table itab.
*Init object
CREATE OBJECT o_alv.
*Set displayed object
o_alv->set_alv( in_alv_tab = itab ).
*Display object
o_alv->display_alv( ).


About The Author

从事SAP行业有些年头,对SAP技术稍有了解; 如无特别声明,本博客文章为原创,转载请注明; 博主MSN:xuchunbo0901@hotmail.com; 博主邮箱:bob.xu@abaptech.com。

6 Comments

  1. 杨振宇 说道:

    大哥,我进http://www.abaptech.com/bbs/read.php?tid-10.html 这种网址的时候,都是报
    404 Error – Not found
    Sorry, but you are looking for something that isn’t here.

  2. 杨振宇 说道:

    大哥给我个邀请码吧!多多学习啊!
    yangjun0519@163.com

  3. Wordpress Themes 说道:

    Amiable dispatch and this post helped me alot in my college assignement. Thank you seeking your information.

  4. this post is very usefull thx!

  5. Bob 说道:

    Welcome and thanks for your support!

  6. school grants 说道:

    Pretty nice post. I just stumbled upon your blog and wanted to say that I have really enjoyed browsing your blog posts. In any case I’ll be subscribing to your feed and I hope you write again soon!

Leave A Reply


注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。

无觅相关文章插件,快速提升流量