After a lot of analysis (and of course Trials-&-Errors), I found the solution which requires minimal development. Before giving the solution, check out how it looks-
When we start running the report, it will be a normal Selection Screen:
After executing the report, our output will overlay on the Selection Screen. And it will look like this:
Doesn't it look good ?
Journey to find the solution:After reading the problem in the thread, suddenly I got a strike: Why not to create a Docking Container and place the ALV inside it..!!
I have started with placing the docking container in the INITIALIZATION event and the code to generate the ALV in the START-OF-SELECTION event. In this try, I got the docking container on the selection screen but no ALV inside of that docking container. Than I realize that I missed on of the basics of report programming - as soon as control goes to INITALIZATION all memory allocation will be destroyed and global data will be initialized. That's why I was not getting the ALV in the docking container. Selection screen was looking like this:
So, I moved the ALV logic in the INITALIZATION event. After this try, I got the Docking container with the empty ALV - ALV with the field catalog but no Data. Here again, I have the same problem - all my data allocation got destroyed as soon as control come to INITALIZATION event. To overcome this I used the ABAP local memory. I exported my output table and imported back it into the INITALIZATION to initialize my ALV. Selection-screen was looking like this:
Here is the code which will generate the output as shown in the second picture.
Code Snippet to Display ALV output on the Selection Screen |
*&---------------------------------------------------------------------* *& Generates the ALV on the Selection Screen itself *& *&---------------------------------------------------------------------* REPORT zalv_on_sel_screen. * *----------------------------------------------------------------------* * Local class for report *----------------------------------------------------------------------* CLASS lcl_report DEFINITION. * PUBLIC SECTION. * DATA: t_data TYPE STANDARD TABLE OF sflight, " Output dat r_carrid TYPE RANGE OF sflight-carrid. " Select Option * METHODS: get_data, * generate_output. * ENDCLASS. "lcl_report DEFINITION * DATA: lo_report TYPE REF TO lcl_report. * DATA: w_carrid TYPE sflight-carrid. * ** Selection Screen SELECTION-SCREEN: BEGIN OF BLOCK blk1 WITH FRAME TITLE aaa. SELECT-OPTIONS: s_carrid FOR w_carrid. SELECTION-SCREEN: END OF BLOCK blk1. * ** Initialization INITIALIZATION. aaa = 'Selection Criteria'. * object for the report CREATE OBJECT lo_report. * generate output lo_report->generate_output( ). * ** Start of Selection START-OF-SELECTION. * Get data lo_report->r_carrid = s_carrid[]. lo_report->get_data( ). * *----------------------------------------------------------------------* * Local Class Implementation *----------------------------------------------------------------------* CLASS lcl_report IMPLEMENTATION. * METHOD get_data. * * data selection SELECT * FROM sflight INTO TABLE me->t_data WHERE carrid IN s_carrid. IF sy-dbcnt IS INITIAL. MESSAGE s398(00) WITH 'No data selected'. ENDIF. * * export to memory EXPORT data = me->t_data TO MEMORY ID sy-cprog. * ENDMETHOD. "get_data * METHOD generate_output. * * local data DATA: lo_dock TYPE REF TO cl_gui_docking_container, lo_cont TYPE REF TO cl_gui_container, lo_alv TYPE REF TO cl_salv_table. * * import output table from the memory and free afterwards IMPORT data = me->t_data FROM MEMORY ID sy-cprog. FREE MEMORY ID sy-cprog. * * Only if there is some data CHECK me->t_data IS NOT INITIAL. * * Create a docking control at bottom CHECK lo_dock IS INITIAL. CREATE OBJECT lo_dock EXPORTING repid = sy-cprog dynnr = sy-dynnr ratio = 80 side = cl_gui_docking_container=>dock_at_bottom name = 'DOCK_CONT'. IF sy-subrc <> 0. MESSAGE 'Error in the Docking control' TYPE 'S'. ENDIF. * * Create a SALV for output CHECK lo_alv IS INITIAL. TRY. * Narrow Casting: To initialize custom container from * docking container lo_cont ?= lo_dock. * * SALV Table Display on the Docking container CALL METHOD cl_salv_table=>factory EXPORTING list_display = if_salv_c_bool_sap=>false r_container = lo_cont container_name = 'DOCK_CONT' IMPORTING r_salv_table = lo_alv CHANGING t_table = me->t_data. CATCH cx_salv_msg . ENDTRY. * * Pf status DATA: lo_functions TYPE REF TO cl_salv_functions_list. lo_functions = lo_alv->get_functions( ). lo_functions->set_default( abap_true ). * * output display lo_alv->display( ). * ENDMETHOD. "generate_output * ENDCLASS. "lcl_report IMPLEMENTATION
|
Steps to create an ALV on the Selection Screen, in summary :Create docking container in the INITALIZATION eventCreate ALV on that Docking containerAfter selecting all the data, export output table to ABAP memoryBefore generating the output, import the output table from the memroy
No comments:
Post a Comment