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

ALV Tree using ABAP Objects

Former Member
0 Likes
1,922

Can anyone tell me how to Copy a node on an ALV Tree using context menu ?

3 REPLIES 3
Read only

Former Member
0 Likes
940

Hi Vidya,

Not sure but check the below link,

http://www.sap-hefte.de/download/dateien/936/073_leseprobe.pdf.

<b>Kindly reward points if you found the reply helpful.<b>

Cheers,

Chaitanya.

Read only

former_member199581
Active Participant
0 Likes
940

Hi Vidya,

I cannot figure how and why you need to copy a node by a context menu...it's simpler using the drag and drop function.

You can check out the report RSDEMO_DRAG_DROP_EDIT_TREE.

However, I think you can try study a local "wrapper" class for drag and drop functions, triggered by the function on the context menu instead of a real drag and drop.

It seems difficult..I try to check it out.

Read only

uwe_schieferstein
Active Contributor
0 Likes
940

Hello Vidya

The sample report ZUS_SDN_ALVTREE_CTXMENU demonstrates how to copy nodes on an ALV tree.

Before showing the entire coding I would like to point out a few crucial parts of the coding:

(1) Defintion of OUTTAB list

TYPES: BEGIN OF ty_s_outtab.
INCLUDE  TYPE vbak.
TYPES: nkey     TYPE lvc_nkey.
TYPES: ntype    TYPE lvc_value.  " 'VKORG' / 'VTWEG' / 'SPART' / leaf
TYPES: END OF ty_s_outtab.
TYPES: ty_t_outtab    TYPE STANDARD TABLE OF ty_s_outtab
                      WITH DEFAULT KEY.

The OUTTAB list contains two additional fields holding the tree key (LVC_NKEY) and the node type.

(2) The main logic of the report is implemented in event handler method handle_node_ctxmenu_sel.

...
      WHEN 'COPY_SUBTREE'.
        CALL METHOD go_alvtree->get_subtree
          EXPORTING
            i_node_key       = node_key
          IMPORTING
            et_subtree_nodes = lt_subtree.

        CALL METHOD go_alvtree->get_parent
          EXPORTING
            i_node_key        = node_key
          IMPORTING
            e_parent_node_key = ld_parent_key.


        LOOP AT lt_subtree INTO ld_node_key.
          READ TABLE gt_outtab INTO ls_outtab
               WITH KEY nkey = ld_node_key.

          APPEND ls_outtab TO lt_outtab.
        ENDLOOP.

        READ TABLE lt_outtab INTO ls_outtab INDEX 1.
        ld_ntype = ls_outtab-ntype.
        DELETE lt_outtab WHERE ( vbeln IS INITIAL ).  " hierarchy nodes



        CASE ld_ntype.
          WHEN 'VKORG'.
            ld_top_key = ld_parent_key.

          WHEN 'VTWEG'.
            ld_vkorg_key = ld_parent_key.

          WHEN 'SPART'.
            ld_vtweg_key = ld_parent_key.

          WHEN 'LEAF'.
            ld_spart_key = ld_parent_key.
        ENDCASE.

"       Note: similar logic like in routine CREATE_HIERARCHY
        SORT lt_outtab BY vkorg vtweg spart kunnr audat.
        LOOP AT lt_outtab INTO ls_outtab.


*&---------------------------------------------------------------------*
*& Report  ZUS_SDN_ALVTREE_CTXMENU
*&
*& Based on: BCALV_TREE_03
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zus_sdn_alvtree_ctxmenu.


TYPES: BEGIN OF ty_s_outtab.
INCLUDE  TYPE vbak.
TYPES: nkey     TYPE lvc_nkey.
TYPES: ntype    TYPE lvc_value.  " 'VKORG' / 'VTWEG' / 'SPART' / leaf
TYPES: END OF ty_s_outtab.
TYPES: ty_t_outtab    TYPE STANDARD TABLE OF ty_s_outtab
                      WITH DEFAULT KEY.


DATA:
  gd_repid      TYPE syst-repid,
  gd_okcode     TYPE ui_func,
*
  go_docking    TYPE REF TO cl_gui_docking_container,
  go_alvtree    TYPE REF TO cl_gui_alv_tree.


