I often face pseudo object orieted code in ABAP reports (classes containing only statis methods that serve as wrappers for procedural code, performs wrapped in methods).
That is why I would like demonstrate a simple and flexible OO solution, using local classes.
REPORT zxyz.
TABLES: estvh, estva, estrh.
SELECTION-SCREEN : BEGIN OF SCREEN 900.
SELECT-OPTIONS: s_estcat FOR estvh-estcat DEFAULT 'SAP_EHS_XYZ'.
SELECT-OPTIONS: s_subid FOR estrh-subid.
SELECTION-SCREEN : END OF SCREEN 900.
*--------------------------------
REPORT zxyz.
TABLES: estvh, estva, estrh.
SELECTION-SCREEN : BEGIN OF SCREEN 900.
SELECT-OPTIONS: s_estcat FOR estvh-estcat DEFAULT 'SAP_EHS_XYZ'.
SELECT-OPTIONS: s_subid FOR estrh-subid.
SELECTION-SCREEN : END OF SCREEN 900.
*--------------------------------
*CLASS lcl_main DEFINITION
*--------------------------------
CLASS lcl_main DEFINITION.
PUBLIC SECTION.
CLASS-METHODS :start_report.
PRIVATE SECTION.
METHODS : fetch,
check_auth,
display.
CLASS-DATA : lr_main TYPE REF TO lcl_main.
DATA it_table TYPE TABLE OF zasi_cds_count_inst.
ENDCLASS.
*------------------------------------
* CLASS lcl_main IMPLEMENTATION
*-------------------------------------
CLASS lcl_main IMPLEMENTATION.
METHOD start_report.
BREAK-POINT.
CALL SELECTION-SCREEN 900.
IF sy-subrc IS INITIAL.
CREATE OBJECT lr_main.
lr_main->fetch( ).
lr_main->display( ).
ENDIF.
ENDMETHOD.
METHOD fetch.
SELECT * INTO TABLE @it_table FROM zasi_cds_count_inst WHERE subid IN @s_subid AND estcat IN @s_estcat.
ENDMETHOD.
METHOD check_auth.
-->>perform authorization checks here
ENDMETHOD.
METHOD display.
DATA : lr_table TYPE REF TO cl_salv_table.
cl_salv_table=>factory( IMPORTING r_salv_table = lr_table
CHANGING t_table = me->it_table ) .
lr_table->display( ).
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
lcl_main=>start_report( ).
This solution provides more control and more flexibility compared to the procedural approach over events.
The selection screen is defined with a dedicated number and called later at start_report.
This allows flexibilty. We can define more selection screens and call the one we need based on authorization checks, for example.
This approach might seem strange for those of us who are used to the START-OF-SELECTION, PERFORM xyz, END-OF-SELECTION type of programming but it is worth trying.
*--------------------------------
CLASS lcl_main DEFINITION.
PUBLIC SECTION.
CLASS-METHODS :start_report.
PRIVATE SECTION.
METHODS : fetch,
check_auth,
display.
CLASS-DATA : lr_main TYPE REF TO lcl_main.
DATA it_table TYPE TABLE OF zasi_cds_count_inst.
ENDCLASS.
*------------------------------------
* CLASS lcl_main IMPLEMENTATION
*-------------------------------------
CLASS lcl_main IMPLEMENTATION.
METHOD start_report.
BREAK-POINT.
CALL SELECTION-SCREEN 900.
IF sy-subrc IS INITIAL.
CREATE OBJECT lr_main.
lr_main->fetch( ).
lr_main->display( ).
ENDIF.
ENDMETHOD.
METHOD fetch.
SELECT * INTO TABLE @it_table FROM zasi_cds_count_inst WHERE subid IN @s_subid AND estcat IN @s_estcat.
ENDMETHOD.
METHOD check_auth.
-->>perform authorization checks here
ENDMETHOD.
METHOD display.
DATA : lr_table TYPE REF TO cl_salv_table.
cl_salv_table=>factory( IMPORTING r_salv_table = lr_table
CHANGING t_table = me->it_table ) .
lr_table->display( ).
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
lcl_main=>start_report( ).
This solution provides more control and more flexibility compared to the procedural approach over events.
The selection screen is defined with a dedicated number and called later at start_report.
This allows flexibilty. We can define more selection screens and call the one we need based on authorization checks, for example.
This approach might seem strange for those of us who are used to the START-OF-SELECTION, PERFORM xyz, END-OF-SELECTION type of programming but it is worth trying.