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

Problem with hierarchical lists

Former Member
0 Likes
1,388


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

1 ACCEPTED SOLUTION
Read only

deependra_shekhawat3
Contributor
0 Likes
1,231

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

8 REPLIES 8
Read only

Former Member
0 Likes
1,231

Hello!

Try to control selections manually. When they are to be gone, save them and after that restore them.

Read only

0 Likes
1,231

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.

Read only

deependra_shekhawat3
Contributor
0 Likes
1,232

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

Read only

0 Likes
1,231

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

Read only

0 Likes
1,231

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

Read only

0 Likes
1,231

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

Read only

0 Likes
1,231

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

Read only

0 Likes
1,231

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