Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

SALV hide empty (with value 0,00) columns.

Former Member
0 Likes
3,612

Hi,

I'm writing absence report. Main idea is to display every kind of absence in new column, and sum them up, with possibility to select which types should be displayed and which ones hidden (at selection screen). As far as i got is to display whole populated table and sum them up in last column. Bigger problem is to hide the columns that have no value or are not selected. I've tried quite big variety of solutions, but without success.  The ALV grid is generated dynamically, using method that sets properties of columns. The code is below. How can i make it work?

Thanks and regards,

Grzegorz Żyrek

    METHOD output_fields_adjustment.
         TYPES: BEGIN OF tty_names,
           name(25) TYPE c, "t554t-atext,
       END OF tty_names.
       DATA:
       lt_names TYPE TABLE OF tty_names,
       ls_names TYPE tty_names.
     FIELD-SYMBOLS:
           <fs_output>     LIKE LINE OF gt_output,
           <fs_554t>     TYPE t554t,
           <ls_header>   TYPE goty_head,
           <ls_name> TYPE tty_names.

     DATA lt_t554t TYPE STANDARD TABLE OF t554t.
     DATA wa_t554t LIKE LINE OF lt_t554t.
     DATA: lr_column TYPE REF TO salv_s_column_ref.
     DATA: l_text_10(10), l_text_20(20), l_text_40(40),
           l_boole   TYPE sap_bool.
     DATA lv_counter TYPE n.
     DATA lv_name    TYPE c LENGTH 10 VALUE 'P000_AWART'.
     DATA lv_count   TYPE i VALUE 1.
     DATA lv_count2   TYPE i VALUE 3.
     DATA iv_flag    TYPE c.

     FIELD-SYMBOLS: <fs_awart>   TYPE awart,
                    <ls_temp> TYPE string.
*                   <fr_column> TYPE salv_s_column_ref.

* Width optimized
     go_salv_columns->set_optimize( g_true ).
* get the columns
     gt_salv_t_column_ref = go_salv_columns->get( ).
*    READ TABLE gt_header ASSIGNING <ls_header> WITH TABLE KEY
*    SELECT SINGLE atext FROM t554t INTO l_text_10 WHERE sprsl EQ sy-langu AND awart EQ <ls_header>-awart.



     LOOP AT gt_salv_t_column_ref REFERENCE INTO lr_column.


        LOOP AT gt_header ASSIGNING <ls_header>.

         SELECT SINGLE * FROM t554t INTO wa_t554t WHERE sprsl EQ sy-langu AND
            moabw EQ p_sqnr AND
          awart EQ <ls_header>-absc_n.
         IF sy-subrc EQ 0.

           ENDIF.
           ls_names = wa_t554t-atext.

           COLLECT ls_names INTO lt_names.
           ENDLOOP.
*          LOOP AT lt_names ASSIGNING <ls_name>. "uncomment loop to test if reads header texts in a proper way
*           WRITE: /, <ls_name>-name.
*           ENDLOOP.

       IF lr_column->columnname EQ 'ID'.
         l_text_10 = l_text_20 = l_text_40 = 'Lp.'.
         lr_column->r_column->set_short_text( l_text_10 ).
         lr_column->r_column->set_medium_text( l_text_20 ).
         lr_column->r_column->set_long_text( l_text_40 ).
       ELSEIF lr_column->columnname EQ 'PERNR'.
*      ENDIF.

**
           l_text_10 = l_text_20 = l_text_40 = 'Lp.'.
           lr_column->r_column->set_short_text( l_text_10 ).
           lr_column->r_column->set_medium_text( l_text_20 ).
           lr_column->r_column->set_long_text( l_text_40 ).
       ELSEIF lr_column->columnname EQ 'SNAME'.
            l_text_10 = l_text_20 = l_text_40 = 'Name'.
         lr_column->r_column->set_short_text( l_text_10 ).
         lr_column->r_column->set_medium_text( l_text_20 ).
         lr_column->r_column->set_long_text( l_text_40 ).

         ELSE.

             READ TABLE lt_names ASSIGNING <ls_name> INDEX lv_count.
           l_text_10 = l_text_20 = l_text_40 = <ls_name>-name.
           lr_column->r_column->set_short_text( l_text_10 ).
           lr_column->r_column->set_medium_text( l_text_20 ).
           lr_column->r_column->set_long_text( l_text_40 ).

                   " lr_column->r_column->set_visible( '' ).