DATA:
  gt_outtab     TYPE ty_t_outtab,  " Sales Document
  gt_fcat       TYPE lvc_t_fcat.



*---------------------------------------------------------------------*
*       CLASS lcl_eventhandler DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_eventhandler DEFINITION.

  PUBLIC SECTION.
* §2. Define an event handler method to build up a context menu
*     (postfix of event name: _CONTEXT_MENU_REQUEST).
* This event is fired each time the user klick with the right
* mouse button on a node.
    CLASS-METHODS:
      handle_node_ctxmenu_req
      FOR EVENT node_context_menu_request OF cl_gui_alv_tree
        IMPORTING
          node_key
          menu,

* §3. Define an event handler method to respond to a function code
*     triggered by your menu (postfix: _CONTEXT_MENU_SELECTED).
* This event is fired when the user selects an entry of the
* build up context menu.
      handle_node_ctxmenu_sel
      FOR EVENT node_context_menu_selected OF cl_gui_alv_tree
        IMPORTING
          node_key
          fcode
          sender.
* 'sender' is an implicit event parameter that is provided by
* ABAP Objects runtime system. It contains a reference to the
* object that fired the event. You may directly use it to
* call methods of this instance.

ENDCLASS.                    "lcl_eventhandler DEFINITION


*---------------------------------------------------------------------*
*       CLASS lcl_eventhandler IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_eventhandler IMPLEMENTATION.
* §4. Implement your event handler methods.

  METHOD handle_node_ctxmenu_req.
* Event parameter 'menu' holds a reference to the standard context
* menu of ALV Tree (functions 'Expand'/'Collapse' on nodes).
* You may either append your own functions (separated by a line)
* or clear the menu if you do not want to allow standard functions.

* In this case the standard menu is cleared.
    CALL METHOD menu->clear.
* The next line defines one line of the context menu.
    CALL METHOD menu->add_function
      EXPORTING
        fcode = 'DEL_SUBTREE'
        text  = 'Delete Subtree'(901).        "Delete Subtree


    CALL METHOD menu->add_function
      EXPORTING
        fcode = 'COPY_SUBTREE'
        text  = 'Copy Subtree'(902).        "Copy Subtree

  ENDMETHOD.                    "handle_node_ctxmenu_req

*--------------------------------------------
  METHOD handle_node_ctxmenu_sel.
* At this point of execution, the user selected a menu entry of the
* menu build up in event handler method handle_node_cm_req.
* Query your own function codes and react accordingly.
    DATA:
      l_rc TYPE c,
      ld_ntype      TYPE lvc_value,
      ld_parent_key TYPE lvc_nkey,
      ld_node_key   TYPE lvc_nkey,
      lt_subtree    TYPE lvc_t_nkey,
      ls_outtab     TYPE ty_s_outtab,
      ls_last       TYPE ty_s_outtab,
      lt_outtab     TYPE ty_t_outtab.

    DATA:
      ld_vkorg_key   TYPE lvc_nkey,
      ld_vtweg_key   TYPE lvc_nkey,
      ld_spart_key   TYPE lvc_nkey,
      ld_last_key    TYPE lvc_nkey,
      ld_top_key     TYPE lvc_nkey.


    CASE fcode.
      WHEN 'DEL_SUBTREE'.
        CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
             EXPORTING
                  textline1      = 'Do you really want to delete'(902)
                textline2      = 'this node and all its subnodes?'(903)
                  titel          = 'Confirmation'(904)
                  cancel_display = ' '
             IMPORTING
                  answer         = l_rc.
        IF l_rc EQ 'J'.
          CALL METHOD sender->delete_subtree
            EXPORTING
              i_node_key = node_key.
