Application Development Blog Posts
Learn and share on deeper, cross technology development topics such as integration and connectivity, automation, cloud extensibility, developing at scale, and security.
cancel
Showing results for 
Search instead for 
Did you mean: 
deiamolina
Active Participant

Hi All,

Here is my code to generate ALV tree with 5 hierarchy dynamically (or less according with your needs and with no change in the code)  and changing just a perform parameters to generate it. I don’t know if it have a easier and better way to do but this one is working :smile:

If you know another way please share :wink:

So follow the code:

Declarations:

  • My output table and work area are called, respectively: it_output and wa_output.
  • My fieldcat declaration fieldcat  TYPE lvc_t_fcat,

DATA: tree1              TYPE REF TO cl_gui_alv_tree.

DATA: v_icon1            TYPE lvc_s_layi,
     v_icon2           
TYPE lvc_s_layi,
     v_icon3           
TYPE lvc_s_layi,
     v_icon4           
TYPE lvc_s_layi,
     v_icon5           
TYPE lvc_s_layi.

FIELD-SYMBOLS: <field1>    TYPE any,
              <field2>   
TYPE any,
              <field3>   
TYPE any,
              <field4>   
TYPE any,
              <field5>   
TYPE any,
              <reffield1>
TYPE any,
              <reffield2>
TYPE any,
              <reffield3>
TYPE any,
              <reffield4>
TYPE any,
              <reffield5>
TYPE any.

Logic:

  • Hierarchic Field parameter must be called EXACTLY as the field name declarated in your output table. 
  • Ref tab and Ref Field will be used to bring the field information (data element). <reffieldX> will be used to compare the last information and the actual one and create a new node or keep the informationa agrrouped. It’s really important to have it done correctly! You can’t compare bananas to apples, right?!
  • If you want just 3 levels, clean the #4 and #5 in field_symbol. (Keep the '' though) Simply like that.

*                                                           Hierarchic Field / Ref Tab /  Ref Field
PERFORM f_field_symbol USING: 'TYPED'    'T6B1T'      'VTEXT' "1
                             
'DESC'      'TB038B'    'TEXT'  "2
                             
'KNUMA'    'KONA'       'KNUMA' "3
                             
'KSCHL'     'VAKEVB'  'KSCHL' "4
                             
'KOTABNR' 'VAKEVB'  'KOTABNR'. "5

*&---------------------------------------------------------------------*
*&      Form  F_FIELD_SYMBOL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0299   text
*      -->P_0300   text
*      -->P_0301   text
*----------------------------------------------------------------------*
FORM f_field_symbol  USING field1 table1 param1
                            field2 table2 param2
                            field3 table3 param3
                            field4 table4 param4
                            field5 table5 param5
.

DATA r_elemdescr  TYPE REF TO cl_abap_elemdescr.
DATA r_field      TYPE REF TO data.
DATA: data_element TYPE dd04d-rollname.

IF field1 IS NOT INITIAL.

ASSIGN COMPONENT field1 OF STRUCTURE wa_output TO <field1>.
CHECK sy-subrc = 0.

PERFORM f_fieldinfo USING table1 param1
CHANGING data_element.

r_elemdescr ?= cl_abap_elemdescr
=>describe_by_name( data_element ).
CREATE DATA r_field TYPE HANDLE r_elemdescr.
ASSIGN r_field->* TO <reffield1>.
ENDIF.

IF field2 IS NOT INITIAL.

ASSIGN COMPONENT field2 OF STRUCTURE wa_output TO <field2>.
CHECK sy-subrc = 0.

PERFORM f_fieldinfo USING table2 param2
CHANGING data_element.

r_elemdescr ?= cl_abap_elemdescr
=>describe_by_name( data_element ).
CREATE DATA r_field TYPE HANDLE r_elemdescr.
ASSIGN r_field->* TO <reffield2>.
ENDIF.

IF field3 IS NOT INITIAL.

ASSIGN COMPONENT field3 OF STRUCTURE wa_output TO <field3>.
CHECK sy-subrc = 0.

PERFORM f_fieldinfo USING table3 param3
CHANGING data_element.

r_elemdescr ?= cl_abap_elemdescr
=>describe_by_name( data_element ).
CREATE DATA r_field TYPE HANDLE r_elemdescr.
ASSIGN r_field->* TO <reffield3>.

ENDIF.

