<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic ALV Tree using ABAP Objects in Application Development and Automation Discussions</title>
    <link>https://community.sap.com/t5/application-development-and-automation-discussions/alv-tree-using-abap-objects/m-p/3203770#M763679</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Can anyone tell me how to Copy a node on an ALV Tree using context menu ?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 12 Dec 2007 09:42:14 GMT</pubDate>
    <dc:creator>Former Member</dc:creator>
    <dc:date>2007-12-12T09:42:14Z</dc:date>
    <item>
      <title>ALV Tree using ABAP Objects</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/alv-tree-using-abap-objects/m-p/3203770#M763679</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Can anyone tell me how to Copy a node on an ALV Tree using context menu ?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 12 Dec 2007 09:42:14 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/alv-tree-using-abap-objects/m-p/3203770#M763679</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2007-12-12T09:42:14Z</dc:date>
    </item>
    <item>
      <title>Re: ALV Tree using ABAP Objects</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/alv-tree-using-abap-objects/m-p/3203771#M763680</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Vidya,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Not sure but check the below link,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="http://www.sap-hefte.de/download/dateien/936/073_leseprobe.pdf" target="test_blank"&gt;http://www.sap-hefte.de/download/dateien/936/073_leseprobe.pdf&lt;/A&gt;.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;lt;b&amp;gt;Kindly reward points if you found the reply helpful.&amp;lt;b&amp;gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Cheers,&lt;/P&gt;&lt;P&gt;Chaitanya.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 13 Dec 2007 12:53:29 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/alv-tree-using-abap-objects/m-p/3203771#M763680</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2007-12-13T12:53:29Z</dc:date>
    </item>
    <item>
      <title>Re: ALV Tree using ABAP Objects</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/alv-tree-using-abap-objects/m-p/3203772#M763681</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Vidya,&lt;/P&gt;&lt;P&gt;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.&lt;/P&gt;&lt;P&gt;You can check out the report RSDEMO_DRAG_DROP_EDIT_TREE.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;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.&lt;/P&gt;&lt;P&gt;It seems difficult..I try to check it out.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 14 Dec 2007 16:49:40 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/alv-tree-using-abap-objects/m-p/3203772#M763681</guid>
      <dc:creator>former_member199581</dc:creator>
      <dc:date>2007-12-14T16:49:40Z</dc:date>
    </item>
    <item>
      <title>Re: ALV Tree using ABAP Objects</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/alv-tree-using-abap-objects/m-p/3203773#M763682</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Vidya&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The sample report &lt;STRONG&gt;ZUS_SDN_ALVTREE_CTXMENU&lt;/STRONG&gt; demonstrates how to copy nodes on an ALV tree.&lt;/P&gt;&lt;P&gt;Before showing the entire coding I would like to point out a few crucial parts of the coding:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;(1) Defintion of OUTTAB list&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;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.&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The OUTTAB list contains two additional fields holding the tree key (LVC_NKEY) and the node type.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;(2) The main logic of the report is implemented in event handler method handle_node_ctxmenu_sel.&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;...
      WHEN 'COPY_SUBTREE'.
        CALL METHOD go_alvtree-&amp;gt;get_subtree
          EXPORTING
            i_node_key       = node_key
          IMPORTING
            et_subtree_nodes = lt_subtree.

        CALL METHOD go_alvtree-&amp;gt;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.&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; Report  ZUS_SDN_ALVTREE_CTXMENU
*&amp;amp;
*&amp;amp; Based on: BCALV_TREE_03
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;
*&amp;amp;
*&amp;amp;---------------------------------------------------------------------*

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-&amp;gt;clear.
* The next line defines one line of the context menu.
    CALL METHOD menu-&amp;gt;add_function
      EXPORTING
        fcode = 'DEL_SUBTREE'
        text  = 'Delete Subtree'(901).        "Delete Subtree


    CALL METHOD menu-&amp;gt;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-&amp;gt;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-&amp;gt;frontend_update.
        ENDIF.

      WHEN 'COPY_SUBTREE'.
        CALL METHOD go_alvtree-&amp;gt;get_subtree
          EXPORTING
            i_node_key       = node_key
          IMPORTING
            et_subtree_nodes = lt_subtree.

        CALL METHOD go_alvtree-&amp;gt;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=&amp;gt;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-&amp;gt;link
    EXPORTING
      repid                       = gd_repid
      dynnr                       = '0100'
*      CONTAINER                   =
    EXCEPTIONS
      OTHERS                      = 4.
  IF sy-subrc &amp;lt;&amp;gt; 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 -&amp;gt; gd_okcode
**    PROCESS BEFORE OUTPUT.
**      MODULE STATUS_0100.
***
**    PROCESS AFTER INPUT.
**      MODULE USER_COMMAND_0100.



END-OF-SELECTION.

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Module  STATUS_0100  OUTPUT
*&amp;amp;---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'STATUS_0100'.
*  SET TITLEBAR 'xxx'.





