Application Development Blog Posts
Learn and share on deeper, cross technology development topics such as integration and connectivity, automation, cloud extensibility, developing at scale, and security.
cancel
Showing results for 
Search instead for 
Did you mean: 
sri_vidya
Explorer
User case: In some situations, user may want to see only few fields in his output of the ALV or he may want to see different version of layout from the one being displayed. This blog post explains the  approach to achieve the requirement using Factory Method.

Let us assume the following query where Material details from tables MARA (Material Master), MAKT (Material Description) and MARC( Plant Data for Material ) as shown below.
DATA:lr_alv TYPE REF TO cl_salv_table. 

SELECT a~matnr, a~mtart, a~matkl, a~meins,
b~werks,
b~ekgrp,
c~maktx,
c~spras
FROM mara AS a INNER JOIN marc AS b
ON a~matnr = b~matnr
INNER JOIN makt AS c
ON a~matnr = c~matnr
INTO TABLE @DATA(lt_output)
UP TO 100 ROWS.

DELETE ADJACENT DUPLICATES FROM lt_output COMPARING ALL FIELDS.

CALL METHOD cl_salv_table=>factory
IMPORTING
r_salv_table = lr_alv " Basis Class Simple ALV Tables
CHANGING
t_table = lt_output.

The output is as shown:


The ALV output does not have any of the sort, filter or other such options when called using factory method. To get them, add the following code before calling the display method.



DATA: gr_functions TYPE REF TO cl_salv_functions.
DATA: gr_display TYPE REF TO cl_salv_display_settings.

** To Display the Sort, Filter Export, Etc,. options
gr_functions = lr_alv->get_functions( ).
gr_functions->set_all( abap_true ).
gr_display = lr_alv->get_display_settings( ). "Display Settings

* Header
gr_display->set_list_header( 'Material Details ' ). " Heading for the ALV
* Zebra pattern
gr_display->set_striped_pattern( abap_true ). " To set the striped Pattern

* Output
lr_alv->display( ).

Now the output is shown with Sort, Filter, Export, etc.,


Observe that the option to save the layout is still not available. Calling the following methods before calling display would do that.
DATA: lv_key    TYPE salv_s_layout_key.

* Saving Layouts.
lv_key-report = sy-repid.
gr_layout->set_key( lv_key ).
gr_layout->set_save_restriction( cl_salv_layout=>restrict_none ).

Calling the above methods allows user to Save the Layouts and select the saved layouts when needed. The Icons will be as shown below.


Using them, We can alter the ALV Layout and Save that layout by giving some name to it.

I have applied a sort and a filter in the below screenshot.



Click on the Save layout Icon. Provide the values to the Layout and Name and save it.


Hence, the different versions of layouts can be obtained in a go without altering it every time. The saved layouts are displayed as shown.


The saved layouts can be added to the selection screen as F4 Help and a specific layout can be set as default. Add the following code for that. It provides the values of Saved layout in the F4 Help.
DATA:set_lay   TYPE slis_vari,
g_exit TYPE c,
g_variant TYPE disvariant.

g_variant-report = sy-repid.
CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
EXPORTING
is_variant = g_variant
i_save = 'A'
IMPORTING
e_exit = g_exit
es_variant = g_variant
EXCEPTIONS
not_found = 1
program_error = 2
OTHERS = 3.
.
IF sy-subrc = 0.
p_var = g_variant-variant.
set_lay = g_variant-variant.
ENDIF.

gr_layout->set_initial_layout( value = set_lay ).
lr_alv->display( )..

Selection screen: I have created ALV layouts from the output screen. They are shown in the F4 Help now. Selecting a layout would display its output with that layout.


 


User can also switch between layouts from output screen itself using " Select layout icon.

The Report code is below.
REPORT zmt_customlayout_factory.


PARAMETERS: p_var TYPE disvariant-variant.


DATA:lr_alv TYPE REF TO cl_salv_table.
DATA: gr_layout TYPE REF TO cl_salv_layout, "cl_salv_table,
lv_key TYPE salv_s_layout_key,
gr_table TYPE REF TO cl_salv_table.
DATA: gr_functions TYPE REF TO cl_salv_functions.
DATA: gr_display TYPE REF TO cl_salv_display_settings.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
DATA: gr_sorts TYPE REF TO cl_salv_sorts.
DATA: gr_agg TYPE REF TO cl_salv_aggregations.

DATA:set_lay TYPE slis_vari,
g_exit TYPE c,
g_variant TYPE disvariant.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_var.
g_variant-report = sy-repid.
CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
EXPORTING
is_variant = g_variant
i_save = 'A'
IMPORTING
e_exit = g_exit
es_variant = g_variant
EXCEPTIONS
not_found = 1
program_error = 2
OTHERS = 3.
.
IF sy-subrc = 0.
p_var = g_variant-variant.
set_lay = g_variant-variant.
ENDIF.

START-OF-SELECTION.

SELECT a~matnr, a~mtart, a~matkl, a~meins,
b~werks,
b~ekgrp,
c~maktx,
c~spras
FROM mara AS a INNER JOIN marc AS b
ON a~matnr = b~matnr
INNER JOIN makt AS c
ON a~matnr = c~matnr
INTO TABLE @DATA(lt_output)
UP TO 100 ROWS.

DELETE ADJACENT DUPLICATES FROM lt_output COMPARING ALL FIELDS.

END-OF-SELECTION.
CALL METHOD cl_salv_table=>factory
IMPORTING
r_salv_table = lr_alv " Basis Class Simple ALV Tables
CHANGING
t_table = lt_output.

** To Display the Sort, Filter Export, Etc,. options
gr_functions = lr_alv->get_functions( ).
gr_functions->set_all( abap_true ).
gr_display = lr_alv->get_display_settings( ). "Display Settings

* Header
gr_display->set_list_header( 'Material Details ' ). " Heading for the ALV
* Zebra pattern
gr_display->set_striped_pattern( abap_true ). " To set the striped Pattern

* Layout changes
gr_columns = lr_alv->get_columns( ).
gr_sorts = lr_alv->get_sorts( ).
gr_agg = lr_alv->get_aggregations( ).
gr_layout = lr_alv->get_layout( ).

* Saving Layouts.
lv_key-report = sy-repid.
gr_layout->set_key( lv_key ).
gr_layout->set_save_restriction( cl_salv_layout=>restrict_none ).

* Setting layout screen from Selection screen.
gr_layout->set_initial_layout( value = set_lay ).
lr_alv->display( )..

Conclusion:

Using the above approach, user can be provided with the flexibility to manage and save his most used layouts in the output.

Hope this blog post helps you.
3 Comments
Labels in this area