IF field4 IS NOT INITIAL.

ASSIGN COMPONENT field4 OF STRUCTURE wa_output TO <field4>.
CHECK sy-subrc = 0.

PERFORM f_fieldinfo USING table4 param4
CHANGING data_element.

r_elemdescr ?= cl_abap_elemdescr
=>describe_by_name( data_element ).
CREATE DATA r_field TYPE HANDLE r_elemdescr.
ASSIGN r_field->* TO <reffield4>.
ENDIF.

IF param5 IS NOT INITIAL.
ASSIGN COMPONENT field5 OF STRUCTURE wa_output TO <field5>.
CHECK sy-subrc = 0.

PERFORM f_fieldinfo USING table5 param5
CHANGING data_element.

r_elemdescr ?= cl_abap_elemdescr
=>describe_by_name( data_element ).
CREATE DATA r_field TYPE HANDLE r_elemdescr.
ASSIGN r_field->* TO <reffield5>.
ENDIF.

PERFORM build_sort_table USING field1 field2 field3 field4 field5.

ENDFORM.                    " F_FIELD_SYMBOL

*&---------------------------------------------------------------------*
*&      Form  F_FIELDINFO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_TABLE1  text
*      -->P_PARAM1  text
*      <--P_DATA_ELEMENT  text
*----------------------------------------------------------------------*
FORM f_fieldinfo  USING    table
param
CHANGING data_element.


DATA: BEGIN OF dfies OCCURS 100.
INCLUDE STRUCTURE dfies.
DATA: END OF dfies.


DATA: tablenm  TYPE ddobjname,
fieldnm 
TYPE dfies-fieldname.

MOVE table TO tablenm.
MOVE param TO fieldnm.

***  Fname Description

IF NOT fieldnm IS INITIAL.
CALL FUNCTION 'DDIF_FIELDINFO_GET'
EXPORTING
tabname       
= tablenm
fieldname     
= fieldnm
langu         
= sy-langu
TABLES
dfies_tab     
= dfies
EXCEPTIONS
not_found     
= 1
internal_error
= 2
OTHERS         = 3.
IF sy-subrc = 0.
READ TABLE dfies INDEX 1.
data_element
= dfies-rollname.
ENDIF.
ENDIF.

ENDFORM.                    " F_FIELDINFO


Creating hierarchies

  • Basically it will change according to what you used as parameter in perform f_field_symbol.
  • Each node have your own perform because if you want to fill the 2nd node with something different to the standard counts (sum, avg, max, min, ... – flagging H_FTYPE on fieldcat and using call method tree1->update_calculations.)  you need to use the same work are type used in your detailed line and organize it to show up what you want to.

*&---------------------------------------------------------------------*
*&      Form  CREATE_HIERARCHY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM create_hierarchy .

* add data to tree
DATA: l_last_key  TYPE lvc_nkey,
l_kotabnr  
TYPE vakevb-kotabnr,
l_knuma    
TYPE vakevb-knuma,
l_desc
(100) TYPE c,
l_kschl    
TYPE vakevb-kschl,
l_add      
TYPE c.

DATA: l_param_key  TYPE lvc_nkey,
l_param2_key
TYPE lvc_nkey,
l_param3_key
TYPE lvc_nkey,
l_param4_key
TYPE lvc_nkey,
l_param5_key
TYPE lvc_nkey.

LOOP AT it_output INTO wa_output.

**** LEVEL 1
IF <field1> IS ASSIGNED.
IF <field2> IS ASSIGNED. "Level 2 is empty
IF <field1> IS NOT INITIAL.
IF <reffield1> NE <field1>.
PERFORM level1 USING ''
v_icon1
-fieldname
CHANGING l_param_key.


IF <field2> IS ASSIGNED.
CLEAR: <reffield2>.
ENDIF.

IF <field3> IS ASSIGNED.
CLEAR: <reffield3>.
ENDIF.

IF <field4> IS ASSIGNED.
CLEAR: <reffield4>.
ENDIF.

APPEND l_param_key TO it_expand_nodes.

ENDIF.
ENDIF.
ELSE.
"If next level is empty so finish the hierarchy
PERFORM add_complete_line USING '' 2
CHANGING l_last_key.
l_add
= 'X'.
ENDIF.
ENDIF.


