..3 Printing program

Create a report Z_ORGUNIT_HIERARCHY_2 and paste below code:


REPORT z_orgunit_hierarchy_2 .

*declares
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
                                 WITH DEFAULT KEY .
TYPES:
  BEGIN OF ty_s_alvtree_outtab_stack ,
    outtab                  TYPE ty_t_alvtree_outtab ,
  END   OF ty_s_alvtree_outtab_stack ,
  ty_t_alvtree_outtab_stack TYPE STANDARD TABLE OF ty_s_alvtree_outtab_stack .
DATA:
  gv_plvar                  TYPE objec-plvar ,
  gt_alvtree_outtab_stack   TYPE ty_t_alvtree_outtab_stack ,
  gt_context                TYPE zcontext_orgunit_hier_tab .

* fill the context
PERFORM fill_context .

* call the form
CALL FUNCTION 'ZXLWB_CALLFORM'
  EXPORTING
    iv_formname        = 'ORGUNIT_HIERARCHY_2'
    iv_context_ref     = gt_context
  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 .

  DATA:
    ls_result_struc         TYPE struc ,
    lt_result_struc         TYPE STANDARD TABLE OF struc ,
    lv_orgtx                TYPE t527x-orgtx ,
    lv_tabix                TYPE sy-tabix .
  FIELD-SYMBOLS:
    <context>               TYPE zcontext_orgunit_hier_line ,
    <alvtree_outtab_stack>  TYPE ty_s_alvtree_outtab_stack .

  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 .

  CALL FUNCTION 'RH_STRUC_GET'
    EXPORTING
      act_otype       = 'O'
      act_objid       = '00000001'
      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 '00000001' .
  CHECK lt_result_struc[] IS NOT INITIAL .


  LOOP AT lt_result_struc INTO ls_result_struc .

*   find org.unit name
    SELECT SINGLE orgtx
      INTO lv_orgtx
      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_orgtx IS NOT INITIAL .

*   add new worksheet
    APPEND INITIAL LINE TO gt_alvtree_outtab_stack ASSIGNING <alvtree_outtab_stack> .
    APPEND INITIAL LINE TO gt_context ASSIGNING <context> .

*   set org.unit name
    <context>-orgtx = lv_orgtx .
    <context>-objid = ls_result_struc-objid .

*   create tree
    PERFORM fill_context_create_tree
      CHANGING <alvtree_outtab_stack>-outtab[]
               <context>-alvtree .

    cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 0 ) .

*   add nodes to the tree
    PERFORM fill_context_add_nodes
      USING ls_result_struc-otype
            ls_result_struc-objid
            space
      CHANGING
            <context>-alvtree .

    cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 0 ) .

*   delete worksheet, if org.unit has no sub.units
    IF <alvtree_outtab_stack>-outtab[] IS INITIAL .
      lv_tabix = LINES( gt_alvtree_outtab_stack ) .
      DELETE gt_alvtree_outtab_stack INDEX lv_tabix .

      lv_tabix = LINES( gt_context ) .
      DELETE gt_context INDEX lv_tabix .
    ENDIF .

  ENDLOOP .

ENDFORM .                    "fill_context
*&---------------------------------------------------------------------*
*&      Form  fill_context_create_tree
*&---------------------------------------------------------------------*

FORM fill_context_create_tree
          CHANGING ct_alvtree_outtab  TYPE ty_t_alvtree_outtab
                   cr_alvtree         TYPE REF TO cl_hrpayna_gui_alv_tree .

  CREATE OBJECT cr_alvtree
    EXPORTING
      parent              = cl_gui_container=>default_screen
      node_selection_mode = cl_gui_column_tree=>node_sel_mode_single
    EXCEPTIONS
      OTHERS              = 7.
  CHECK sy-subrc EQ 0 .

*---->> fieldcatalog
  DATA:
    ls_fct            TYPE lvc_s_fcat ,
    lt_fct            TYPE lvc_t_fcat ,
    lr_salv_table     TYPE REF TO cl_salv_table ,
    lr_columns_table  TYPE REF TO cl_salv_columns_table ,
    lr_aggregations   TYPE REF TO cl_salv_aggregations .

  cl_salv_table=>factory(
    IMPORTING r_salv_table = lr_salv_table
    CHANGING  t_table      = ct_alvtree_outtab ) .

  lr_columns_table = lr_salv_table->get_columns( ) .

  lt_fct = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
              r_columns = lr_columns_table
              r_aggregations = lr_aggregations ) .

  ls_fct-outputlen = 15 .
  MODIFY lt_fct FROM ls_fct TRANSPORTING outputlen
   WHERE fieldname EQ 'OBJID'
      OR fieldname EQ 'LAND1' .

*---->> variant
  DATA ls_var      TYPE disvariant .
  ls_var-report = sy-repid .

*---->> initialization
  cr_alvtree->set_table_for_first_display(
    EXPORTING is_variant          = ls_var
    CHANGING  it_fieldcatalog     = lt_fct[]
              it_outtab           = ct_alvtree_outtab[] ) .

ENDFORM .                    "fill_context_create_tree
*&---------------------------------------------------------------------*
*&      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_hrpayna_gui_alv_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_alvtree_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_alvtree_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_alvtree_outtab-objid = ls_result_struc-objid .
    CALL FUNCTION 'RH_GET_ADDRESS'
      EXPORTING
        plvar   = gv_plvar
        otype   = 'O'
        objid   = ls_alvtree_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_alvtree_outtab .
    ENDIF .

*---->> add current node to the tree
    cr_alvtree->add_node(
          EXPORTING i_relat_node_key = pv_parent_nkey
                    i_relationship   = cl_gui_column_tree=>relat_last_child
                    i_node_text      = lv_ntext
                    is_outtab_line   = ls_alvtree_outtab
          IMPORTING e_new_node_key   = lv_nkey ) .

*---->> 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:


SAP ALV_TREE to Excel