Display ALV List easily in ABAP using CL_SALV_TABLE Part IV. - Individual Column Settings

Get FREE Access to the CL_SALV_TABLE Bonus Content

Updated on 17.11.2015

In this post series, I show you how to display a simple list with a flight schedule. I also show you the most common ALV settings that you might need. However, I don't show you how to handle events in CL_SALV_TABLE, and how to add custom buttons at the top of your ALV. But, I have good news for you! I re-wrote the complete source code in OO ABAP way with the help of the 7.4 language elements.

What is covered in the bonus content:

  • Source Code in 7.4 OO ABAP Version
  • Handling Hotspot Click Event
  • Adding Custom Button to the Toolbar
  • Handling Custom Button Clicks [NEW]


Overview

In the latest post, I introduced you the CL_SALV_COLUMNS_TABLE class that is responsible for customizing the columns collectively. Today, I want to show you another class, called CL_SALV_COLUMN. This class is responsible for customizing a chosen column individually. To perform some customization on a given column, we have to get an instance reference of the CL_SALV_COLUMN class by calling the method GET_COLUMN() on the CL_SALV_COLUMNS_TABLE class (we already have an instance reference of it).


Code Refactoring

When I worked on the previous post - I'm going to be honest with you - I did not plan to show you the CL_SALV_COLUMN class, so I had to rethink my code, before we jump into the middle of coding.

First, I extracted the definition of the reference variable, called columns (CL_SALV_COLUMNS_TABLE) from the OPTIMIZE_COLUMN_WIDTH subroutine into the global definition area for the sake of the simplicity, since we are going to reuse this instance later several times.

...
*----------------------------------------------------------------------*
* REFERENCE definitions                                                *
*----------------------------------------------------------------------*
DATA alv     TYPE REF TO cl_salv_table.
DATA columns TYPE REF TO cl_salv_columns_table.
...


Then, I moved the initialization of the columns reference variable from the OPTIMIZE_COLUMN_WIDTH subroutine into the INITIALIZE_ALV subroutine, since we want to initialize only once, and reuse it several times, so I think it belongs to this place.

...
*&---------------------------------------------------------------------*
FORM initialize_alv.
*&---------------------------------------------------------------------*
  DATA message   TYPE REF TO cx_salv_msg.

  TRY.
      cl_salv_table=>factory(
      IMPORTING
        r_salv_table = alv
      CHANGING
        t_table      = flight_schedule ).

      columns = alv->get_columns( ).

      PERFORM enable_layout_settings.
      PERFORM optimize_column_width.
...


At last, this is the result of the OPTIMIZE_COLUMN_WIDTH subroutine. It's short, compact, and transparent! That's what I like.

...
*&---------------------------------------------------------------------*
FORM optimize_column_width.
*&---------------------------------------------------------------------*
  columns->set_optimize( ).
ENDFORM.                    "OPTIMIZE_COLUMN_WIDTH
...


Hide Unnecessary Columns

As you have completed the necessary code refactoring as well, let's move on and work on our current task, perform individual setting on certain columns. As you could see, we display all of the columns from the SPFLI table in our ALV list without any restriction. Now, I want to teach you how you can hide the unnecessary columns in your ALV list. As an example, let's hide the column, MANDT since it's a technical fields, the user doesn't interested in the content of this fields.

