2016 Feb 11 10:54 AM
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.
2016 Feb 11 11:46 AM
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.
2016 Feb 11 11:46 AM
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.
2016 Feb 11 12:01 PM
You can check program SALV_TEST_TABLE_LAYOUT for an example on how to hide alv-columns while using the CL_SALV_TABLE class.
2016 Feb 11 1:39 PM
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.