*                LOOP AT gt_output ASSIGNING <fs_output>. "WHERE pernr IS NOT INITIAL.
*                  lv_count2 = 3.
*                  WHILE lv_count2 LE 53.
*          ASSIGN COMPONENT lv_count2 OF STRUCTURE <fs_output> TO <ls_temp>.
*          IF <ls_temp> IS NOT INITIAL.
*                IF lv_flag EQ 0.
*                  lv_flag = 1.
*                  ENDIF.
*          ENDIF.
**          ENDIF.
*           IF lv_flag EQ 0.
*         lr_column->r_column->set_visible( '' ).
*         ENDIF.
*            ADD 1 TO lv_count2.
*            ENDWHILE.
*            CLEAR lv_flag.
*      ENDLOOP.

*       ELSE.
*         lr_column->r_column->set_visible( '' ).

*          ENDLOOP.
*        lr_column->r_column->set_visible( '' ).
*        ENDIF.

           ADD 1 TO lv_count.
       ENDIF.
ENDLOOP.
  DO 53 TIMES.
         LOOP AT gt_output ASSIGNING <fs_output>." WHERE  IS NOT INITIAL.
           ASSIGN COMPONENT lv_count2 OF STRUCTURE <fs_output> TO <ls_temp>.
           IF <ls_temp> IS not INITIAL.
             iv_flag = 'X'.
             exit.
           ENDIF.

   ENDLOOP.
   READ TABLE gt_salv_t_column_ref INTO lr_column->* INDEX sy-index.
   if iv_flag is not INITIAL.
      lr_column->r_column->set_visible( 'X' ).
   else.
      lr_column->r_column->set_visible( '' ).
     endif.
MODIFY gt_salv_t_column_ref FROM lr_column->*.
    ADD 1 TO lv_count2.
   ENDDO.
       IF lr_column->columnname EQ 'ABSSUM'.
            l_text_10 = l_text_20 = l_text_40 = 'Sum'.
         lr_column->r_column->set_short_text( l_text_10 ).
         lr_column->r_column->set_medium_text( l_text_20 ).
         lr_column->r_column->set_long_text( l_text_40 ).
       ENDIF.
   ENDMETHOD.        

1 ACCEPTED SOLUTION
Read only

Tomas_Buryanek
Product and Topic Expert
Product and Topic Expert
0 Likes
1,811

1) try set_visible( ABAP_FALSE ). Method has default parameter as true, and if you pass just '' it might take it as empty/not passed value.

2) if 1) does not help:

go_salv_columns->get( ) has returning parameter TYPE SALV_T_COLUMN_REF.

Which is table with column name and reference to column object.

I think you are looping through it wrongly.

Instead:


LOOP AT gt_salv_t_column_ref REFERENCE INTO lr_column.

     lr_column->r_column->set_visible( '' ).

ENDLOOP.

Try:


DATA: ls_salv_column LIKE LINE OF gt_salv_t_column_ref.

LOOP AT gt_salv_t_column_ref INTO ls_salv_column. "just structure, not reference

     ls_salv_column->r_column->set_visible( '' ).

ENDLOOP.

-- Tomas --

Hi,

I'm writing absence report. Main idea is to display every kind of absence in new column, and sum them up, with possibility to select which types should be displayed and which ones hidden (at selection screen). As far as i got is to display whole populated table and sum them up in last column. Bigger problem is to hide the columns that have no value or are not selected. I've tried quite big variety of solutions, but without success.  The ALV grid is generated dynamically, using method that sets properties of columns. The code is below. How can i make it work?

Thanks and regards,

