Skip to Content
0

Accessing filtered data from ALV from batch mode

Dec 13, 2017 at 07:08 PM

54

avatar image
Former Member

Hi,

I am trying to access the filtered data from an ALV when running in background (batch) mode.

If I use SET_TABLE_FOR_FIRST_DISPLAY, the correct content on the ALV is sent to the spool but the program immediately exits after the call.

If I use REUSE_ALV_GRID_DISPLAY, the correct content on the ALV is sent to the spool and I could continue the logic in the program but I could not find a way to get the filtered entries. I have 9 entries, 8 are filtered, 1 is displayed but the table still has 9 entries and no other table or object is giving me info on the entries really displayed.

Have you ever encountered this situation?

If so, any solution available?

Thanks in advance,

Alain.

10 |10000 characters needed characters left characters exceeded
* Please Login or Register to Answer, Follow or Comment.

2 Answers

Sandra Rossi Dec 13, 2017 at 10:25 PM
0

Sorry to redirect you to another SAP technology, but you could also try SALV, because Matthew proposed a code to retrieve the current filters and apply them to the table, here:

https://wiki.scn.sap.com/wiki/display/Snippets/Get+set+of+filtered+values+from+CL_SALV_TABLE

Show 1 Share
10 |10000 characters needed characters left characters exceeded
Former Member

Sandra,

Thanks for your answer but since we require cell coloring and editable fields, SALV is not an option although color and edit is not really an issue in batch mode.

I usually use OO technology but had to go to old FM technology in order to try to gain control in batch mode. If I could gain control after return from SET_TABLE_FOR_FIRST_DISPLAY, this would be the best option as I could use

GET_FILTERED_ENTRIES which works in foreground.

Otherwise I would like to find a way to query the ALV for filtering information after the call to REUSE_ALV_GRID_DISPLAY like REUSE_ALV_GRID_LAYOUT_INFO_GET which I could get to return any info.

Thanks,

Alain Cyr.

0
Sandra Rossi Dec 14, 2017 at 07:19 PM
0

I did a test by adapting the standard demo program BCALV_TEST_GRID_PRINT (use of CL_GUI_ALV_GRID), the control goes back after the CALL SCREEN in case you run the program in background. If you "wrap" the CALL SCREEN with calls to methods SET, GET_DATA_REF and GET_METADATA of class CL_SALV_BS_RUNTIME_INFO, you may retrieve both the internal table (not filtered) and the filters. You could then develop the logic of filtering yourself the lines of the internal table based on the information coming from the filters, with the same logic as Matthew with CL_SALV_TABLE ("big" adaptation needed of course). Note that you may find many discussions about CL_SALV_BS_RUNTIME_INFO throughout the web.

  cl_salv_bs_runtime_info=>set(
    EXPORTING display  = abap_false
              metadata = abap_true
              data     = abap_true ).

  CALL SCREEN 100. " <== method SET_TABLE_FOR_FIRST_DISPLAY of CL_GUI_ALV_GRID

  DATA: lr_alv_table TYPE REF TO data,
        ls_metadata  TYPE cl_salv_bs_runtime_info=>s_type_metadata.
  TRY.
      cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = lr_alv_table ).
      ls_metadata = cl_salv_bs_runtime_info=>get_metadata( ).
    CATCH cx_salv_bs_sc_runtime_info.
      " TODO
  ENDTRY.
  cl_salv_bs_runtime_info=>clear_all( ).
Show 1 Share
10 |10000 characters needed characters left characters exceeded

Solution for filtering easily, with function module LVC_FILTER_APPLY:

  DATA: ls_filter             TYPE lvc_s_filt,
        lt_grouplevels        TYPE  lvc_t_grpl,
        i_ignoring_case       TYPE  char01,
        lt_filter_index       TYPE  lvc_t_fidx,
        lt_grouplevels_filter TYPE  lvc_t_grpl.
  FIELD-SYMBOLS:
        <alv_table>           TYPE STANDARD TABLE,
        <index>               TYPE i.
  IF ls_metadata-t_filter IS NOT INITIAL.
    ASSIGN lr_alv_table->* TO <alv_table>.
    READ TABLE ls_metadata-t_filter INTO ls_filter INDEX 1.
    CALL FUNCTION 'LVC_FILTER_APPLY'
      EXPORTING
        it_fieldcatalog        = ls_metadata-t_fcat
        it_filter              = ls_metadata-t_filter
        it_grouplevels         = lt_grouplevels
        i_tabname              = ls_filter-tabname
        i_ignoring_case        = i_ignoring_case
      IMPORTING
        et_filter_index        = lt_filter_index
        et_grouplevels_filter  = lt_grouplevels_filter
      TABLES
        it_data                = <alv_table>.
    SORT lt_filter_index BY table_line DESCENDING. " IMPORTANT FOR SAFE DELETING FROM THE END !
    LOOP AT lt_filter_index ASSIGNING <index>.
      DELETE <alv_table> INDEX <index>.
    ENDLOOP.
  ENDIF.
0