* Do not forget to refresh the display when you change the contents
* of your list.
          CALL METHOD sender->frontend_update.
        ENDIF.

      WHEN 'COPY_SUBTREE'.
        CALL METHOD go_alvtree->get_subtree
          EXPORTING
            i_node_key       = node_key
          IMPORTING
            et_subtree_nodes = lt_subtree.

        CALL METHOD go_alvtree->get_parent
          EXPORTING
            i_node_key        = node_key
          IMPORTING
            e_parent_node_key = ld_parent_key.


        LOOP AT lt_subtree INTO ld_node_key.
          READ TABLE gt_outtab INTO ls_outtab
               WITH KEY nkey = ld_node_key.

          APPEND ls_outtab TO lt_outtab.
        ENDLOOP.

        READ TABLE lt_outtab INTO ls_outtab INDEX 1.
        ld_ntype = ls_outtab-ntype.
        DELETE lt_outtab WHERE ( vbeln IS INITIAL ).  " hierarchy nodes



        CASE ld_ntype.
          WHEN 'VKORG'.
            ld_top_key = ld_parent_key.

          WHEN 'VTWEG'.
            ld_vkorg_key = ld_parent_key.

          WHEN 'SPART'.
            ld_vtweg_key = ld_parent_key.

          WHEN 'LEAF'.
            ld_spart_key = ld_parent_key.
        ENDCASE.

        SORT lt_outtab BY vkorg vtweg spart kunnr audat.
        LOOP AT lt_outtab INTO ls_outtab.

          IF ( ld_ntype = 'VKORG' ).
            "   new sales organisation
            IF ( ls_outtab-vkorg = ls_last-vkorg ).
            ELSE.
              PERFORM add_sales_org
                                USING
                                   ls_outtab
                                   ld_top_key
                             CHANGING
                                   ld_vkorg_key.

              ls_outtab-nkey   = ld_vkorg_key.
              ls_outtab-ntype = 'VKORG'.
              DESCRIBE TABLE gt_outtab.  " fill sy-tfill
              MODIFY gt_outtab FROM ls_outtab INDEX syst-tfill
                TRANSPORTING nkey ntype.
            ENDIF.

          ENDIF.


          IF ( ld_ntype = 'VKORG'  OR
               ld_ntype = 'VTWEG' ).
            "   new distribution channel
            IF ( ls_outtab-vkorg = ls_last-vkorg  AND
                 ls_outtab-vtweg = ls_last-vtweg ).
            ELSE.
              PERFORM add_distrib_chan
                                USING
                                   ls_outtab
                                   ld_vkorg_key
                             CHANGING
                                   ld_vtweg_key.

              ls_outtab-nkey = ld_vtweg_key.
              ls_outtab-ntype = 'VTWEG'.
              DESCRIBE TABLE gt_outtab.  " fill sy-tfill
              MODIFY gt_outtab FROM ls_outtab INDEX syst-tfill
                TRANSPORTING nkey ntype.
            ENDIF.

          ENDIF.


          IF ( ld_ntype = 'VKORG'  OR
               ld_ntype = 'VTWEG'  OR
               ld_ntype = 'SPART' ).
            "   new channel
            IF ( ls_outtab-vkorg = ls_last-vkorg  AND
                 ls_outtab-vtweg = ls_last-vtweg  AND
                 ls_outtab-spart = ls_last-spart ).
            ELSE.
              PERFORM add_division
                                USING
                                   ls_outtab
                                   ld_vtweg_key
                             CHANGING
                                   ld_spart_key.

              ls_outtab-nkey = ld_spart_key.
              ls_outtab-ntype = 'SPART'.
              DESCRIBE TABLE gt_outtab.  " fill sy-tfill
              MODIFY gt_outtab FROM ls_outtab INDEX syst-tfill
                TRANSPORTING nkey ntype.
            ENDIF.

          ENDIF.


* Leaf:
          PERFORM add_complete_line
                            USING
                               ls_outtab
                               ld_spart_key
                         CHANGING
                               ld_last_key.

          ls_outtab-nkey = ld_last_key.
          ls_outtab-ntype = 'LEAF'.
          DESCRIBE TABLE gt_outtab.  " fill sy-tfill
          MODIFY gt_outtab FROM ls_outtab INDEX syst-tfill
              TRANSPORTING nkey ntype.

          ls_last = ls_outtab.
        ENDLOOP.

        CALL METHOD cl_gui_cfw=>set_new_ok_code
          EXPORTING
            new_code = 'REFRESH_TREE'
*          IMPORTING
*            RC       =
            .

    ENDCASE.
  ENDMETHOD.                    "handle_node_ctxmenu_sel