**** LEVEL 2
IF <field2> IS ASSIGNED.
IF <field3> IS ASSIGNED. "Level 3 is empty
IF <field2> IS NOT INITIAL.
IF <reffield2> NE <field2>.
PERFORM level2 USING l_param_key
2
v_icon2
-fieldname
CHANGING l_param2_key.

IF <field3> IS ASSIGNED.
CLEAR: <reffield3>.
ENDIF.

IF <field4> IS ASSIGNED.
CLEAR: <reffield4>.
ENDIF.

APPEND l_param2_key TO it_expand_nodes.

ENDIF.
ENDIF.
ELSE.
"If next level is empty so finish the hierarchy
PERFORM add_complete_line USING L_PARAM_KEY 3
CHANGING l_last_key.
l_add
= 'X'.
ENDIF.
ENDIF.


*** LEVEL 3
IF <field3> IS ASSIGNED.
IF <field4> IS ASSIGNED. "Level 4 is empty
IF <field3> IS NOT INITIAL.
IF <reffield3> NE <field3>.
PERFORM level3 USING l_param2_key
3
v_icon3
-fieldname
CHANGING l_param3_key .


IF <field4> IS ASSIGNED.
CLEAR: <reffield4>.
ENDIF.

APPEND  l_param3_key TO it_expand_nodes.

ENDIF.
ENDIF.
ELSE.
"If next level is empty so finish the hierarchy
PERFORM add_complete_line USING l_param2_key 4
CHANGING l_last_key.
l_add
= 'X'.
ENDIF.
ENDIF.



*** LEVEL 4
IF <field4> IS ASSIGNED.
IF <field5> IS ASSIGNED. "Level 4 is empty
IF <field4> IS NOT INITIAL.
IF <reffield4> NE <field4>.
PERFORM level4 USING l_param3_key
3
v_icon3
-fieldname
CHANGING l_param4_key .


IF <field5> IS ASSIGNED.
CLEAR: <reffield5>.
ENDIF.

APPEND  l_param4_key TO it_expand_nodes.

ENDIF.
ENDIF.
ELSE.
"If next level is empty so finish the hierarchy
PERFORM add_complete_line USING l_param3_key 4
CHANGING l_last_key.
l_add
= 'X'.
ENDIF.
ENDIF.


*** LEVEL 5
IF <field5> IS ASSIGNED.
IF <field5> IS NOT INITIAL.
IF <reffield5> NE <field5>.
PERFORM level5 USING l_param4_key
4
v_icon5
-fieldname
CHANGING l_param5_key .

APPEND  l_param4_key TO it_expand_nodes.

PERFORM add_complete_line USING l_param5_key 6
CHANGING l_last_key.
l_add
= 'X'.

ENDIF.
ENDIF.
ENDIF.

IF l_add IS INITIAL.
PERFORM add_complete_line USING l_param5_key 5
CHANGING l_last_key.
ENDIF.

IF <field1> IS ASSIGNED.
<reffield1>
= <field1>.
ENDIF.

IF <field2> IS ASSIGNED.
<reffield2>
= <field2>.
ENDIF.

IF <field3> IS ASSIGNED.
<reffield3>
= <field3>.
ENDIF.

IF <field4> IS ASSIGNED.
<reffield4>
= <field4>.
ENDIF.

IF <field5> IS ASSIGNED.
<reffield5>
= <field5>.
ENDIF.

CLEAR: l_add.

ENDLOOP.

*&---------------------------------------------------------------------*
*&      Form  LEVEL1
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_WA_DATA  text
*      -->P_L_PARAM2_KEY  text
*      -->P_3      text
*      -->P_1748   text
*      <--P_L_PARAM3_KEY  text
*----------------------------------------------------------------------*
FORM level1 USING  p_relat_key TYPE lvc_nkey
p_icon
CHANGING p_node_key.

DATA: l_node_text TYPE lvc_value,
relat      
TYPE int4,
wa_refe    
TYPE tab_type,
wa_level  
TYPE ty_output.

* set item-layout
DATA: lt_item_layout TYPE lvc_t_layi,
ls_item_layout
TYPE lvc_s_layi.

DATA: ls_node TYPE lvc_s_layn.
ls_node
-n_image   = space.
ls_node
-exp_image = space.

ls_item_layout
-t_image = p_icon.
ls_item_layout
-style   = cl_gui_column_tree=>style_intensified.
ls_item_layout
-fieldname = tree1->c_hierarchy_column_name.
APPEND ls_item_layout TO lt_item_layout.