Grzegorz Żyrek

    METHOD output_fields_adjustment.
         TYPES: BEGIN OF tty_names,
           name(25) TYPE c, "t554t-atext,
       END OF tty_names.
       DATA:
       lt_names TYPE TABLE OF tty_names,
       ls_names TYPE tty_names.
     FIELD-SYMBOLS:
           <fs_output>     LIKE LINE OF gt_output,
           <fs_554t>     TYPE t554t,
           <ls_header>   TYPE goty_head,
           <ls_name> TYPE tty_names.

     DATA lt_t554t TYPE STANDARD TABLE OF t554t.
     DATA wa_t554t LIKE LINE OF lt_t554t.
     DATA: lr_column TYPE REF TO salv_s_column_ref.
     DATA: l_text_10(10), l_text_20(20), l_text_40(40),
           l_boole   TYPE sap_bool.
     DATA lv_counter TYPE n.
     DATA lv_name    TYPE c LENGTH 10 VALUE 'P000_AWART'.
     DATA lv_count   TYPE i VALUE 1.
     DATA lv_count2   TYPE i VALUE 3.
     DATA iv_flag    TYPE c.

     FIELD-SYMBOLS: <fs_awart>   TYPE awart,
                    <ls_temp> TYPE string.
*                   <fr_column> TYPE salv_s_column_ref.

* Width optimized
     go_salv_columns->set_optimize( g_true ).
* get the columns
     gt_salv_t_column_ref = go_salv_columns->get( ).
*    READ TABLE gt_header ASSIGNING <ls_header> WITH TABLE KEY
*    SELECT SINGLE atext FROM t554t INTO l_text_10 WHERE sprsl EQ sy-langu AND awart EQ <ls_header>-awart.



     LOOP AT gt_salv_t_column_ref REFERENCE INTO lr_column.


        LOOP AT gt_header ASSIGNING <ls_header>.

         SELECT SINGLE * FROM t554t INTO wa_t554t WHERE sprsl EQ sy-langu AND
            moabw EQ p_sqnr AND
          awart EQ <ls_header>-absc_n.
         IF sy-subrc EQ 0.

           ENDIF.
           ls_names = wa_t554t-atext.

           COLLECT ls_names INTO lt_names.
           ENDLOOP.
*          LOOP AT lt_names ASSIGNING <ls_name>. "uncomment loop to test if reads header texts in a proper way
*           WRITE: /, <ls_name>-name.
*           ENDLOOP.

       IF lr_column->columnname EQ 'ID'.
         l_text_10 = l_text_20 = l_text_40 = 'Lp.'.
         lr_column->r_column->set_short_text( l_text_10 ).
         lr_column->r_column->set_medium_text( l_text_20 ).
         lr_column->r_column->set_long_text( l_text_40 ).
       ELSEIF lr_column->columnname EQ 'PERNR'.
*      ENDIF.

**
           l_text_10 = l_text_20 = l_text_40 = 'Lp.'.
           lr_column->r_column->set_short_text( l_text_10 ).
           lr_column->r_column->set_medium_text( l_text_20 ).
           lr_column->r_column->set_long_text( l_text_40 ).
       ELSEIF lr_column->columnname EQ 'SNAME'.
            l_text_10 = l_text_20 = l_text_40 = 'Name'.
         lr_column->r_column->set_short_text( l_text_10 ).
         lr_column->r_column->set_medium_text( l_text_20 ).
         lr_column->r_column->set_long_text( l_text_40 ).

         ELSE.

             READ TABLE lt_names ASSIGNING <ls_name> INDEX lv_count.
           l_text_10 = l_text_20 = l_text_40 = <ls_name>-name.
           lr_column->r_column->set_short_text( l_text_10 ).
           lr_column->r_column->set_medium_text( l_text_20 ).
           lr_column->r_column->set_long_text( l_text_40 ).

                   " lr_column->r_column->set_visible( '' ).