ENDCLASS.                    "lcl_eventhandler IMPLEMENTATION


START-OF-SELECTION.


  PERFORM init_controls.


* Link the docking container to the target dynpro
  gd_repid = syst-repid.
  CALL METHOD go_docking->link
    EXPORTING
      repid                       = gd_repid
      dynnr                       = '0100'
*      CONTAINER                   =
    EXCEPTIONS
      OTHERS                      = 4.
  IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  CALL SCREEN '0100'.
* NOTE: no screen elements, ok_code -> gd_okcode
**    PROCESS BEFORE OUTPUT.
**      MODULE STATUS_0100.
***
**    PROCESS AFTER INPUT.
**      MODULE USER_COMMAND_0100.



END-OF-SELECTION.

*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'STATUS_0100'.
*  SET TITLEBAR 'xxx'.





ENDMODULE.                 " STATUS_0100  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

  TRANSLATE gd_okcode TO UPPER CASE.  " facilitate manual entries

  CASE gd_okcode.
    WHEN 'BACK' OR
         'EXIT'  OR
         'CANC'.
      SET SCREEN 0. LEAVE SCREEN.


  when 'REFRESH_TREE'.
    CALL METHOD go_alvtree->update_calculations
*      EXPORTING
*        NO_FRONTEND_UPDATE =
        .


    WHEN OTHERS.
  ENDCASE.

  CLEAR: gd_okcode.

ENDMODULE.                 " USER_COMMAND_0100  INPUT



*&---------------------------------------------------------------------*
*&      Form  INIT_CONTROLS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM init_controls .
  DATA:
    ls_hierarchy_header TYPE treev_hhdr.

* Create docking container
  CREATE OBJECT go_docking
    EXPORTING
      parent                      = cl_gui_container=>screen0
      ratio                       = 90
    EXCEPTIONS
      OTHERS                      = 6.
  IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  CALL METHOD go_docking->set_extension
    EXPORTING
      extension  = 99999 " full-size screen
    EXCEPTIONS
      cntl_error = 1
      OTHERS     = 2.
  IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


* create tree control
  CREATE OBJECT go_alvtree
    EXPORTING
        parent              = go_docking
        node_selection_mode = cl_gui_column_tree=>node_sel_mode_single
        item_selection      = ' '
        no_html_header      = 'X'
        no_toolbar          = ''
    EXCEPTIONS
        cntl_error                   = 1
        cntl_system_error            = 2
        create_error                 = 3
        lifetime_error               = 4
        illegal_node_selection_mode  = 5
        failed                       = 6
        illegal_column_name          = 7.
  IF sy-subrc <> 0.
    MESSAGE x208(00) WITH 'ERROR'.                          "#EC NOTEXT
  ENDIF.


  PERFORM build_hierarchy_header CHANGING ls_hierarchy_header.

* Hide columns and sum up values initially using the fieldcatalog
  PERFORM build_fieldcatalog.


* IMPORTANT: Table 'gt_sflight' must be empty. Do not change this table
* (even after this method call). You can change data of your table
* by calling methods of CL_GUI_ALV_TREE.
* Furthermore, the output table 'gt_outtab' must be global and can
* only be used for one ALV Tree Control.
  CALL METHOD go_alvtree->set_table_for_first_display
    EXPORTING
      is_hierarchy_header = ls_hierarchy_header
    CHANGING
      it_fieldcatalog     = gt_fcat
      it_outtab           = gt_outtab. "table must be empty !



  PERFORM init_tree.

ENDFORM.                    " INIT_CONTROLS



*&---------------------------------------------------------------------*
*&      Form  INIT_TREE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM init_tree .

  PERFORM create_hierarchy.

  PERFORM register_events.
* Update calculations which were initially defined by field DO_SUM
* of the fieldcatalog. (see build_fieldcatalog).
  CALL METHOD go_alvtree->update_calculations.

* Send data to frontend.
  CALL METHOD go_alvtree->frontend_update.

ENDFORM.                    " INIT_TREE