ENDMODULE.                 " STATUS_0100  OUTPUT

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Module  USER_COMMAND_0100  INPUT
*&amp;amp;---------------------------------------------------------------------*
*       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-&amp;gt;update_calculations
*      EXPORTING
*        NO_FRONTEND_UPDATE =
        .


    WHEN OTHERS.
  ENDCASE.

  CLEAR: gd_okcode.

ENDMODULE.                 " USER_COMMAND_0100  INPUT



*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  INIT_CONTROLS
*&amp;amp;---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  --&amp;gt;  p1        text
*  &amp;lt;--  p2        text
*----------------------------------------------------------------------*
FORM init_controls .
  DATA:
    ls_hierarchy_header TYPE treev_hhdr.

* Create docking container
  CREATE OBJECT go_docking
    EXPORTING
      parent                      = cl_gui_container=&amp;gt;screen0
      ratio                       = 90
    EXCEPTIONS
      OTHERS                      = 6.
  IF sy-subrc &amp;lt;&amp;gt; 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-&amp;gt;set_extension
    EXPORTING
      extension  = 99999 " full-size screen
    EXCEPTIONS
      cntl_error = 1
      OTHERS     = 2.
  IF sy-subrc &amp;lt;&amp;gt; 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=&amp;gt;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 &amp;lt;&amp;gt; 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-&amp;gt;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



*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  INIT_TREE
*&amp;amp;---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  --&amp;gt;  p1        text
*  &amp;lt;--  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-&amp;gt;update_calculations.

* Send data to frontend.
  CALL METHOD go_alvtree-&amp;gt;frontend_update.

ENDFORM.                    " INIT_TREE


*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  build_hierarchy_header
*&amp;amp;---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      &amp;lt;--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
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  build_fieldcatalog
*&amp;amp;---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  --&amp;gt;  p1        text
*  &amp;lt;--  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 &amp;lt;&amp;gt; 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


*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  create_hierarchy
*&amp;amp;---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  --&amp;gt;  p1        text
*  &amp;lt;--  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-&amp;gt;add_node
    EXPORTING
      i_relat_node_key = ''
      i_relationship   = cl_gui_column_tree=&amp;gt;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
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  ADD_SALES_ORG
*&amp;amp;---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      --&amp;gt;P_LS_OUTTAB  text
*      --&amp;gt;P_LD_TOP_KEY  text
*      &amp;lt;--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-&amp;gt;add_node
    EXPORTING
      i_relat_node_key = ud_relat_key
      i_relationship   = cl_gui_column_tree=&amp;gt;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

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  add_DISTRIB_CHAN
*&amp;amp;---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      --&amp;gt;P_LS_OUTTAB  text
*      --&amp;gt;P_LD_VKORG_KEY  text
*      &amp;lt;--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-&amp;gt;add_node
    EXPORTING
      i_relat_node_key = ud_relat_key
      i_relationship   = cl_gui_column_tree=&amp;gt;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
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  add_division
*&amp;amp;---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      --&amp;gt;P_LS_OUTTAB  text
*      --&amp;gt;P_LD_VTWEG_KEY  text
*      &amp;lt;--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-&amp;gt;add_node
    EXPORTING
      i_relat_node_key = ud_relat_key
      i_relationship   = cl_gui_column_tree=&amp;gt;relat_last_child
      i_node_text      = ld_nodetext
      is_outtab_line   = ls_outtab
    IMPORTING
      e_new_node_key   = cd_node_key.

ENDFORM.                    " add_division

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  add_complete_line
*&amp;amp;---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      --&amp;gt;P_LS_OUTTAB  text
*      --&amp;gt;P_LD_SPART_KEY  text
*      &amp;lt;--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-&amp;gt;add_node
    EXPORTING
      i_relat_node_key = ud_relat_key
      i_relationship   = cl_gui_column_tree=&amp;gt;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
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  register_events
*&amp;amp;---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  --&amp;gt;  p1        text
*  &amp;lt;--  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=&amp;gt;eventid_expand_no_children
* (needed to load data to frontend when a user expands a node)
*    - cl_gui_column_tree=&amp;gt;eventid_header_context_men_req
* (needed for header context menu)
*    - cl_gui_column_tree=&amp;gt;eventid_header_click
* (allows selection of columns (only when item selection activated))
*   - cl_gui_column_tree=&amp;gt;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-&amp;gt;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=&amp;gt;eventid_node_context_menu_req.
  APPEND ls_event TO lt_events.

* register events on frontend
  CALL METHOD go_alvtree-&amp;gt;set_registered_events
    EXPORTING
      events                    = lt_events
    EXCEPTIONS
      cntl_error                = 1
      cntl_system_error         = 2
      illegal_event_combination = 3.
  IF sy-subrc &amp;lt;&amp;gt; 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=&amp;gt;handle_node_ctxmenu_req  FOR go_alvtree,
    lcl_eventhandler=&amp;gt;handle_node_ctxmenu_sel  FOR go_alvtree.
ENDFORM.                    " register_events
&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;  Uwe&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 16 Dec 2007 22:13:11 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/alv-tree-using-abap-objects/m-p/3203773#M763682</guid>
      <dc:creator>uwe_schieferstein</dc:creator>
      <dc:date>2007-12-16T22:13:11Z</dc:date>
    </item>
  </channel>
</rss>

