..3 Printing program
Create a report Z_ORGUNIT_HIERARCHY and paste below code:
REPORT z_orgunit_hierarchy .
TYPE-POOLS:
abap .
TYPES:
BEGIN OF ty_s_alvtree_outtab ,
objid TYPE objec-objid ,
stras TYPE p1028-stras ,
ort01 TYPE p1028-ort01 ,
pstlz TYPE p1028-pstlz ,
land1 TYPE p1028-land1 ,
END OF ty_s_alvtree_outtab ,
ty_t_alvtree_outtab TYPE STANDARD TABLE OF ty_s_alvtree_outtab .
DATA:
gv_plvar TYPE objec-plvar ,
gr_alvtree TYPE REF TO cl_salv_tree ,
gt_alvtree_outtab TYPE ty_t_alvtree_outtab .
* fill the context
PERFORM fill_context .
* call the form
CALL FUNCTION 'ZXLWB_CALLFORM'
EXPORTING
iv_formname = 'ORGUNIT_HIERARCHY'
iv_context_ref = gr_alvtree
EXCEPTIONS
process_terminated = 1
OTHERS = 2.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
EXIT .
ENDIF .
*&---------------------------------------------------------------------*
*& Form fill_context
*&---------------------------------------------------------------------*
FORM fill_context .
CALL FUNCTION 'RH_GET_PLVAR'
IMPORTING
plvar = gv_plvar
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
EXIT .
ENDIF .
* create tree
TRY .
cl_salv_tree=>factory( EXPORTING r_container = cl_gui_container=>default_screen
IMPORTING r_salv_tree = gr_alvtree
CHANGING t_table = gt_alvtree_outtab ) .
CATCH cx_salv_no_new_data_allowed cx_salv_error .
EXIT .
ENDTRY .
* add nodes to the tree
PERFORM fill_context_add_nodes
USING 'O' '00000001' space
CHANGING gr_alvtree .
* modify fieldcatalog (if required)
DATA:
lr_columns TYPE REF TO cl_salv_columns_tree ,
lr_column TYPE REF TO cl_salv_column ,
lt_column_ref TYPE salv_t_column_ref .
FIELD-SYMBOLS:
<column_ref> TYPE salv_s_column_ref .
lr_columns = gr_alvtree->get_columns( ) .
lr_columns->set_optimize( abap_on ) .
lt_column_ref = lr_columns->get( ) .
LOOP AT lt_column_ref ASSIGNING <column_ref> .
CASE <column_ref>-columnname .
WHEN 'OBJID' . <column_ref>-r_column->set_output_length( 15 ) .
WHEN 'LAND1' . <column_ref>-r_column->set_output_length( 15 ) .
ENDCASE .
ENDLOOP .
gr_alvtree->display( ) .
ENDFORM . "fill_context
*&---------------------------------------------------------------------*
*& Form add_nodes
*&---------------------------------------------------------------------*
FORM fill_context_add_nodes
USING pv_parent_otype TYPE any
pv_parent_objid TYPE any
pv_parent_nkey TYPE any
CHANGING
cr_alvtree TYPE REF TO cl_salv_tree .
DATA:
ls_result_struc TYPE struc ,
lt_result_struc TYPE STANDARD TABLE OF struc ,
ls_p1028 TYPE p1028 ,
lt_p1028 TYPE STANDARD TABLE OF p1028 .
DATA:
ls_salvtree_outtab TYPE ty_s_alvtree_outtab ,
lv_ntext TYPE lvc_value ,
lv_nkey TYPE lvc_nkey .
CALL FUNCTION 'RH_STRUC_GET'
EXPORTING
act_otype = pv_parent_otype
act_objid = pv_parent_objid
act_wegid = 'O-O_DOWN'
act_plvar = gv_plvar
act_begda = sy-datum
act_endda = sy-datum
act_tdepth = 2
act_tflag = abap_off
act_vflag = abap_off
authority_check = abap_off
TABLES
result_struc = lt_result_struc
EXCEPTIONS
OTHERS = 0.
DELETE lt_result_struc WHERE objid EQ pv_parent_objid .
CHECK lt_result_struc[] IS NOT INITIAL .
LOOP AT lt_result_struc INTO ls_result_struc .
CLEAR ls_salvtree_outtab .
CLEAR lv_ntext .
CLEAR lt_p1028 .
*---->> node text (org.unit name)
SELECT SINGLE orgtx
INTO lv_ntext
FROM t527x
WHERE sprsl EQ 'E'
AND orgeh EQ ls_result_struc-objid
AND begda LE sy-datum
AND endda GE sy-datum .
CHECK lv_ntext IS NOT INITIAL .
*---->> address fields
ls_salvtree_outtab-objid = ls_result_struc-objid .
CALL FUNCTION 'RH_GET_ADDRESS'
EXPORTING
plvar = gv_plvar
otype = 'O'
objid = ls_salvtree_outtab-objid
begda = sy-datum
endda = sy-datum
TABLES
address = lt_p1028.
READ TABLE lt_p1028 INTO ls_p1028 INDEX 1 .
IF sy-subrc EQ 0 .
MOVE-CORRESPONDING ls_p1028 TO ls_salvtree_outtab .
ENDIF .
*---->> add current node to the tree
TRY .
DATA:
lr_nodes TYPE REF TO cl_salv_nodes ,
lr_node TYPE REF TO cl_salv_node ,
lr_item TYPE REF TO cl_salv_item .
lr_nodes = cr_alvtree->get_nodes( ) .
lr_node = lr_nodes->add_node( related_node = pv_parent_nkey
data_row = ls_salvtree_outtab
relationship = cl_gui_column_tree=>relat_last_child
text = lv_ntext ) .
lv_nkey = lr_node->get_key( ) .
CATCH cx_salv_msg .
ENDTRY .
*---->> recursively adding child nodes
PERFORM fill_context_add_nodes
USING ls_result_struc-otype
ls_result_struc-objid
lv_nkey
CHANGING
cr_alvtree .
ENDLOOP .
ENDFORM . "fill_context_add_nodes