*&---------------------------------------------------------------------*
*&      Form  build_hierarchy_header
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_LS_HIERARCHY_HEADER  text
*----------------------------------------------------------------------*
FORM build_hierarchy_header
     CHANGING
           cs_hierarchy_header TYPE treev_hhdr.

  cs_hierarchy_header-heading =
        'SalesOrg/DistChannel/Division'(300).
  cs_hierarchy_header-tooltip = 'Customer: Master Sales Data'(400).
  cs_hierarchy_header-width = 45.
  cs_hierarchy_header-width_pix = ''.

ENDFORM.                    " build_hierarchy_header
*&---------------------------------------------------------------------*
*&      Form  build_fieldcatalog
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM build_fieldcatalog .
* define local data
  DATA:
    ls_fcat    TYPE lvc_s_fcat.

  REFRESH: gt_fcat.

  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
*     I_BUFFER_ACTIVE              =
     i_structure_name             = 'VBAK'
*     I_CLIENT_NEVER_DISPLAY       = 'X'
*     I_BYPASSING_BUFFER           =
*     I_INTERNAL_TABNAME           =
    CHANGING
      ct_fieldcat                  = gt_fcat
    EXCEPTIONS
      inconsistent_interface       = 1
      program_error                = 2
      OTHERS                       = 3.
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  LOOP AT gt_fcat INTO ls_fcat.

    CASE ls_fcat-fieldname.
      WHEN 'VBELN'  OR
           'AUDAT'  OR
           'AUART'  OR
           'WAERK'  OR
           'VKORG'  OR
           'VTWEG'  OR
           'SPART'  OR
           'BSTNK'  OR
           'KUNNR'.

      WHEN 'NETWR'.
        ls_fcat-do_sum = 'X'.
        ls_fcat-h_ftype = 'SUM'.  " or: 'MAX' / 'AVG'

      WHEN OTHERS.
        ls_fcat-tech = 'X'.
    ENDCASE.

    MODIFY gt_fcat FROM ls_fcat INDEX syst-tabix.
  ENDLOOP.

ENDFORM.                    " build_fieldcatalog


*&---------------------------------------------------------------------*
*&      Form  create_hierarchy
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM create_hierarchy .
* define local data
  DATA:
    ls_outtab    TYPE ty_s_outtab,
    ls_last      TYPE ty_s_outtab,
    lt_outtab    TYPE ty_t_outtab.

  DATA:
    ld_vkorg_key   TYPE lvc_nkey,
    ld_vtweg_key   TYPE lvc_nkey,
    ld_spart_key   TYPE lvc_nkey,
    ld_last_key    TYPE lvc_nkey,
    ld_top_key     TYPE lvc_nkey.


  " Select data
  SELECT * FROM  vbak INTO CORRESPONDING FIELDS OF TABLE lt_outtab
    UP TO 1550 ROWS.

  " sort table according to conceived hierarchy
  SORT lt_outtab BY vkorg vtweg spart kunnr audat.

* Define one top node. In this way it is possible to calculate
* values for the whole hierarchy.
  CALL METHOD go_alvtree->add_node
    EXPORTING
      i_relat_node_key = ''
      i_relationship   = cl_gui_column_tree=>relat_last_child
      i_node_text      = 'Sales Documents'
    IMPORTING
      e_new_node_key   = ld_top_key.

  CLEAR: ls_outtab.
  ls_outtab-nkey  = ld_top_key.
  ls_outtab-ntype = 'ROOT'.
  MODIFY gt_outtab FROM ls_outtab INDEX 1
        TRANSPORTING nkey ntype.


  LOOP AT lt_outtab INTO ls_outtab.

    "   new sales organisation
    IF ( ls_outtab-vkorg = ls_last-vkorg ).
    ELSE.
      PERFORM add_sales_org
                        USING
                           ls_outtab
                           ld_top_key
                     CHANGING
                           ld_vkorg_key.

      ls_outtab-nkey   = ld_vkorg_key.
      ls_outtab-ntype = 'VKORG'.
      DESCRIBE TABLE gt_outtab.  " fill sy-tfill
      MODIFY gt_outtab FROM ls_outtab INDEX syst-tfill
        TRANSPORTING nkey ntype.
    ENDIF.



    "   new distribution channel
    IF ( ls_outtab-vkorg = ls_last-vkorg  AND
         ls_outtab-vtweg = ls_last-vtweg ).
    ELSE.
      PERFORM add_distrib_chan
                        USING
                           ls_outtab
                           ld_vkorg_key
                     CHANGING
                           ld_vtweg_key.

      ls_outtab-nkey = ld_vtweg_key.
      ls_outtab-ntype = 'VTWEG'.
      DESCRIBE TABLE gt_outtab.  " fill sy-tfill
      MODIFY gt_outtab FROM ls_outtab INDEX syst-tfill
        TRANSPORTING nkey ntype.
    ENDIF.


    "   new channel
    IF ( ls_outtab-vkorg = ls_last-vkorg  AND
         ls_outtab-vtweg = ls_last-vtweg  AND
         ls_outtab-spart = ls_last-spart ).
    ELSE.
      PERFORM add_division
                        USING
                           ls_outtab
                           ld_vtweg_key
                     CHANGING
                           ld_spart_key.

      ls_outtab-nkey = ld_spart_key.
      ls_outtab-ntype = 'SPART'.
      DESCRIBE TABLE gt_outtab.  " fill sy-tfill
      MODIFY gt_outtab FROM ls_outtab INDEX syst-tfill
        TRANSPORTING nkey ntype.
    ENDIF.