*                LOOP AT gt_output ASSIGNING <fs_output>. "WHERE pernr IS NOT INITIAL.
*                  lv_count2 = 3.
*                  WHILE lv_count2 LE 53.
*          ASSIGN COMPONENT lv_count2 OF STRUCTURE <fs_output> TO <ls_temp>.
*          IF <ls_temp> IS NOT INITIAL.
*                IF lv_flag EQ 0.
*                  lv_flag = 1.
*                  ENDIF.
*          ENDIF.
**          ENDIF.
*           IF lv_flag EQ 0.
*         lr_column->r_column->set_visible( '' ).
*         ENDIF.
*            ADD 1 TO lv_count2.
*            ENDWHILE.
*            CLEAR lv_flag.
*      ENDLOOP.

*       ELSE.
*         lr_column->r_column->set_visible( '' ).

*          ENDLOOP.
*        lr_column->r_column->set_visible( '' ).
*        ENDIF.

           ADD 1 TO lv_count.
       ENDIF.
ENDLOOP.
  DO 53 TIMES.
         LOOP AT gt_output ASSIGNING <fs_output>." WHERE  IS NOT INITIAL.
           ASSIGN COMPONENT lv_count2 OF STRUCTURE <fs_output> TO <ls_temp>.
           IF <ls_temp> IS not INITIAL.
             iv_flag = 'X'.
             exit.
           ENDIF.

   ENDLOOP.
   READ TABLE gt_salv_t_column_ref INTO lr_column->* INDEX sy-index.
   if iv_flag is not INITIAL.
      lr_column->r_column->set_visible( 'X' ).
   else.
      lr_column->r_column->set_visible( '' ).
     endif.
MODIFY gt_salv_t_column_ref FROM lr_column->*.
    ADD 1 TO lv_count2.
   ENDDO.
       IF lr_column->columnname EQ 'ABSSUM'.
            l_text_10 = l_text_20 = l_text_40 = 'Sum'.
         lr_column->r_column->set_short_text( l_text_10 ).
         lr_column->r_column->set_medium_text( l_text_20 ).
         lr_column->r_column->set_long_text( l_text_40 ).
       ENDIF.
   ENDMETHOD.        

3 REPLIES 3
Read only

Tomas_Buryanek
Product and Topic Expert
Product and Topic Expert
0 Likes
1,812

1) try set_visible( ABAP_FALSE ). Method has default parameter as true, and if you pass just '' it might take it as empty/not passed value.

2) if 1) does not help:

go_salv_columns->get( ) has returning parameter TYPE SALV_T_COLUMN_REF.

Which is table with column name and reference to column object.

I think you are looping through it wrongly.

Instead:


LOOP AT gt_salv_t_column_ref REFERENCE INTO lr_column.

     lr_column->r_column->set_visible( '' ).

ENDLOOP.

Try:


DATA: ls_salv_column LIKE LINE OF gt_salv_t_column_ref.

LOOP AT gt_salv_t_column_ref INTO ls_salv_column. "just structure, not reference

     ls_salv_column->r_column->set_visible( '' ).

ENDLOOP.

-- Tomas --
Read only

Patrick_vN
Active Contributor
0 Likes
1,811

You can check program SALV_TEST_TABLE_LAYOUT for an example on how to hide alv-columns while using the CL_SALV_TABLE class.

Read only

PeterJonker
Active Contributor
0 Likes
1,811

You need the method set_technical to hide the column.

I generally do something like:

gr_columns_table = gr_alv->get_columns( ).

l_rcl_struc ?=

          cl_abap_structdescr=>describe_by_data( wa_table )


* wa_table is the structure of your output alv table

  LOOP AT l_rcl_struc->components ASSIGNING <components>.

         lv_name = <components>-name.

      TRY.

             CASE lv_name.

               WHEN 'FIELDNAME_TO_BE_HIDDEN'

          gr_column = gr_columns_table->get_column( columnname = lv_name ).

        CALL METHOD gr_column->set_technical.

        CATCH cx_salv_not_found INTO lcx_salv_not_found.

             CALL METHOD lcx_salv_not_found->if_message~get_text

               RECEIVING

                 result = ls_message.

             WRITE ls_message.

         ENDTRY.

  ENDLOOP.