It's going to be very simple: first of all let's get the reference of the MANDT column by calling the method, GET_COLUMN() on the columns object (columns contains all of the columns from the table, SPFLI), and then let's call its method, named SET_VISIBLE() with false. At last, let's wrap these method calls into a TRY-CATCH block to handle exceptions (now we have to handle the case when doesn't exist any field in the structure with the name, MANDT).

...
*&---------------------------------------------------------------------*
FORM hide_client_column.
*&---------------------------------------------------------------------*
  DATA not_found TYPE REF TO cx_salv_not_found.

  TRY.
      column = columns->get_column( 'MANDT' ).
      column->set_visible( if_salv_c_bool_sap=>false ).
    CATCH cx_salv_not_found INTO not_found.
      " error handling
  ENDTRY.
ENDFORM.                    " HIDE_CLIENT_COLUMN
...


Above, we used a reference variable, named column that we have not declared yet. Let's place its declaration in the global area for the sake of the simplicity with the type CL_SALV_COLUMN.

...
*----------------------------------------------------------------------*
* REFERENCE definitions                                                *
*----------------------------------------------------------------------*
DATA alv     TYPE REF TO cl_salv_table.
DATA columns TYPE REF TO cl_salv_columns_table.
DATA column  TYPE REF TO cl_salv_column.
...


Set Text for Columns

Beside the field's visibility, I want to show you another setting that you can use to reset column's texts (that is specified in the ABAP Dictionary) easily by coding.

Here, we are going to do the same thing. First let's get the reference of the COUNTRYFR field by calling the GET_COLUMN() method, and save it in the variable column. Then call the different text setting method according to the lengths: short, medium, long with the different texts that you want to set. At last, handle the CX_SALV_NOT_FOUND exception, in the case when there is no field with the name COUNTRYFR.

...
*&---------------------------------------------------------------------*
FORM set_departure_country_column.
*&---------------------------------------------------------------------*
  DATA not_found TYPE REF TO cx_salv_not_found.

  TRY.
      column = columns->get_column( 'COUNTRYFR' ).
      column->set_short_text( 'D. Country' ).
      column->set_medium_text( 'Dep. Country' ).
      column->set_long_text( 'Departure Country' ).
    CATCH cx_salv_not_found INTO not_found.
      " error handling
  ENDTRY.
ENDFORM.                    " SET_DEPARTURE_COUNTRY_COLUMN
...


Complete Source Code

Get the complete source code:

************************************************************************
* Program:        ZDEMO_ALV04                                          *
* Request ID:     RXXXXXX                                              *
* User ID:        ALEXGONCZY                                           *
* Date:           2014.10.01.                                          *
* Description:    -                                                    *
************************************************************************
REPORT zdemo_alv04.

************************************************************************
* GLOBAL DATA DEFINITIONS                                              *
************************************************************************
*----------------------------------------------------------------------*
* INCLUDE - definitions                                                *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CONSTANT - definitions                                               *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* TYPE - definitions                                                   *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* DDIC - TABLE / STRUCTURE / VIEW definitions                          *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* STRUCTURE definitions                                                *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* RANGE definitions                                                    *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* REFERENCE definitions                                                *
*----------------------------------------------------------------------*
DATA alv     TYPE REF TO cl_salv_table.
DATA columns TYPE REF TO cl_salv_columns_table.
DATA column  TYPE REF TO cl_salv_column.

*----------------------------------------------------------------------*
* INTERNAL TABLE definitions                                           *
*----------------------------------------------------------------------*
DATA flight_schedule TYPE STANDARD TABLE OF spfli.

*----------------------------------------------------------------------*
* OTHER GLOBAL DATA definitions                                        *
*----------------------------------------------------------------------*
************************************************************************
* GLOBAL DATA DEFINITIONS - END                                        *
************************************************************************

************************************************************************
* SELECTION SCREENS                                                    *
************************************************************************
************************************************************************
* SELECTION SCREENS - END                                              *
************************************************************************

************************************************************************
* EVENTS                                                               *
************************************************************************
*----------------------------------------------------------------------*
* INITIALIZATON event                                                  *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* AT SELECTION-SCREEN ON VALUE-REQUEST FOR event                       *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* START-OF-SELECTION event                                             *
*----------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM get_flight_schedule.

  PERFORM initialize_alv.

  PERFORM display_alv.

*----------------------------------------------------------------------*
* END-OF-SELECTION event                                               *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* AT LINE-SELECTION event                                              *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* AT USER-COMMAND event                                                *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* TOP-OF-PAGE event                                                    *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* END-OF-PAGE event                                                    *
*----------------------------------------------------------------------*
************************************************************************
* EVENTS - END                                                         *
************************************************************************

************************************************************************
* SUBROUTINES                                                          *
************************************************************************
*&---------------------------------------------------------------------*
FORM get_flight_schedule.
*&---------------------------------------------------------------------*
  SELECT * FROM spfli INTO TABLE flight_schedule UP TO 100 ROWS.
ENDFORM.                    " GET_FLIGHT_SCHEDULE

*&---------------------------------------------------------------------*
FORM initialize_alv.
*&---------------------------------------------------------------------*
  DATA message   TYPE REF TO cx_salv_msg.

  TRY.
      cl_salv_table=>factory(
      IMPORTING
        r_salv_table = alv
      CHANGING
        t_table      = flight_schedule ).

      columns = alv->get_columns( ).

      PERFORM enable_layout_settings.
      PERFORM optimize_column_width.
      PERFORM hide_client_column.
      PERFORM set_departure_country_column.
      " ...
      " PERFORM setting_n.

    CATCH cx_salv_msg INTO message.
      " error handling
  ENDTRY.
ENDFORM.                    " INITIALIZE_ALV

*&---------------------------------------------------------------------*
FORM display_alv.
*&---------------------------------------------------------------------*
  alv->display( ).
ENDFORM.                    " DISPLAY_ALV

*&---------------------------------------------------------------------*
FORM enable_layout_settings.
*&---------------------------------------------------------------------*
  DATA layout_settings TYPE REF TO cl_salv_layout.
  DATA layout_key      TYPE salv_s_layout_key.

  layout_settings = alv->get_layout( ).

  layout_key-report = sy-repid.
  layout_settings->set_key( layout_key ).

  layout_settings->set_save_restriction( if_salv_c_layout=>restrict_none ).
ENDFORM.                    "enable_layout_settings

*&---------------------------------------------------------------------*
FORM optimize_column_width.
*&---------------------------------------------------------------------*
  columns->set_optimize( ).
ENDFORM.                    "OPTIMIZE_COLUMN_WIDTH

*&---------------------------------------------------------------------*
FORM hide_client_column.
*&---------------------------------------------------------------------*
  DATA not_found TYPE REF TO cx_salv_not_found.

  TRY.
      column = columns->get_column( 'MANDT' ).
      column->set_visible( if_salv_c_bool_sap=>false ).
    CATCH cx_salv_not_found INTO not_found.
      " error handling
  ENDTRY.
ENDFORM.                    " HIDE_CLIENT_COLUMN

*&---------------------------------------------------------------------*
FORM set_departure_country_column.
*&---------------------------------------------------------------------*
  DATA not_found TYPE REF TO cx_salv_not_found.

  TRY.
      column = columns->get_column( 'COUNTRYFR' ).
      column->set_short_text( 'D. Country' ).
      column->set_medium_text( 'Dep. Country' ).
      column->set_long_text( 'Departure Country' ).
    CATCH cx_salv_not_found INTO not_found.
      " error handling
  ENDTRY.
ENDFORM.                    " SET_DEPARTURE_COUNTRY_COLUMN

************************************************************************
* SUBROUTINES - END                                                    *
************************************************************************


Summary

Finally, that's what we worked on the last few minutes: column Mandt is hidden, the column Departure Country's texts are renamed.


I think, we are on the good way :) You are getting close to master the CL_SALV_TABLE class step by step. First, we implemented a simple list, then we enabled the layout settings, after that we optimized the column width, and now we hid the MANDT field, and set the texts for the COUNTRYFR field.

Stay tuned, I'm working on the next post!


blog comments powered by Disqus