* add node
l_node_text
= <field1>.
wa_level
-level   = 1.

ls_node
-isfolder = 'X'.

CALL METHOD tree1->add_node
EXPORTING
i_relat_node_key    
= p_relat_key
i_relationship      
= cl_gui_column_tree=>relat_last_child
i_node_text         
= l_node_text
is_outtab_line      
= wa_level
is_node_layout      
= ls_node
it_item_layout      
= lt_item_layout
IMPORTING
e_new_node_key      
= p_node_key
EXCEPTIONS
relat_node_not_found
= 1
node_not_found      
= 2
OTHERS               = 3.

ENDFORM.                    " LEVEL1


*&---------------------------------------------------------------------*
*&      Form  LEVEL2
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_L_PARAM1_KEY  text
*      -->P_2      text
*      -->P_1721   text
*      <--P_L_PARAM2_KEY  text
*----------------------------------------------------------------------*
FORM level2  USING p_relat_key TYPE lvc_nkey
hierarchy
icon
CHANGING p_node_key TYPE lvc_nkey.

* set item-layout
DATA: lt_item_layout TYPE lvc_t_layi,
l_node_text   
TYPE lvc_value,
ls_item_layout
TYPE lvc_s_layi,
relat         
TYPE int4,
wa_level     
TYPE ty_output.

ls_item_layout
-t_image = icon.
ls_item_layout
-style   cl_gui_column_tree=>style_intensified.
ls_item_layout
-fieldname = tree1->c_hierarchy_column_name.
APPEND ls_item_layout TO lt_item_layout.

* add node
l_node_text
= <field2>.
wa_level
-level = hierarchy.


relat
= cl_gui_column_tree=>relat_last_child.
CALL METHOD tree1->add_node
EXPORTING
i_relat_node_key
= p_relat_key
i_relationship  
= relat
i_node_text     
= l_node_text
is_outtab_line  
= wa_level
it_item_layout  
= lt_item_layout
IMPORTING
e_new_node_key  
= p_node_key.


ENDFORM.                    "LEVEL2


*&---------------------------------------------------------------------*
*&      Form  LEVEL3
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_L_PARAM1_KEY  text
*      -->P_2      text
*      -->P_1721   text
*      <--P_L_PARAM2_KEY  text
*----------------------------------------------------------------------*
FORM level3  USING p_relat_key TYPE lvc_nkey
hierarchy
icon
CHANGING p_node_key TYPE lvc_nkey.

* set item-layout
DATA: lt_item_layout TYPE lvc_t_layi,
l_node_text   
TYPE lvc_value,
ls_item_layout
TYPE lvc_s_layi,
relat         
TYPE int4,
wa_level     
TYPE ty_output.

ls_item_layout
-t_image = icon.
ls_item_layout
-style   cl_gui_column_tree=>style_intensified.
ls_item_layout
-fieldname = tree1->c_hierarchy_column_name.
APPEND ls_item_layout TO lt_item_layout.

* add node
l_node_text
= <field3>.


wa_level
-knuma   = wa_output-knuma.

CONCATENATE wa_output-datab+6(2)
wa_output
-datab+4(2)
wa_output
-datab(4)
INTO wa_level-zzbrandd
SEPARATED BY '.'.

CONCATENATE wa_output-datbi+6(2)
wa_output
-datbi+4(2)
wa_output
-datbi(4)
INTO wa_level-kunnr
SEPARATED BY '.'.

wa_level
-matnr   = wa_output-waers.
wa_level
-kondm   = wa_output-agnotes.
wa_level
-level   = hierarchy.

relat
= cl_gui_column_tree=>relat_last_child.
CALL METHOD tree1->add_node
EXPORTING
i_relat_node_key
= p_relat_key
i_relationship  
= relat
i_node_text     
= l_node_text
is_outtab_line  
= wa_level
it_item_layout  
= lt_item_layout
IMPORTING
e_new_node_key  
= p_node_key.


ENDFORM.                    " LEVEL3

*&---------------------------------------------------------------------*
*&      Form  LEVEL4
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_L_PARAM1_KEY  text
*      -->P_2      text
*      -->P_1721   text
*      <--P_L_PARAM2_KEY  text
*----------------------------------------------------------------------*
FORM level4  USING p_relat_key TYPE lvc_nkey
hierarchy
icon
CHANGING p_node_key TYPE lvc_nkey.