* Leaf:
    PERFORM add_complete_line
                      USING
                         ls_outtab
                         ld_spart_key
                   CHANGING
                         ld_last_key.

    ls_outtab-nkey = ld_last_key.
    ls_outtab-ntype = 'LEAF'.
    DESCRIBE TABLE gt_outtab.  " fill sy-tfill
    MODIFY gt_outtab FROM ls_outtab INDEX syst-tfill
        TRANSPORTING nkey ntype.

    ls_last = ls_outtab.
  ENDLOOP.

ENDFORM.                    " create_hierarchy
*&---------------------------------------------------------------------*
*&      Form  ADD_SALES_ORG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LS_OUTTAB  text
*      -->P_LD_TOP_KEY  text
*      <--P_LD_VKORG_KEY  text
*----------------------------------------------------------------------*
FORM add_sales_org
               USING
                  value(us_outtab)     TYPE ty_s_outtab
                  value(ud_relat_key)  TYPE lvc_nkey
            CHANGING
                  cd_node_key          TYPE lvc_nkey.
* define local data
  DATA:
   ld_nodetext    TYPE lvc_value,
   ls_outtab      TYPE ty_s_outtab.


  ld_nodetext = us_outtab-vkorg.

  " add node
  CALL METHOD go_alvtree->add_node
    EXPORTING
      i_relat_node_key = ud_relat_key
      i_relationship   = cl_gui_column_tree=>relat_last_child
      i_node_text      = ld_nodetext
      is_outtab_line   = ls_outtab
    IMPORTING
      e_new_node_key   = cd_node_key.

ENDFORM.                    " ADD_SALES_ORG

*&---------------------------------------------------------------------*
*&      Form  add_DISTRIB_CHAN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LS_OUTTAB  text
*      -->P_LD_VKORG_KEY  text
*      <--P_LD_VTWEG_KEY  text
*----------------------------------------------------------------------*
FORM add_distrib_chan
               USING
                  value(us_outtab)     TYPE ty_s_outtab
                  value(ud_relat_key)  TYPE lvc_nkey
            CHANGING
                  cd_node_key          TYPE lvc_nkey.
* define local data
  DATA:
   ld_nodetext    TYPE lvc_value,
   ls_outtab      TYPE ty_s_outtab.


  ld_nodetext = us_outtab-vtweg.

  " add node
  CALL METHOD go_alvtree->add_node
    EXPORTING
      i_relat_node_key = ud_relat_key
      i_relationship   = cl_gui_column_tree=>relat_last_child
      i_node_text      = ld_nodetext
      is_outtab_line   = ls_outtab
    IMPORTING
      e_new_node_key   = cd_node_key.

ENDFORM.                    " add_DISTRIB_CHAN
*&---------------------------------------------------------------------*
*&      Form  add_division
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LS_OUTTAB  text
*      -->P_LD_VTWEG_KEY  text
*      <--P_LD_SPART_KEY  text
*----------------------------------------------------------------------*
FORM add_division
               USING
                  value(us_outtab)     TYPE ty_s_outtab
                  value(ud_relat_key)  TYPE lvc_nkey
            CHANGING
                  cd_node_key          TYPE lvc_nkey.
