..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


 

Result of the printing program execution:


Export ALV TREE from ABAP to Excel