2014 Jan 17 2:56 PM
I have created a hierarchical list with cl_salv_hierseq_table.
This list has 2 levels and a selection field for lines of level 1.
When any number of lines of level one have been selected and now I expand a line of level 1 to see the corresponding lines of level 2 all selections are gone.
I have found 2 reports which demonstrate how to use hierarchical lists and which use a selection field too:
SALV_DEMO_HIERSEQ_REFRESH Demonstration for REFRESH in ALV OM
SALV_TEST_HIERSEQ_REFRESH Demonstration for REFRESH in ALV OM
Both of them show the same behaviour as my program. So they don't contain the solution of the problem.
Is there a solution for this problem?
Thanks in advance for any help.
Regards
Bruno
2014 Jan 20 8:33 AM
Hi,
Please check DEMO program SALV_DEMO_HIERSEQ_COLUMN , I think problem is related to column assignment.
You can also go through Rich's tutorial http://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/b0f03986-046c-2910-a5aa-e5364e96e...
If still you face any problem, please share your code.
Thanks
Deependra
2014 Jan 20 7:14 AM
Hello!
Try to control selections manually. When they are to be gone, save them and after that restore them.
2014 Jan 20 6:51 PM
Hello Sergey,
thanks for your advice.
The problem is: When a selection has been made and then an item is expanded or collapsed, I don't get the control to save the selections.
2014 Jan 20 8:33 AM
Hi,
Please check DEMO program SALV_DEMO_HIERSEQ_COLUMN , I think problem is related to column assignment.
You can also go through Rich's tutorial http://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/b0f03986-046c-2910-a5aa-e5364e96e...
If still you face any problem, please share your code.
Thanks
Deependra
2014 Jan 21 2:05 PM
Hello Deependra,
here is the coding of a small test program which is analogous to the program I'm writing.
*&---------------------------------------------------------------------*
*& Report /VFE/JTO_CTS_TEST_MARK_ALV
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT /vfe/jto_cts_test_mark_alv.
TYPES: gyv_impseqnr TYPE n LENGTH 5.
TYPES: BEGIN OF gys_tr_q_infos,
trkorr TYPE trkorr,
owner TYPE tr_as4user,
tarcli_q TYPE trtarcli,
as4date TYPE as4date,
as4time TYPE as4time,
as4text TYPE as4text,
bufpos TYPE n LENGTH 6,
impseqnr TYPE gyv_impseqnr,
expand TYPE char01,
END OF gys_tr_q_infos.
TYPES: gyt_tr_q_infos TYPE TABLE OF gys_tr_q_infos.
TYPES: BEGIN OF gys_comment,
trkorr TYPE trkorr,
tarcli_q TYPE trtarcli,
comment TYPE c LENGTH 100,
END OF gys_comment.
TYPES: gyt_comments TYPE TABLE OF gys_comment WITH DEFAULT KEY.
TYPES: gyv_header TYPE c LENGTH 150,
gyt_header TYPE STANDARD TABLE OF gyv_header.
DATA: gt_level_1 TYPE gyt_tr_q_infos,
gt_level_2 TYPE gyt_comments,
lv_header TYPE gyv_header,
gs_tr_q_infos TYPE gys_tr_q_infos,
gt_tr_q_infos TYPE gyt_tr_q_infos,
gs_comment TYPE gys_comment.
DATA: go_hierseq TYPE REF TO cl_salv_hierseq_table,
go_header TYPE REF TO cl_salv_form_header_info.
DATA:
gt_binding TYPE salv_t_hierseq_binding,
gs_binding TYPE salv_s_hierseq_binding.
DATA:
go_functions TYPE REF TO cl_salv_functions_list.
DATA:
go_columns TYPE REF TO cl_salv_columns_hierseq,
go_column TYPE REF TO cl_salv_column,
go_alv_selections TYPE REF TO cl_salv_selections.
DATA:
go_level TYPE REF TO cl_salv_hierseq_level.
CONSTANTS: gc_true TYPE xfeld VALUE 'X',
gc_false TYPE xfeld VALUE space.
START-OF-SELECTION.
gs_tr_q_infos-trkorr = 'TR1'.
gs_tr_q_infos-tarcli_q = 'CL1'.
gs_tr_q_infos-owner = 'Owner1'.
gs_tr_q_infos-as4date = '20111029'.
gs_tr_q_infos-bufpos = 111.
gs_tr_q_infos-impseqnr = 11.
APPEND gs_tr_q_infos TO gt_level_1.
gs_tr_q_infos-trkorr = 'TR2'.
gs_tr_q_infos-tarcli_q = 'CL2'.
gs_tr_q_infos-owner = 'Owner1'.
gs_tr_q_infos-as4date = '20120830'.
gs_tr_q_infos-bufpos = 222.
gs_tr_q_infos-impseqnr = 22.
APPEND gs_tr_q_infos TO gt_level_1.
gs_comment-trkorr = 'TR1'.
gs_comment-tarcli_q = 'CL1'.
gs_comment-comment = 'Comment_1'.
APPEND gs_comment TO gt_level_2.
gs_comment-trkorr = 'TR2'.
gs_comment-tarcli_q = 'CL2'.
gs_comment-comment = 'Comment_2'.
APPEND gs_comment TO gt_level_2.
lv_header = 'Top of page'.
*... §2.1 create the binding information between master and slave
gs_binding-master = 'TRKORR'.
gs_binding-slave = 'TRKORR'.
APPEND gs_binding TO gt_binding.
gs_binding-master = 'TARCLI_Q'.
gs_binding-slave = 'TARCLI_Q'.
APPEND gs_binding TO gt_binding.
*... §2.2 create an ALV hierseq table
TRY.
cl_salv_hierseq_table=>factory(
EXPORTING
t_binding_level1_level2 = gt_binding
IMPORTING
r_hierseq = go_hierseq
CHANGING
t_table_level1 = gt_level_1
t_table_level2 = gt_level_2 ).
CATCH cx_salv_data_error cx_salv_not_found.
ENDTRY.
*... §3 Functions
*... §3.1 activate ALV generic Functions
go_functions = go_hierseq->get_functions( ).
go_functions->set_all( abap_true ).
*... *** MASTER Settings ***
*... set the columns technical
TRY.
go_columns = go_hierseq->get_columns( 1 ).
CATCH cx_salv_not_found.
ENDTRY.
TRY.
go_column = go_columns->get_column( 'TARCLI_Q' ).
go_column->set_output_length( 15 ).
CATCH cx_salv_not_found. "#EC NO_HANDLER
ENDTRY.
TRY.
go_column = go_columns->get_column( 'BUFPOS' ).
go_column->set_output_length( 8 ).
go_column->set_short_text( 'Buff-Pos' ).
CATCH cx_salv_not_found. "#EC NO_HANDLER
ENDTRY.
TRY.
go_column = go_columns->get_column( 'IMPSEQNR' ).
go_column->set_output_length( 11 ).
go_column->set_short_text( 'Import-Pos' ).
CATCH cx_salv_not_found. "#EC NO_HANDLER
ENDTRY.
*... set expand column
TRY.
go_columns->set_expand_column( 'EXPAND' ).
CATCH cx_salv_data_error. "#EC NO_HANDLER
ENDTRY.
*... set items expanded
TRY.
go_level = go_hierseq->get_level( 1 ).
go_level->set_items_expanded( gc_false ).
CATCH cx_salv_not_found.
ENDTRY.
TRY.
go_alv_selections = go_hierseq->get_selections( 1 ).
go_alv_selections->set_selection_mode( 1 ).
CATCH cx_salv_not_found.
ENDTRY.
*... *** SLAVE Settings ***
TRY.
go_columns = go_hierseq->get_columns( 2 ).
CATCH cx_salv_not_found.
ENDTRY.
DATA: "lv_row TYPE /VFE/JTO_CTS_INT4, " LINE OF SALV_T_ROW.
gt_rows TYPE salv_t_row,
gt_rows_sel TYPE salv_t_row,
lv_row TYPE i.
lv_row = 2.
APPEND lv_row TO gt_rows.
go_alv_selections->set_selected_rows( gt_rows ).
gt_rows_sel = go_alv_selections->get_selected_rows( ).
TRY.
go_column = go_columns->get_column( 'TARCLI_Q' ).
go_column->set_output_length( 15 ).
CATCH cx_salv_not_found. "#EC NO_HANDLER
ENDTRY.
TRY.
go_column = go_columns->get_column( 'COMMENT' ).
go_column->set_short_text( 'Error' ).
CATCH cx_salv_not_found. "#EC NO_HANDLER
ENDTRY.
* PERFORM set_columns_technical USING go_columns.
CREATE OBJECT go_header
EXPORTING
text = lv_header.
go_hierseq->set_top_of_list( EXPORTING value = go_header ).
*... §4 display the table
go_hierseq->display( ).
Thanks for your time and effort.
Regards
Bruno
2014 Jan 22 9:53 AM
Hi Bruno,
I have seen your program. Yes you are right, Selection mode check getting disable after expand/collaps the hierarchy list.I think ALV selection class could not gets default setting from output expand/collaps.I also didnt get any solution because default events are not using it.
My question is, Do you really need selection Mode?? I don't think that is much useful here.
If possible, why not you remove the line of code which is showing selection mode check box .also remove the code where you are setting row value for go_alv_selections.
* TRY.
* go_alv_selections = go_hierseq->get_selections( 1 ).
* go_alv_selections->set_selection_mode( 1 ).
* CATCH cx_salv_not_found.
* ENDTRY.
* DATA: "lv_row TYPE /VFE/JTO_CTS_INT4, " LINE OF SALV_T_ROW.
* gt_rows TYPE salv_t_row,
* gt_rows_sel TYPE salv_t_row,
* lv_row TYPE i.
*
* lv_row = 2.
* APPEND lv_row TO gt_rows.
* go_alv_selections->set_selected_rows( gt_rows ).
*
* gt_rows_sel = go_alv_selections->get_selected_rows( ).
And if you still wants to use selection mode check box, you can try by defining local event on expand/collaps.
Thanks
Deependra
2014 Jan 22 6:42 PM
Hello Deependra,
I have defined a handler method for all events which are available in cl_salv_events_hierseq. The only on which is processed when lines are expanded or collapsed is
top_of_page.
But unfortunately when I try to get the selected lines via the method
get_selected_rows( ) of the class cl_salv_selections
the result is an empty table, that is the selections are already gone.
Here is the modified version of the test program:
*&---------------------------------------------------------------------*
*& Report /VFE/JTO_CTS_TEST_MARK_ALV
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT /vfe/jto_cts_test_mark_alv.
TYPES: gyv_impseqnr TYPE n LENGTH 5.
TYPES: BEGIN OF gys_tr_q_infos,
trkorr TYPE trkorr,
owner TYPE tr_as4user,
tarcli_q TYPE trtarcli,
as4date TYPE as4date,
as4time TYPE as4time,
as4text TYPE as4text,
bufpos TYPE n LENGTH 6,
impseqnr TYPE gyv_impseqnr,
expand TYPE char01,
END OF gys_tr_q_infos.
TYPES: gyt_tr_q_infos TYPE TABLE OF gys_tr_q_infos.
TYPES: BEGIN OF gys_comment,
trkorr TYPE trkorr,
tarcli_q TYPE trtarcli,
comment TYPE c LENGTH 100,
END OF gys_comment.
TYPES: gyt_comments TYPE TABLE OF gys_comment WITH DEFAULT KEY.
TYPES: gyv_header TYPE c LENGTH 150,
gyt_header TYPE STANDARD TABLE OF gyv_header.
DATA: gt_level_1 TYPE gyt_tr_q_infos,
gt_level_2 TYPE gyt_comments,
lv_header TYPE gyv_header,
gs_tr_q_infos TYPE gys_tr_q_infos,
gt_tr_q_infos TYPE gyt_tr_q_infos,
gs_comment TYPE gys_comment.
DATA: go_hierseq TYPE REF TO cl_salv_hierseq_table,
go_header TYPE REF TO cl_salv_form_header_info.
DATA:
gt_binding TYPE salv_t_hierseq_binding,
gs_binding TYPE salv_s_hierseq_binding.
DATA:
go_functions TYPE REF TO cl_salv_functions_list.
DATA:
go_columns TYPE REF TO cl_salv_columns_hierseq,
go_column TYPE REF TO cl_salv_column,
go_alv_selections TYPE REF TO cl_salv_selections.
DATA:
go_level TYPE REF TO cl_salv_hierseq_level.
DATA: "lv_row TYPE /VFE/JTO_CTS_INT4, " LINE OF SALV_T_ROW.
gt_rows TYPE salv_t_row,
gt_rows_sel TYPE salv_t_row,
lv_row TYPE i.
*----------------------------------------------------------------------*
* CLASS lcl_handle_events DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_handle_events DEFINITION.
PUBLIC SECTION.
METHODS:
on_top_of_page FOR EVENT top_of_page OF cl_salv_events_hierseq
IMPORTING r_top_of_page page table_index,
on_end_of_page FOR EVENT end_of_page OF cl_salv_events_hierseq
IMPORTING r_end_of_page page,
on_before_salv_function FOR EVENT before_salv_function OF cl_salv_events_hierseq
IMPORTING e_salv_function,
on_after_salv_function FOR EVENT after_salv_function OF cl_salv_events_hierseq
IMPORTING e_salv_function,
on_added_function FOR EVENT added_function OF cl_salv_events_hierseq
IMPORTING e_salv_function,
on_double_click FOR EVENT double_click OF cl_salv_events_hierseq
IMPORTING level row column,
on_link_click FOR EVENT double_click OF cl_salv_events_hierseq
IMPORTING level row column.
ENDCLASS. "lcl_handle_events DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_handle_events IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_handle_events IMPLEMENTATION.
METHOD on_top_of_page.
MESSAGE 'on_top_of_page' TYPE 'I'.
gt_rows_sel = go_alv_selections->get_selected_rows( ).
ENDMETHOD. "on_after_user_command
METHOD on_end_of_page.
MESSAGE 'on_end_of_page' TYPE 'I'.
ENDMETHOD. "on_after_user_command
METHOD on_before_salv_function.
MESSAGE 'on_before_SALV_FUNCTION' TYPE 'I'.
ENDMETHOD. "on_before_user_command
METHOD on_after_salv_function.
MESSAGE 'on_after_SALV_FUNCTION' TYPE 'I'.
ENDMETHOD. "on_after_user_command
METHOD on_added_function.
MESSAGE 'on_added_FUNCTION' TYPE 'I'.
ENDMETHOD. "on_after_user_command
METHOD on_double_click.
MESSAGE 'on_double_click' TYPE 'I'.
ENDMETHOD. "on_double_click
METHOD on_link_click.
MESSAGE 'on_link_click' TYPE 'I'.
ENDMETHOD. "on_link_click
ENDCLASS. "lcl_handle_events IMPLEMENTATION
CONSTANTS: gc_true TYPE xfeld VALUE 'X',
gc_false TYPE xfeld VALUE space.
START-OF-SELECTION.
gs_tr_q_infos-trkorr = 'TR1'.
gs_tr_q_infos-tarcli_q = 'CL1'.
gs_tr_q_infos-owner = 'Owner1'.
gs_tr_q_infos-as4date = '20111029'.
gs_tr_q_infos-bufpos = 111.
gs_tr_q_infos-impseqnr = 11.
APPEND gs_tr_q_infos TO gt_level_1.
gs_tr_q_infos-trkorr = 'TR2'.
gs_tr_q_infos-tarcli_q = 'CL2'.
gs_tr_q_infos-owner = 'Owner1'.
gs_tr_q_infos-as4date = '20120830'.
gs_tr_q_infos-bufpos = 222.
gs_tr_q_infos-impseqnr = 22.
APPEND gs_tr_q_infos TO gt_level_1.
gs_comment-trkorr = 'TR1'.
gs_comment-tarcli_q = 'CL1'.
gs_comment-comment = 'Comment_1'.
APPEND gs_comment TO gt_level_2.
gs_comment-trkorr = 'TR2'.
gs_comment-tarcli_q = 'CL2'.
gs_comment-comment = 'Comment_2'.
APPEND gs_comment TO gt_level_2.
lv_header = 'Top of page'.
*... §2.1 create the binding information between master and slave
gs_binding-master = 'TRKORR'.
gs_binding-slave = 'TRKORR'.
APPEND gs_binding TO gt_binding.
gs_binding-master = 'TARCLI_Q'.
gs_binding-slave = 'TARCLI_Q'.
APPEND gs_binding TO gt_binding.
*... §2.2 create an ALV hierseq table
TRY.
cl_salv_hierseq_table=>factory(
EXPORTING
t_binding_level1_level2 = gt_binding
IMPORTING
r_hierseq = go_hierseq
CHANGING
t_table_level1 = gt_level_1
t_table_level2 = gt_level_2 ).
CATCH cx_salv_data_error cx_salv_not_found.
ENDTRY.
*... §3 Functions
*... §3.1 activate ALV generic Functions
go_functions = go_hierseq->get_functions( ).
go_functions->set_all( abap_true ).
*... *** MASTER Settings ***
*... set the columns technical
TRY.
go_columns = go_hierseq->get_columns( 1 ).
CATCH cx_salv_not_found.
ENDTRY.
TRY.
go_column = go_columns->get_column( 'TARCLI_Q' ).
go_column->set_output_length( 15 ).
CATCH cx_salv_not_found. "#EC NO_HANDLER
ENDTRY.
TRY.
go_column = go_columns->get_column( 'BUFPOS' ).
go_column->set_output_length( 8 ).
go_column->set_short_text( 'Buff-Pos' ).
CATCH cx_salv_not_found. "#EC NO_HANDLER
ENDTRY.
TRY.
go_column = go_columns->get_column( 'IMPSEQNR' ).
go_column->set_output_length( 11 ).
go_column->set_short_text( 'Import-Pos' ).
CATCH cx_salv_not_found. "#EC NO_HANDLER
ENDTRY.
*... set expand column
TRY.
go_columns->set_expand_column( 'EXPAND' ).
CATCH cx_salv_data_error. "#EC NO_HANDLER
ENDTRY.
*... set items expanded
TRY.
go_level = go_hierseq->get_level( 1 ).
go_level->set_items_expanded( gc_false ).
CATCH cx_salv_not_found.
ENDTRY.
TRY.
go_alv_selections = go_hierseq->get_selections( 1 ).
go_alv_selections->set_selection_mode( 1 ).
CATCH cx_salv_not_found.
ENDTRY.
*... *** SLAVE Settings ***
TRY.
go_columns = go_hierseq->get_columns( 2 ).
CATCH cx_salv_not_found.
ENDTRY.
lv_row = 2.
APPEND lv_row TO gt_rows.
go_alv_selections->set_selected_rows( gt_rows ).
gt_rows_sel = go_alv_selections->get_selected_rows( ).
TRY.
go_column = go_columns->get_column( 'TARCLI_Q' ).
go_column->set_output_length( 15 ).
CATCH cx_salv_not_found. "#EC NO_HANDLER
ENDTRY.
TRY.
go_column = go_columns->get_column( 'COMMENT' ).
go_column->set_short_text( 'Error' ).
CATCH cx_salv_not_found. "#EC NO_HANDLER
ENDTRY.
* PERFORM set_columns_technical USING go_columns.
CREATE OBJECT go_header
EXPORTING
text = lv_header.
DATA go_handle_events TYPE REF TO lcl_handle_events.
CREATE OBJECT go_handle_events.
DATA go_events TYPE REF TO cl_salv_events_hierseq.
go_events = go_hierseq->get_event( ).
SET HANDLER
go_handle_events->on_double_click
go_handle_events->on_link_click
go_handle_events->on_added_function
go_handle_events->on_after_salv_function
go_handle_events->on_before_salv_function
go_handle_events->on_end_of_page
go_handle_events->on_top_of_page
FOR go_events.
go_hierseq->set_top_of_list( EXPORTING value = go_header ).
*... §4 display the table
go_hierseq->display( ).
Thanks again for your help.
Kind regards
Bruno
2014 Jan 23 9:32 AM
Hi Bruno,
If your selection mode check box have fix number e.g. 1 or 2 why don't you put the selection code in event top of page as below :
CLASS lcl_handle_events IMPLEMENTATION.
METHOD on_top_of_page.
MESSAGE 'on_top_of_page' TYPE 'I'.
REFRESH gt_rows.
lv_row = 2.
APPEND lv_row TO gt_rows.
go_alv_selections->set_selected_rows( gt_rows ).
ENDMETHOD. "on_after_user_command
Yes i have checked, after expand the row, go_alv_selection don't have row number as it is used for ALV selection. Or may be actual row number could be get by different class as it is now showing through get_selected_rows.
Have you tried with CL_SALV_SELECTIONS_TREE ,?? I think that could provide us current row number while expand. Try with it, i am not sure it will fulfill out requirement.
Thanks
Deependra
2014 Jan 23 5:30 PM
Hello Deependra,
when I try to use the class
CL_SALV_SELECTIONS_TREE
I encounter an error message regarding the statement
DATA: go_hierseq TYPE REF TO cl_salv_hierseq_table,.
DATA: go_alv_selections_tree TYPE REF TO CL_SALV_SELECTIONS_TREE.
go_alv_selections_tree = go_hierseq->get_selections( 1 ). <<<<<<<<<<<<
saying
The result type of the functional method cannot be converted into the
type of GO_ALV_SELECTIONS_TREE.
Thanks for your support.
Kind regards
Bruno