* define local data
  DATA:
   ld_nodetext    TYPE lvc_value,
   ls_outtab      TYPE ty_s_outtab.


  ld_nodetext = us_outtab-spart.

  " add node
  CALL METHOD go_alvtree->add_node
    EXPORTING
      i_relat_node_key = ud_relat_key
      i_relationship   = cl_gui_column_tree=>relat_last_child
      i_node_text      = ld_nodetext
      is_outtab_line   = ls_outtab
    IMPORTING
      e_new_node_key   = cd_node_key.

ENDFORM.                    " add_division

*&---------------------------------------------------------------------*
*&      Form  add_complete_line
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LS_OUTTAB  text
*      -->P_LD_SPART_KEY  text
*      <--P_LD_LAST_KEY  text
*----------------------------------------------------------------------*
FORM add_complete_line
               USING
                  value(us_outtab)     TYPE ty_s_outtab
                  value(ud_relat_key)  TYPE lvc_nkey
            CHANGING
                  cd_node_key          TYPE lvc_nkey.
* define local data
  DATA:
   ld_nodetext    TYPE lvc_value,
   ls_outtab      TYPE ty_s_outtab.


  WRITE us_outtab-kunnr TO ld_nodetext+0  NO-ZERO.
  WRITE us_outtab-audat TO ld_nodetext+20 DD/MM/YYYY.
  CONDENSE ld_nodetext.


  " add node
  CALL METHOD go_alvtree->add_node
    EXPORTING
      i_relat_node_key = ud_relat_key
      i_relationship   = cl_gui_column_tree=>relat_last_child
      i_node_text      = ld_nodetext
      is_outtab_line   = us_outtab    " !!!
    IMPORTING
      e_new_node_key   = cd_node_key.

ENDFORM.                    " add_complete_line
*&---------------------------------------------------------------------*
*&      Form  register_events
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM register_events .
  DATA:
    lt_events TYPE cntl_simple_events,
    ls_event TYPE cntl_simple_event.

*................................................................
* The following four tree events registers ALV Tree in the constructor
* method itself.
*    - cl_gui_column_tree=>eventid_expand_no_children
* (needed to load data to frontend when a user expands a node)
*    - cl_gui_column_tree=>eventid_header_context_men_req
* (needed for header context menu)
*    - cl_gui_column_tree=>eventid_header_click
* (allows selection of columns (only when item selection activated))
*   - cl_gui_column_tree=>eventid_item_keypress
* (needed for F1-Help (only when item selection activated))
*
* Nevertheless you have to provide their IDs again if you register
* additional events with SET_REGISTERED_EVENTS (see below).
* To do so, call first method  GET_REGISTERED_EVENTS (this way,
* all already registered events remain registered, even your own):
  CALL METHOD go_alvtree->get_registered_events
    IMPORTING
      events = lt_events.

* (If you do not these events will be deregistered!!!).
* You do not have to register events of the toolbar again.
*....................................................................
* Register additional events for your own purposes:
* §5. Register first context menu event on frontend (with postfix
*     (_REQUEST). The second is registered automatically.
  ls_event-eventid = cl_gui_column_tree=>eventid_node_context_menu_req.
  APPEND ls_event TO lt_events.

* register events on frontend
  CALL METHOD go_alvtree->set_registered_events
    EXPORTING
      events                    = lt_events
    EXCEPTIONS
      cntl_error                = 1
      cntl_system_error         = 2
      illegal_event_combination = 3.
  IF sy-subrc <> 0.
    MESSAGE x208(00) WITH 'ERROR'.                          "#EC NOTEXT
  ENDIF.
*--------------------
* §6. Register both context menu events on backend (ABAP Objects
*    event handling).
  SET HANDLER:
    lcl_eventhandler=>handle_node_ctxmenu_req  FOR go_alvtree,
    lcl_eventhandler=>handle_node_ctxmenu_sel  FOR go_alvtree.
ENDFORM.                    " register_events

Regards,

Uwe