* set item-layout
DATA: lt_item_layout TYPE lvc_t_layi,
l_node_text   
TYPE lvc_value,
ls_item_layout
TYPE lvc_s_layi,
relat         
TYPE int4,
wa_level     
TYPE ty_output.

ls_item_layout
-t_image = icon.
ls_item_layout
-style   cl_gui_column_tree=>style_intensified.
ls_item_layout
-fieldname = tree1->c_hierarchy_column_name.
APPEND ls_item_layout TO lt_item_layout.

* add node

l_node_text
= <field4>.

wa_level
-zzbrandd = wa_output-combin.
wa_level
-level   = hierarchy.

wa_level
-knuma = wa_output-knuma.

relat
= cl_gui_column_tree=>relat_last_child.
CALL METHOD tree1->add_node
EXPORTING
i_relat_node_key
= p_relat_key
i_relationship  
= relat
i_node_text     
= l_node_text
is_outtab_line  
= wa_level
it_item_layout  
= lt_item_layout
IMPORTING
e_new_node_key  
= p_node_key.


ENDFORM.                    "LEVEL4

*&---------------------------------------------------------------------*
*&      Form  LEVEL5
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_L_PARAM1_KEY  text
*      -->P_2      text
*      -->P_1721   text
*      <--P_L_PARAM2_KEY  text
*----------------------------------------------------------------------*
FORM level5  USING p_relat_key TYPE lvc_nkey
hierarchy
icon
CHANGING p_node_key TYPE lvc_nkey.

* set item-layout
DATA: lt_item_layout TYPE lvc_t_layi,
l_node_text   
TYPE lvc_value,
ls_item_layout
TYPE lvc_s_layi,
relat         
TYPE int4,
wa_level     
TYPE ty_output.

ls_item_layout
-t_image = icon.
ls_item_layout
-style   cl_gui_column_tree=>style_intensified.
ls_item_layout
-fieldname = tree1->c_hierarchy_column_name.
APPEND ls_item_layout TO lt_item_layout.

* add node

l_node_text
= <field5>.

wa_level
-zzbrandd = wa_output-combin.
wa_level
-level   = hierarchy.

wa_level
-knuma = wa_output-knuma.

relat
= cl_gui_column_tree=>relat_last_child.
CALL METHOD tree1->add_node
EXPORTING
i_relat_node_key
= p_relat_key
i_relationship  
= relat
i_node_text     
= l_node_text
is_outtab_line  
= wa_level
it_item_layout  
= lt_item_layout
IMPORTING
e_new_node_key  
= p_node_key.


ENDFORM.                    "LEVEL5

*&---------------------------------------------------------------------*
*&      Form  add_cmplete_line
*&---------------------------------------------------------------------*
*       add hierarchy-level 3 to tree
*----------------------------------------------------------------------*
*      -->P_LS_SFLIGHT  sflight
*      -->P_RELEATKEY   relatkey
*     <-->p_node_key    new node-key
*----------------------------------------------------------------------*
FORM add_complete_line USING  p_relat_key TYPE lvc_nkey
hierarchy
CHANGING  p_node_key TYPE lvc_nkey.

DATA: l_node_text TYPE lvc_value.

* set item-layout
DATA: lt_item_layout TYPE lvc_t_layi,
ls_item_layout
TYPE lvc_s_layi.

ls_item_layout
-fieldname = tree1->c_hierarchy_column_name.
APPEND ls_item_layout TO lt_item_layout.

l_node_text
= wa_output-bonem.

IF l_node_text IS INITIAL.
MESSAGE s021(zgeral) DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.

DATA: ls_node TYPE lvc_s_layn.
ls_node
-n_image   = space.
ls_node
-exp_image = space.

wa_output
-level = hierarchy.

CALL METHOD tree1->add_node
EXPORTING
i_relat_node_key
= p_relat_key
i_relationship  
= cl_gui_column_tree=>relat_last_child
is_outtab_line  
= wa_output
i_node_text     
= l_node_text
is_node_layout  
= ls_node
it_item_layout  
= lt_item_layout
IMPORTING
e_new_node_key  
= p_node_key.
ENDFORM.                               " add_complete_line

I think that is everything here. Let me know if I missed something or someone need help to understand it.

Hope it helps.

Regards,

Andréa

8 Comments