TRANSLATION:
Create an ALV TREE. Easy to use and has a function as close to an ALV GRID (Buttons Sort, Filter, Graphics, etc, etc) and also use its properties with only an 'X', then follow the steps.

PARTE 2 - PART 2

Vamos a la segunda parte...
Creamos otra clase. Este lo llamé: ZCL_ALV_TREE_MAINP. (En pocas palabras la clase "padre").


*********************************************************************************************
TRANSLATION:
Go to the second part ...

Create another class. This one called: ZCL_ALV_TREE_MAINP. (In short the class "father").

*********************************************************************************************

Luego ingresamos a Impl y copiamos esto:

****************************************************************************************
TRANSLATION:
Then we enter Impl and copy this:
****************************************************************************************

*"* local class implementation for public class
*"* use this source file for the implementation part of
*"* local helper classes
* Defino una clase local para los eventos del toolbar

CLASS lcl_toolbar_event_receiver DEFINITION.

  PUBLIC SECTION.
    METHODS: on_function_selected
              FOR EVENT function_selected OF cl_gui_toolbar
              IMPORTING fcode.

ENDCLASS.                    "lcl_toolbar_event_receiver DEFINITION

*---------------------------------------------------------------------*

* Implemento una clase local para los eventos del toolbar

CLASS lcl_toolbar_event_receiver IMPLEMENTATION.

  METHOD on_function_selected.
    DATA: flag_s TYPE c.

    CASE fcode.

      WHEN '&CRR'.
        flag_s = '1'.
        CALL METHOD zcl_alv_tree_mainp=>close_nodes_tree.

        CALL METHOD zcl_alv_tree_mainp=>pagination
          EXPORTING
            flag_s = flag_s.

        CALL METHOD zcl_alv_tree_mainp=>button_activated
          EXPORTING
            p_button = '&CRR'.

      WHEN '&CRL'.
        flag_s = '2'.
        CALL METHOD zcl_alv_tree_mainp=>close_nodes_tree.

        CALL METHOD zcl_alv_tree_mainp=>pagination
          EXPORTING
            flag_s = flag_s.

        CALL METHOD zcl_alv_tree_mainp=>button_activated
          EXPORTING
            p_button = '&CRL'.

      WHEN '&CTL'.
        flag_s = '3'.
        CALL METHOD zcl_alv_tree_mainp=>close_nodes_tree.

        CALL METHOD zcl_alv_tree_mainp=>pagination
          EXPORTING
            flag_s = flag_s.

        CALL METHOD zcl_alv_tree_mainp=>button_activated
          EXPORTING
            p_button = '&CTL'.

      WHEN '&CTR'.
        flag_s = '4'.
        CALL METHOD zcl_alv_tree_mainp=>close_nodes_tree.

        CALL METHOD zcl_alv_tree_mainp=>pagination
          EXPORTING
            flag_s = flag_s.

        CALL METHOD zcl_alv_tree_mainp=>button_activated
          EXPORTING
            p_button = '&CTR'.

      WHEN '&SEL'.

        CALL METHOD zcl_alv_tree_mainp=>open_nodes_tree.

        CALL METHOD zcl_alv_tree_mainp=>button_activated
          EXPORTING
            p_button = '&SEL'.

      WHEN '&DES'.

        CALL METHOD zcl_alv_tree_mainp=>close_nodes_tree.

        CALL METHOD zcl_alv_tree_mainp=>button_activated
          EXPORTING
            p_button = '&DES'.

      WHEN '&GR1'.
        CALL METHOD zcl_alv_tree_mainp=>display_graphic
          EXPORTING
            p_num_button = '01'.

        CALL METHOD zcl_alv_tree_mainp=>button_activated
          EXPORTING
            p_button = '&GR1'.

      WHEN '&GR2'.
        CALL METHOD zcl_alv_tree_mainp=>display_graphic
          EXPORTING
            p_num_button = '02'.

        CALL METHOD zcl_alv_tree_mainp=>button_activated
          EXPORTING
            p_button = '&GR2'.

      WHEN '&XXL'.
        CALL METHOD zcl_alv_tree_mainp=>export_to_excel.

        CALL METHOD zcl_alv_tree_mainp=>button_activated
          EXPORTING
            p_button = '&XXL'.

      WHEN '&ISU'.
        CALL METHOD zcl_alv_tree_mainp=>sort_column
          EXPORTING
            p_ucomm = fcode.

        CALL METHOD zcl_alv_tree_mainp=>button_activated
          EXPORTING
            p_button = '&ISU'.

      WHEN '&ISD'.
        CALL METHOD zcl_alv_tree_mainp=>sort_column
          EXPORTING
            p_ucomm = fcode.

        CALL METHOD zcl_alv_tree_mainp=>button_activated
          EXPORTING
            p_button = '&ISD'.

      WHEN '&FIL'.
        CALL METHOD zcl_alv_tree_mainp=>filter
          EXPORTING
            p_ucomm = fcode.

        CALL METHOD zcl_alv_tree_mainp=>button_activated
          EXPORTING
            p_button = '&FIL'.

      WHEN '&UND'.
        CALL METHOD zcl_alv_tree_mainp=>undo_filter
          EXPORTING
            p_ucomm = fcode.

        CALL METHOD zcl_alv_tree_mainp=>button_activated
          EXPORTING
            p_button = '&UND'.

      WHEN '&ADL'.
        CALL METHOD zcl_alv_tree_mainp=>add_level
          EXPORTING
            p_ucomm = fcode.

        CALL METHOD zcl_alv_tree_mainp=>button_activated
          EXPORTING
            p_button = '&ADL'.

      WHEN '&SUL'.
        CALL METHOD zcl_alv_tree_mainp=>subtract_level
          EXPORTING
            p_ucomm = fcode.

        CALL METHOD zcl_alv_tree_mainp=>button_activated
          EXPORTING
            p_button = '&SUL'.

      WHEN '&SCH'.

        CALL METHOD zcl_alv_tree_mainp=>select_all.
        CALL METHOD zcl_alv_tree_mainp=>button_activated
          EXPORTING
            p_button = '&SEL'.

      WHEN '&DCH'.

        CALL METHOD zcl_alv_tree_mainp=>unselect_all.
        CALL METHOD zcl_alv_tree_mainp=>button_activated
          EXPORTING
            p_button = '&DES'.

    ENDCASE.

  ENDMETHOD.                    "on_function_selected

ENDCLASS.                    "lcl_toolbar_event_receiver IMPLEMENTATION

"nota : si deseas crear mas botones desde el programa
" CALL METHOD ao_tree->ao_tree->get_toolbar_object
*    IMPORTING
*      er_toolbar = ao_toolbar.
*
*  CHECK NOT ao_toolbar IS INITIAL.
*
*  CALL METHOD ao_toolbar->add_button
*    EXPORTING
*      fcode            = '&XXX'
*      icon             = 'dd'
*      butn_type        = cntb_btype_button
*      text             = ''
*      quickinfo        = ''
*    EXCEPTIONS
*      cntl_error       = 1
*      cntb_btype_error = 2
*      cntb_error_fcode = 3
*      OTHERS           = 4.

* Creas tu propia clase local para los eventos de aquellos botones

"nota : si deseo manipular datos desde el programa lo puedo hacer de la sgte. manera

*  ASSIGN ao_tree->at_nodetab->* TO <ta>.
*  LOOP AT <ta> INTO <wa>.
*    CLEAR at_nodetab2.
*    MOVE-CORRESPONDING <wa> TO at_nodetab2.  " a cualq tabla del programa
*    APPEND at_nodetab2.
*  ENDLOOP.
-----------------------------------------------------------
Para los mensajes se creo la clase ZHRMSG
Estos son los contenidos:

*********TRANSLATION*********************
 For messages ZHRMSG class was created
These are the contents:
 ************************************************
074    Error en el contenedor del alv tree.
081    Error en los eventos del alv tree.
131    El directorio no existe o no es soportado por gui.
499    Nodo relativo no encontrado
503    Nodo no encontrado
504    Error en el gui_download 
517    Posiciones Ordenadas : &
531    Registros filtrados : &
534    Nombre del archivo asignado exitosamente
684    Nivel: &
718    Nivel no existe ó es mayor a &
959    El nivel del árbol actualmente es : & 
---------------------------------------------------------------
Ahora ingresamos a la pestaña Métodos - En Tipos Locales copiamos esto:

*****************TRANSLATION**********************
Now we enter the tab Methods - Types, Local copy this:
*********************************************************
*"* use this source file for any type declarations (class
*"* definitions, interfaces or data types) you need for method
*"* implementation or private method's signature

INCLUDE <icon>.

CLASS cl_gui_cfw DEFINITION LOAD.
CLASS cl_gui_column_tree DEFINITION LOAD.
-----------------------------------------------------------------------------------------------------------------------------
Ahora copiamos en Sección Pública, esto:


**************TRANSLATION***********************
Now copy in Public Section, this:
*******************************************************
class ZCL_ALV_TREE_MAINP definition
  public
  final
  create public .

*"* public components of class ZCL_ALV_TREE_MAINP
*"* do not include other source files here!!!
public section.

  class-data AO_CONTAINER type ref to CL_GUI_CUSTOM_CONTAINER .
  class-data AO_CONTAINER1 type ref to CL_GUI_CUSTOM_CONTAINER .
  class-data AO_GRAPHIC type ref to CL_ALV_GRAPHICS .
  class-data AO_NODETAB type ref to DATA .
  class-data AO_NODETAB3 type ref to DATA .
  class-data AO_NODETAB5 type ref to DATA .
  class-data AO_NODETAB_GRAPH01 type ref to DATA .
  class-data AO_NODETAB_GRAPH02 type ref to DATA .
  class-data AO_NODETAB_NIVEL type ref to DATA .
  class-data AO_NODETAB_SORT type ref to DATA .
  class-data AO_TOOLBAR type ref to CL_GUI_TOOLBAR .
  class-data AO_TOOLBAR1 type ref to CL_GUI_TOOLBAR .
  class-data AO_TREE type ref to ZCL_ALV_TREE_INFO .
  class-data AO_TREE1 type ref to ZCL_ALV_TREE_INFO .
  class-data AO_TREE_B type ref to CL_ALV_TREE_BASE .
  class-data AP_BUTTON_ACTIVATED type STRING .
  constants AP_BUTTON_ADL type UI_FUNC value '&ADL'. "#EC NOTEXT
  constants AP_BUTTON_CRL type UI_FUNC value '&CRL'. "#EC NOTEXT
  constants AP_BUTTON_CRR type UI_FUNC value '&CRR'. "#EC NOTEXT
  constants AP_BUTTON_CTL type UI_FUNC value '&CTL'. "#EC NOTEXT
  constants AP_BUTTON_CTR type UI_FUNC value '&CTR'. "#EC NOTEXT
  constants AP_BUTTON_DCH type UI_FUNC value '&DCH'. "#EC NOTEXT
  constants AP_BUTTON_DES type UI_FUNC value '&DES'. "#EC NOTEXT
  constants AP_BUTTON_FIL type UI_FUNC value '&FIL'. "#EC NOTEXT
  constants AP_BUTTON_GR1 type UI_FUNC value '&GR1'. "#EC NOTEXT
  constants AP_BUTTON_GR2 type UI_FUNC value '&GR2'. "#EC NOTEXT
  constants AP_BUTTON_ISD type UI_FUNC value '&ISD'. "#EC NOTEXT
  constants AP_BUTTON_ISU type UI_FUNC value '&ISU'. "#EC NOTEXT
  constants AP_BUTTON_SCH type UI_FUNC value '&SCH'. "#EC NOTEXT
  constants AP_BUTTON_SEL type UI_FUNC value '&SEL'. "#EC NOTEXT
  constants AP_BUTTON_SEP type UI_FUNC value ' '. "#EC NOTEXT
  constants AP_BUTTON_SUL type UI_FUNC value '&SUL'. "#EC NOTEXT
  constants AP_BUTTON_UND type UI_FUNC value '&UND'. "#EC NOTEXT
  constants AP_BUTTON_XXL type UI_FUNC value '&XXL'. "#EC NOTEXT
  class-data AP_COLLECT_GRAPHICS type XFELD .
  class-data AP_NIVEL_EXCEL type SEU_TYPE .
  constants AP_FIELD_COL type DYNFNAM value 'AT_COLUMNS'. "#EC NOTEXT
  constants AP_FIELD_CONTAINER type DYNFNAM value 'CCONTAINER1'. "#EC NOTEXT
  constants AP_FIELD_FCG type DYNFNAM value 'AT_FIELDCATALOG_GRAPHIC'. "#EC NOTEXT
  constants AP_FIELD_FIELDGROUP type DYNFNAM value '<FS_FIELD_GROUP'. "#EC NOTEXT
  class-data AP_FIELD_GRAPHICS type STRING .
  constants AP_FIELD_GROUP type DYNFNAM value 'AW_GROUP-CONTAIN'. "#EC NOTEXT
  class-data AP_FIELD_GROUP01 type DYNFNAM .
  class-data AP_FIELD_GROUP02 type DYNFNAM .
  class-data AP_FIELD_GROUP03 type DYNFNAM .
  class-data AP_FIELD_GROUP04 type DYNFNAM .
  class-data AP_FIELD_GROUP05 type DYNFNAM .
  class-data AP_FIELD_GROUP06 type DYNFNAM .
  class-data AP_FIELD_GROUP07 type DYNFNAM .
  class-data AP_FIELD_GROUP08 type DYNFNAM .
  class-data AP_FIELD_GROUP09 type DYNFNAM .
  constants AP_FIELD_KEY type DYNFNAM value '<WI>-TKEY'. "#EC NOTEXT
  class-data AP_FIELD_KEY00 type LVC_NKEY .
  class-data AP_FIELD_KEY01 type LVC_NKEY .
  class-data AP_FIELD_KEY02 type LVC_NKEY .
  class-data AP_FIELD_KEY03 type LVC_NKEY .
  class-data AP_FIELD_KEY04 type LVC_NKEY .
  class-data AP_FIELD_KEY05 type LVC_NKEY .
  class-data AP_FIELD_KEY06 type LVC_NKEY .
  class-data AP_FIELD_KEY07 type LVC_NKEY .
  class-data AP_FIELD_KEY08 type LVC_NKEY .
  class-data AP_FIELD_KEY09 type LVC_NKEY .
  constants AP_FIELD_KEY2 type DYNFNAM value '<WI2>-TKEY'. "#EC NOTEXT
  constants AP_FIELD_KEY5 type DYNFNAM value '<WI5>-TKEY'. "#EC NOTEXT
  constants AP_FIELD_NG type DYNFNAM value 'AO_NODETAB_GRAPH'. "#EC NOTEXT
  class-data AP_FIELD_OUT_EXCEL type CHAR255 .
  constants AP_FIELD_PAGE type DYNFNAM value '<WI>-TPAGE'. "#EC NOTEXT
  constants AP_FIELD_RUN_NIVEL type DYNFNAM value 'RUN_NIVEL'. "#EC NOTEXT
  class-data AP_FIELD_SORT01 type DYNFNAM .
  class-data AP_FIELD_SORT02 type DYNFNAM .
  class-data AP_FIELD_SORT03 type DYNFNAM .
  class-data AP_FIELD_SORT04 type DYNFNAM .
  class-data AP_FIELD_SORT05 type DYNFNAM .
  class-data AP_FIELD_SORT06 type DYNFNAM .
  class-data AP_FIELD_SORT07 type DYNFNAM .
  class-data AP_FIELD_SORT08 type DYNFNAM .
  class-data AP_FIELD_SORT09 type DYNFNAM .
  class-data AP_FIELD_SORT_TKEY type DYNFNAM value 'TKEY'. "#EC NOTEXT .
  class-data AP_FIELD_SORT_TYPE type DYNFNAM value 'TYPE'. "#EC NOTEXT .
  constants AP_FIELD_TSCREEN type DYNFNAM value '<WI>-TSCREEN'. "#EC NOTEXT
  constants AP_FIELD_TSCREEN2 type DYNFNAM value '<WI2>-TSCREEN'. "#EC NOTEXT
  constants AP_FIELD_TYPE type DYNFNAM value '<WI>-TYPE'. "#EC NOTEXT
  constants AP_FIELD_TYPE2 type DYNFNAM value '<WI2>-TYPE'. "#EC NOTEXT
  constants AP_FIELD_TYPE5 type DYNFNAM value '<WI5>-TYPE'. "#EC NOTEXT
  constants AP_FIELD_WECHECK type DYNFNAM value '<WE>-CHECKBOX'. "#EC NOTEXT
  constants AP_FIELD_WETKEY type DYNFNAM value '<WE>-TKEY'. "#EC NOTEXT
  constants AP_FIELD_WETYPE type DYNFNAM value '<WE>-TYPE'. "#EC NOTEXT
  constants AP_FIELD_ZSAVE type DYNFNAM value '<WI>-TSAVE'. "#EC NOTEXT
  class-data AP_GROUP type C .
  class-data AP_GROUP_FIELD01 type DYNFNAM .
  class-data AP_GROUP_FIELD02 type DYNFNAM .
  class-data AP_GROUP_FIELD03 type DYNFNAM .
  class-data AP_GROUP_FIELD04 type DYNFNAM .
  class-data AP_GROUP_FIELD05 type DYNFNAM .
  class-data AP_GROUP_FIELD06 type DYNFNAM .
  class-data AP_GROUP_FIELD07 type DYNFNAM .
  class-data AP_GROUP_FIELD08 type DYNFNAM .
  class-data AP_GROUP_FIELD09 type DYNFNAM .
  class-data AP_GROUP_FIELD10 type DYNFNAM .
  class-data AP_ITEMS_X_PAGE type I .
  type-pools SDYDO .
  class-data AP_I_BACKGROUND_ID type SDYDO_KEY .
  class-data AP_I_DEFAULT type CHAR01 .
  class-data AP_I_LOGO type SDYDO_VALUE .
  class-data AP_I_SAVE type CHAR01 .
  class-data AP_I_STRUCT_NAME type DD02L-TABNAME .
  class-data AP_I_STRUCT_NAME_GRAPHIC type DD02L-TABNAME .
  class-data AP_LABEL_AGROUP_FIELD type DYNFNAM value 'AP_GROUP_FIELD'. "#EC NOTEXT .
  constants AP_LABEL_COM type DYNFNAM value 'TCOM'. "#EC NOTEXT
  class-data AP_LABEL_CONTAIN type DYNFNAM value 'CONTAIN'. "#EC NOTEXT .
  class-data AP_LABEL_FIELD_GROUP type DYNFNAM value 'AP_FIELD_GROUP'. "#EC NOTEXT .
  class-data AP_LABEL_FIELD_KEY type DYNFNAM value 'AP_FIELD_KEY'. "#EC NOTEXT .
  class-data AP_LABEL_FIELD_SORT type DYNFNAM value 'AP_FIELD_SORT'. "#EC NOTEXT .
  class-data AP_LABEL_GROUP type DYNFNAM value 'AP_LABEL_GROUP'. "#EC NOTEXT .
  class-data AP_LABEL_GROUP01 type DYNFNAM value 'TCOM'. "#EC NOTEXT .
  class-data AP_LABEL_GROUP02 type DYNFNAM value 'TCOM'. "#EC NOTEXT .
  class-data AP_LABEL_GROUP03 type DYNFNAM value 'TCOM'. "#EC NOTEXT .
  class-data AP_LABEL_GROUP04 type DYNFNAM value 'TCOM'. "#EC NOTEXT .
  class-data AP_LABEL_GROUP05 type DYNFNAM value 'TCOM'. "#EC NOTEXT .
  class-data AP_LABEL_GROUP06 type DYNFNAM value 'TCOM'. "#EC NOTEXT .
  class-data AP_LABEL_GROUP07 type DYNFNAM value 'TCOM'. "#EC NOTEXT .
  class-data AP_LABEL_GROUP08 type DYNFNAM value 'TCOM'. "#EC NOTEXT .
  class-data AP_LABEL_GROUP09 type DYNFNAM value 'TCOM'. "#EC NOTEXT .
  constants AP_LABEL_KEY type DYNFNAM value 'TKEY'. "#EC NOTEXT
  class-data AP_LABEL_LAST_FIELD type DYNFNAM .
  class-data AP_LABEL_NIVEL_FIELD type DYNFNAM value 'AP_NIVEL_FIELD'. "#EC NOTEXT .
  class-data AP_LABEL_NODE type DYNFNAM value 'NODE'. "#EC NOTEXT .
  constants AP_LABEL_PAGE type DYNFNAM value 'TPAGE'. "#EC NOTEXT
  class-data AP_LABEL_SCREEN type DYNFNAM value 'AP_LABEL_SCREEN'. "#EC NOTEXT .
  class-data AP_LABEL_SCREEN01 type DYNFNAM value 'TCOM'. "#EC NOTEXT .
  class-data AP_LABEL_SCREEN02 type DYNFNAM value 'TCOM'. "#EC NOTEXT .
  class-data AP_LABEL_SCREEN03 type DYNFNAM value 'TCOM'. "#EC NOTEXT .
  class-data AP_LABEL_SCREEN04 type DYNFNAM value 'TCOM'. "#EC NOTEXT .
  class-data AP_LABEL_SCREEN05 type DYNFNAM value 'TCOM'. "#EC NOTEXT .
  class-data AP_LABEL_SCREEN06 type DYNFNAM value 'TCOM'. "#EC NOTEXT .
  class-data AP_LABEL_SCREEN07 type DYNFNAM value 'TCOM'. "#EC NOTEXT .
  class-data AP_LABEL_SCREEN08 type DYNFNAM value 'TCOM'. "#EC NOTEXT .
  class-data AP_LABEL_SCREEN09 type DYNFNAM value 'TCOM'. "#EC NOTEXT .
  class-data AP_LABEL_SCREEN_FIELD type DYNFNAM value 'AP_SCREEN_FIELD'. "#EC NOTEXT .
  class-data AP_LABEL_SCREEN_PAGE_B type DYNFNAM .
  class-data AP_LABEL_SCREEN_PAGE_E type DYNFNAM .
  constants AP_LABEL_TSCREEN type DYNFNAM value 'TSCREEN'. "#EC NOTEXT
  constants AP_LABEL_TYPE type DYNFNAM value 'TYPE'. "#EC NOTEXT
  constants AP_LABEL_ZSAVE type DYNFNAM value 'TSAVE'. "#EC NOTEXT
  class-data AP_LAST_FIELD type DYNFNAM .
  class-data AP_LAST_FIELD_CONT type DYNFNAM .
  class-data AP_NAME_FILE_EXCEL type CHAR255 .
  class-data AP_NIVEL_FIELD01 type DYNFNAM .
  class-data AP_NIVEL_FIELD02 type DYNFNAM .
  class-data AP_NIVEL_FIELD03 type DYNFNAM .
  class-data AP_NIVEL_FIELD04 type DYNFNAM .
  class-data AP_NIVEL_FIELD05 type DYNFNAM .
  class-data AP_NIVEL_FIELD06 type DYNFNAM .
  class-data AP_NIVEL_FIELD07 type DYNFNAM .
  class-data AP_NIVEL_FIELD08 type DYNFNAM .
  class-data AP_NIVEL_FIELD09 type DYNFNAM .
  class-data AP_NIVEL_GRAPHICS type SEU_TYPE .
  class-data AP_NODEHEADER type TV_NODEKEY .
  class-data AP_NODES_MARKED01 type LVC_NKEY .
  class-data AP_NODE_ID_KEY type LVC_NKEY .
  class-data AP_NODE_TEXT type LVC_VALUE .
  class-data AP_PAGE_END type I .
  class-data AP_PAGE_MAX type CHAR4 .
  class-data AP_PAGE_MIN type CHAR4 .
  class-data AP_PAGE_PRESENT type I .
  class-data AP_PROGRAM type PROGNAME .
  class-data AP_PULSAC_OPEN type NUM .
  class-data AP_SCREEN_FIELD01 type DYNFNAM .
  class-data AP_SCREEN_FIELD02 type DYNFNAM .
  class-data AP_SCREEN_FIELD03 type DYNFNAM .
  class-data AP_SCREEN_FIELD04 type DYNFNAM .
  class-data AP_SCREEN_FIELD05 type DYNFNAM .
  class-data AP_SCREEN_FIELD06 type DYNFNAM .
  class-data AP_SCREEN_FIELD07 type DYNFNAM .
  class-data AP_SCREEN_FIELD08 type DYNFNAM .
  class-data AP_SCREEN_FIELD09 type DYNFNAM .
  class-data AP_SCREEN_FIELD10 type DYNFNAM .
  constants AP_STRUCTURE type DYNFNAM value '<WI>-'. "#EC NOTEXT
  constants AP_TFIELD_ROW type DYNFNAM value 'AT_ROWS'. "#EC NOTEXT
  constants AP_WFIELD_ROW type DYNFNAM value 'AW_ROWS'. "#EC NOTEXT
  class-data AT_ALL_LAYOUT type ZTITEM_LAYOUT .
  class-data AT_CHECKED type LVC_T_CHIT .
  class-data AT_COLUMNS01 type LVC_T_FNAM .
  class-data AT_COLUMNS02 type LVC_T_FNAM .
  class-data AT_FIELDCATALOG type LVC_T_FCAT .
  class-data AT_FIELDCATALOG_GRAPHIC01 type LVC_T_FCAT .
  class-data AT_FIELDCATALOG_GRAPHIC02 type LVC_T_FCAT .
  class-data AT_GROUP type ZTDATATREE .
  class-data AT_ITEM_LAYOUT type LVC_T_LAYI .
  class-data AT_IT_EXCEPT_QINFO type LVC_T_QINF .
  class-data AT_IT_FILTER type LVC_T_FILT .
  class-data AT_IT_FILTER_NIVEL type LVC_T_FILT .
  type-pools SLIS .
  class-data AT_IT_LIST_COMMENTARY type SLIS_T_LISTHEADER .
  class-data AT_IT_SPECIAL_GROUPS type LVC_T_SGRP .
  class-data AT_MARKED type LVC_T_NKEY .
  class-data AT_MIN_NIVEL type ZTASSIGN .
  class-data AT_NODES_MARKED01 type LVC_T_NKEY .
  class-data AT_NODES_MARKED02 type LVC_T_NKEY .
  class-data AT_NODES_MARKED03 type LVC_T_NKEY .
  class-data AT_NODES_MARKED_HEADER type LVC_T_NKEY .
  class-data AT_NODES_SORTED type ZTSORT .
  class-data AT_NODES_SORTED2 type ZTSORT .
  class-data AT_NODES_SORTED3 type ZTSORT .
  class-data AT_NODES_SORTED4 type ZTSORT .
  class-data AT_ROWS01 type LVC_T_ROID .
  class-data AT_ROWS02 type LVC_T_ROID .
  class-data AT_SELECTED type LVC_T_NKEY .
  class-data AT_TOOLBAR_EXCL type UI_FUNCTIONS .
  class-data AW_ALL_LAYOUT type ZWITEM_LAYOUT .
  class-data AW_CHECKED type LVC_S_CHIT .
  class-data AW_COLUMNS01 type LVC_FNAME .
  class-data AW_COLUMNS02 type LVC_FNAME .
  class-data AW_GROUP type ZWDATATREE .
  class-data AW_IS_EXCEPTION_FIELD type LVC_S_L004 .
  class-data AW_IS_HIERARCHY_HEADER type TREEV_HHDR .
  class-data AW_IS_VARIANT type DISVARIANT .
  class-data AW_ITEM_LAYOUT type LVC_S_LAYI .
  class-data AW_LAYOUT_NODE type LVC_S_LAYN .
  class-data AW_MIN_NIVEL type ZWASSIGN .
  class-data AW_NODES_SORTED type ZWSORT .
  class-data AW_NODES_SORTED2 type ZWSORT .
  class-data AW_NODE_LAYOUT type LVC_S_LACN .
  class-data AW_ROWS01 type LVC_S_ROID .
  class-data AW_ROWS02 type LVC_S_ROID .
  class-data AW_SELECTED type LVC_S_NKEY .
  constants LIM_NIVEL type I value 9. "#EC NOTEXT
  class-data MT_GROUPLEVELS type LVC_T_GRPL .
  class-data MT_SORT type LVC_T_SORT .

  class-methods INIT_TREE
    importing
      value(P_PROGRAM) type PROGNAME
      value(P_STRUCTURE) type DD02L-TABNAME
      value(P_HEADER) type TREEV_HHDR
      !P_ALV_IS_VARIANT type DISVARIANT optional
      !P_ALV_I_SAVE type CHAR01 optional
      !P_ALV_I_DEFAULT type CHAR01 default 'X'
      !P_ALV_IS_EXCEPTION_FIELD type LVC_S_L004 optional
      !P_ALV_IT_SPECIAL_GROUPS type LVC_T_SGRP optional
      !P_ALV_IT_LIST_COMMENTARY type SLIS_T_LISTHEADER optional
      !P_ALV_I_LOGO type SDYDO_VALUE optional
      !P_ALV_I_BACKGROUND_ID type SDYDO_KEY optional
      !P_ALV_IT_EXCEPT_QINFO type LVC_T_QINF optional
      !P_ALV_IT_FILTER type LVC_T_FILT optional
      !P_HIDE_MC_FC_F4 type XFELD optional
      !P_HIDE_MC_FC_CALCULATE type XFELD optional
      !P_HIDE_MC_FC_CALCULATE_AVG type XFELD optional
      !P_HIDE_MC_FC_CALCULATE_MAX type XFELD optional
      !P_HIDE_MC_FC_CALCULATE_MIN type XFELD optional
      !P_HIDE_MC_FC_CALCULATE_SUM type XFELD optional
      !P_HIDE_MC_FC_COLLAPSE type XFELD optional
      !P_HIDE_MC_FC_COL_INVISIBLE type XFELD optional
      !P_HIDE_MC_FC_COL_OPTIMIZE type XFELD optional
      !P_HIDE_MC_FC_CURRENT_VARIANT type XFELD optional
      !P_HIDE_MC_FC_DETAIL type XFELD optional
      !P_HIDE_MC_FC_EXPAND type XFELD optional
      !P_HIDE_MC_FC_FIND type XFELD optional
      !P_HIDE_MC_FC_GRAPHICS type XFELD optional
      !P_HIDE_MC_FC_HELP type XFELD optional
      !P_HIDE_MC_FC_LOAD_VARIANT type XFELD optional
      !P_HIDE_MC_FC_MAINTAIN_VARIANT type XFELD optional
      !P_HIDE_MC_FC_PRINT_BACK type XFELD optional
      !P_HIDE_MC_FC_PRINT_BACK_ALL type XFELD optional
      !P_HIDE_MC_FC_PRINT_PREV type XFELD optional
      !P_HIDE_MC_FC_PRINT_PREV_ALL type XFELD optional
      !P_HIDE_MC_FC_SAVE_VARIANT type XFELD optional
      !P_HIDE_MC_FC_SETTOP type XFELD optional
      !P_HIDE_MC_FC_FIND_MORE type XFELD optional
      !P_HIDE_AP_BUTTON_CRR type XFELD optional
      !P_HIDE_AP_BUTTON_CRL type XFELD optional
      !P_HIDE_AP_BUTTON_CTL type XFELD optional
      !P_HIDE_AP_BUTTON_CTR type XFELD optional
      !P_HIDE_AP_BUTTON_SEL type XFELD optional
      !P_HIDE_AP_BUTTON_DES type XFELD optional
      !P_HIDE_AP_BUTTON_GR1 type XFELD optional
      !P_HIDE_AP_BUTTON_GR2 type XFELD optional
      !P_HIDE_AP_BUTTON_XXL type XFELD optional
      !P_HIDE_AP_BUTTON_ISU type XFELD optional
      !P_HIDE_AP_BUTTON_ISD type XFELD optional
      !P_HIDE_AP_BUTTON_FIL type XFELD optional
      !P_HIDE_AP_BUTTON_UND type XFELD optional
      !P_HIDE_AP_BUTTON_ADL type XFELD optional
      !P_HIDE_AP_BUTTON_SUL type XFELD optional
      !P_HIDE_AP_BUTTON_SEP type XFELD optional
      !P_HIDE_AP_BUTTON_SCH type XFELD optional
      !P_HIDE_AP_BUTTON_DCH type XFELD optional .
  class-methods BUILD_HIERARCHY_HEADER
    importing
      !P_STRUCT_HEADER type TREEV_HHDR
      !P_PROGR type PROGNAME .
  class-methods BUILD_FIELDCATALOG
    importing
      !P_STRUCTURE_NAME type DD02L-TABNAME
    exporting
      !P_FIELDCAT type LVC_T_FCAT .
  class-methods HIDE_FUNCTIONS
    importing
      !P_MC_FC_F4 type XFELD optional
      !P_MC_FC_CALCULATE type XFELD optional
      !P_MC_FC_CALCULATE_AVG type XFELD optional
      !P_MC_FC_CALCULATE_MAX type XFELD optional
      !P_MC_FC_CALCULATE_MIN type XFELD optional
      !P_MC_FC_CALCULATE_SUM type XFELD optional
      !P_MC_FC_COLLAPSE type XFELD optional
      !P_MC_FC_COL_INVISIBLE type XFELD optional
      !P_MC_FC_COL_OPTIMIZE type XFELD optional
      !P_MC_FC_CURRENT_VARIANT type XFELD optional
      !P_MC_FC_DETAIL type XFELD optional
      !P_MC_FC_EXPAND type XFELD optional
      !P_MC_FC_FIND type XFELD optional
      !P_MC_FC_GRAPHICS type XFELD optional
      !P_MC_FC_HELP type XFELD optional
      !P_MC_FC_LOAD_VARIANT type XFELD optional
      !P_MC_FC_MAINTAIN_VARIANT type XFELD optional
      !P_MC_FC_PRINT_BACK type XFELD optional
      !P_MC_FC_PRINT_BACK_ALL type XFELD optional
      !P_MC_FC_PRINT_PREV type XFELD optional
      !P_MC_FC_PRINT_PREV_ALL type XFELD optional
      !P_MC_FC_SAVE_VARIANT type XFELD optional
      !P_MC_FC_SETTOP type XFELD optional
      !P_MC_FC_FIND_MORE type XFELD optional .
  class-methods HIDE_FUNCTIONS_CLASS
    importing
      !P_AP_BUTTON_CRR type XFELD optional
      !P_AP_BUTTON_CRL type XFELD optional
      !P_AP_BUTTON_CTL type XFELD optional
      !P_AP_BUTTON_CTR type XFELD optional
      !P_AP_BUTTON_SEL type XFELD optional
      !P_AP_BUTTON_DES type XFELD optional
      !P_AP_BUTTON_GR1 type XFELD optional
      !P_AP_BUTTON_GR2 type XFELD optional
      !P_AP_BUTTON_XXL type XFELD optional
      !P_AP_BUTTON_ISU type XFELD optional
      !P_AP_BUTTON_ISD type XFELD optional
      !P_AP_BUTTON_FIL type XFELD optional
      !P_AP_BUTTON_UND type XFELD optional
      !P_AP_BUTTON_ADL type XFELD optional
      !P_AP_BUTTON_SUL type XFELD optional
      !P_AP_BUTTON_SEP type XFELD optional
      !P_AP_BUTTON_SCH type XFELD optional
      !P_AP_BUTTON_DCH type XFELD optional .
  class-methods DISPLAY_ALV .
  class-methods SEND_DATA
    importing
      value(P_NODETAB) type DATA
      value(P_UPDATE_CALCULATIONS) type XFELD
      !P_NODETAB_GRAPH type DATA optional
      !P_FIELD_GRAPHICS type STRING optional
      !P_NIVEL_GRAPHICS type SEU_TYPE optional
      !P_COLLECT_GRAPHICS type XFELD optional
      !P_NODETAB_GRAPH2 type DATA optional
      !P_FIELD_GRAPHICS2 type STRING optional
      !P_NIVEL_GRAPHICS2 type SEU_TYPE optional
      !P_COLLECT_GRAPHICS2 type XFELD optional
      !P_NODETAB_EXCEL type DATA optional
      !P_NIVEL_EXCEL type SEU_TYPE optional
      !P_FIELD_OUT_EXCEL type STRING optional
      !P_NAME_FILE_EXCEL type DYNFNAM optional
      !P_AGROUP_FIELD type STRING optional
      !P_SCREEN_FIELD type STRING optional
      !P_SCREEN_PAGE_BEGIN type DYNFNAM optional
      !P_SCREEN_PAGE_END type DYNFNAM optional
      !P_SORT type DATA optional
      !P_EV_RIGHT_CLICK type XFELD optional
      !P_EV_LEFT_CLICK_DESIGN type XFELD optional
      !P_EV_MOVE_CONTROL type XFELD optional
      !P_EV_SIZE_CONTROL type XFELD optional
      !P_EV_LEFT_CLICK_RUN type XFELD optional
      !P_EV_DEF_CONTEXT_MENU_REQUEST type XFELD optional
      !P_EV_HEA_CONTEXT_MENU_REQUEST type XFELD optional
      !P_EV_HEA_CONTEXT_MENU_SELECT type XFELD optional
      !P_EV_BEFORE_USER_COMMAND type XFELD optional
      !P_EV_AFTER_USER_COMMAND type XFELD optional
      !P_EV_TOP_OF_PAGE type XFELD optional
      !P_EV_DEF_CONTEXT_MENU_SELECT type XFELD optional
      !P_EV_TOP_OF_LIST type XFELD optional
      !P_EV_BUTTON_CLICK type XFELD optional
      !P_EV_CHECKBOX_CHANGE type XFELD optional
      !P_EV_EXPAND_NC type XFELD optional
      !P_EV_HEADER_CLICK type XFELD optional
      !P_EV_HEADER_CONTEXT_MENU type XFELD optional
      !P_EV_ITEM_CONT_MENU_REQUEST type XFELD optional
      !P_EV_ITEM_CONT_MENU_SELECTED type XFELD optional
      !P_EV_ITEM_DOUBLE_CLICK type XFELD optional
      !P_EV_ITEM_KEYPRESS type XFELD optional
      !P_EV_LINK_CLICK type XFELD optional
      !P_EV_NODE_CONT_MENU_REQUEST type XFELD optional
      !P_EV_NODE_CONT_MENU_SELECTED type XFELD optional
      !P_EV_NODE_DOUBLE_CLICK type XFELD optional
      !P_EV_ON_DRAG type XFELD optional
      !P_EV_ON_DRAG_MULTIPLE type XFELD optional
      !P_EV_ON_DROP type XFELD optional
      !P_EV_ON_DROP_COMPLETE type XFELD optional
      !P_EV_ON_DROP_COMPLETE_MULTIPLE type XFELD optional
      !P_EV_ON_DROP_GET_FLAVOR type XFELD optional
      !P_EV_SELECTION_CHANGED type XFELD optional
      !P_EV_NODE_KEYPRESS type XFELD optional .
  class-methods ADD_NODE_TREE
    importing
      !P_NODE_RESULT type ANY optional
      !P_RELAT_KEY type LVC_NKEY
      !P_IDX type SYTABIX
    changing
      !P_NEW_KEY type LVC_NKEY .
  class-methods PAGINATION
    importing
      !FLAG_S type C .
  class-methods CHANGE_TOOLBAR .
  class-methods DEFINE_EVENTS
    importing
      !P_RIGHT_CLICK type XFELD optional
      !P_LEFT_CLICK_DESIGN type XFELD optional
      !P_MOVE_CONTROL type XFELD optional
      !P_SIZE_CONTROL type XFELD optional
      !P_LEFT_CLICK_RUN type XFELD optional
      !P_DEFAULT_CONTEXT_MENU_REQUEST type XFELD optional
      !P_HEADER_CONTEXT_MENU_REQUEST type XFELD optional
      !P_HEADER_CONTEXT_MENU_SELECT type XFELD optional
      !P_BEFORE_USER_COMMAND type XFELD optional
      !P_AFTER_USER_COMMAND type XFELD optional
      !P_TOP_OF_PAGE type XFELD optional
      !P_DEFAULT_CONTEXT_MENU_SELECT type XFELD optional
      !P_TOP_OF_LIST type XFELD optional
      !P_BUTTON_CLICK type XFELD optional
      !P_CHECKBOX_CHANGE type XFELD optional
      !P_EXPAND_NC type XFELD optional
      !P_HEADER_CLICK type XFELD optional
      !P_HEADER_CONTEXT_MENU type XFELD optional
      !P_ITEM_CONTEXT_MENU_REQUEST type XFELD optional
      !P_ITEM_CONTEXT_MENU_SELECTED type XFELD optional
      !P_ITEM_DOUBLE_CLICK type XFELD optional
      !P_ITEM_KEYPRESS type XFELD optional
      !P_LINK_CLICK type XFELD optional
      !P_NODE_CONTEXT_MENU_REQUEST type XFELD optional
      !P_NODE_CONTEXT_MENU_SELECTED type XFELD optional
      !P_NODE_DOUBLE_CLICK type XFELD optional
      !P_ON_DRAG type XFELD optional
      !P_ON_DRAG_MULTIPLE type XFELD optional
      !P_ON_DROP type XFELD optional
      !P_ON_DROP_COMPLETE type XFELD optional
      !P_ON_DROP_COMPLETE_MULTIPLE type XFELD optional
      !P_ON_DROP_GET_FLAVOR type XFELD optional
      !P_SELECTION_CHANGED type XFELD optional
      !P_NODE_KEYPRESS type XFELD optional .
  class-methods ASSIGN_ALV
    importing
      !P_ALV_IS_VARIANT type DISVARIANT
      !P_ALV_I_SAVE type CHAR01
      !P_ALV_I_DEFAULT type CHAR01
      !P_ALV_IS_EXCEPTION_FIELD type LVC_S_L004
      !P_ALV_IT_SPECIAL_GROUPS type LVC_T_SGRP
      !P_ALV_IT_LIST_COMMENTARY type SLIS_T_LISTHEADER
      !P_ALV_I_LOGO type SDYDO_VALUE
      !P_ALV_I_BACKGROUND_ID type SDYDO_KEY
      !P_ALV_IT_EXCEPT_QINFO type LVC_T_QINF
      !P_ALV_IT_FILTER type LVC_T_FILT .
  class-methods RUN_NIVEL .
  class-methods GROUPBY .
  class-methods OPEN_NODES_TREE .
  class-methods CLOSE_NODES_TREE .
  class-methods FREE_PROGRAM .
  class-methods CHANGE_ICON
    importing
      !P_TEXT type STRING optional
    changing
      !P_ITEM_IMAGE type TV_IMAGE optional .
  class-methods PRINT_NORMAL_TO_BOLD
    importing
      !P_NIVEL type SEU_TYPE .
  class-methods PRINT_BOLD_TO_NORMAL
    importing
      !P_NIVEL type SEU_TYPE .
  class-methods SAVE_NODE_CHECKED
    importing
      !FLAG_G type C .
  class-methods SAVE_NODE_SELECT
    importing
      !FLAG_G type C .
  class-methods LAYOUT_NIVEL_TEXT
    importing
      value(P_KEY) type ZWITEM_LAYOUT-KEY_NODE
      !P_NODE_TEXT type ZWITEM_LAYOUT-NODE_TEXT optional .
  class-methods LAYOUT_NIVEL_NODE
    importing
      value(P_KEY) type ZWITEM_LAYOUT-KEY_NODE
      !P_HIDDEN type AS4FLAG optional
      !P_DISABLED type AS4FLAG optional
      !P_ISFOLDER type AS4FLAG optional
      !P_N_IMAGE type TV_IMAGE optional
      !P_EXP_IMAGE type TV_IMAGE optional
      !P_STYLE type INT4 optional
      !P_LAST_HITEM type TV_ITMNAME optional
      !P_NO_BRANCH type AS4FLAG optional
      !P_EXPANDER type AS4FLAG optional
      !P_DRAGDROPID type INT2 optional .
  class-methods LAYOUT_NIVEL_ITEM
    importing
      value(P_KEY) type ZWITEM_LAYOUT-KEY_NODE
      !P_FIELDNAME type LVC_FNAME optional
      !P_CLASS type INT4 optional
      !P_FONT type INT4 optional
      !P_DISABLED type AS4FLAG optional
      !P_EDITABLE type AS4FLAG optional
      !P_HIDDEN type AS4FLAG optional
      !P_ALIGNMENT type INT4 optional
      !P_T_IMAGE type TV_IMAGE optional
      !P_CHOSEN type AS4FLAG optional
      !P_TOGG_RIGHT type AS4FLAG optional
      !P_STYLE type INT4 optional .
  class-methods DISPLAY_GRAPHIC
    importing
      !P_NUM_BUTTON type CHAR2 .
  class-methods EXPORT_TO_EXCEL .
  class-methods BUILD_GRAPHICS
    importing
      !P_FIELD_GRAPH type STRING
      !P_NODETAB2 type DATA
      !P_NIVEL type SEU_TYPE
      !P_NUM_BUTTON type NUM
      !P_COLLECT type XFELD .
  class-methods BUILD_EXCEL
    importing
      !P_NODETAB3 type DATA
      !P_NIVEL type SEU_TYPE optional .
  class-methods ASSIGN_BY_GROUP
    importing
      !P_AGROUP_FIELD type STRING .
  class-methods ASSIGN_BY_SCREEN
    importing
      !P_SCREEN_FIELD type STRING .
  class-methods DELETE_NIVEL
    importing
      !P_NIVEL type STRING
      !P_NODETAB type DATA
      !P_STRUCTURE type DD02L-TABNAME
      !P_CONTA type LVC_NKEY .
  class-methods ASSIGN_BY_NIVEL
    importing
      !P_NIVEL type STRING .
  class-methods SORT_COLUMN
    importing
      !P_UCOMM type SYUCOMM .
  class-methods ASSIGN_SORT .
  class-methods FILTER
    importing
      !P_UCOMM type SYUCOMM .
  class-methods UNDO_FILTER
    importing
      !P_UCOMM type SYUCOMM optional .
  class-methods ADD_LEVEL
    importing
      !P_UCOMM type SYUCOMM .
  class-methods SUBTRACT_LEVEL
    importing
      !P_UCOMM type SYUCOMM .
  class-methods CHANGE_GRAPHIC .
  class-methods BUTTON_ACTIVATED
    importing
      !P_BUTTON type CHAR30 .
  class-methods SELECT_ALL .
  class-methods UNSELECT_ALL .
  class-methods MARK_FATHER
    importing
      !P_KEY type LVC_NKEY .
  class-methods UNMARK_FATHER
    importing
      !P_KEY type LVC_NKEY .
  class-methods IS_HIDDEN
    importing
      !P_KEY type LVC_NKEY
    exporting
      !P_ANSWER type C .
  class-methods UPDATE_FIELD_DYNPRO
    importing
      !P_NOMBRE_PROGRAMA type D020S-PROG
      !P_NOMBRE_DYNPRO type D020S-DNUM
      !P_NOMBRE_CAMPO type DYNFNAM
      !P_LINEA type SYSTEPL optional
      !P_VALOR type ANY .
  class-methods FRAG_PATTERN
    importing
      !PS_SEPARADOR type C optional
      !PS_NOMBRE_ESTRUCTURA type TABNAME
      !PT_TABLA_I type ZTYDATAFILE
    exporting
      !LT_TRAMA_O type ZTYDATAFILE
      !PT_TABLA_O type ref to DATA .
  class-methods DEFINE_MASK
    importing
      !P_TABLA_I type ZTYDATAFILE
    exporting
      !P_MASCARA type CHAR255 .
  class-methods FIXED_FRAME_COLUMNS
    importing
      !P_TRAMA type ZTTRAMA
    exporting
      !PW_INFO_DELIMITADA type CHAR2048 .
  class-methods DISPLAY
    importing
      !PS_MSGTY type SYMSGTY .
-----------------------------------------------------------------------------------------------------------------------------
Ahora en cada método colocamos esto:


***************TRANSLATION***********************
Now put that each method:
********************************************************
METHOD INIT_TREE.
  DATA: l_tree_container_name(30) TYPE c.
  DATA: at_toolbar_excl TYPE ui_functions.

  l_tree_container_name = ap_field_container.
  CLEAR at_toolbar_excl.

* creo el contenedor del árbol

  CREATE OBJECT ao_container
    EXPORTING
      container_name              = l_tree_container_name
    EXCEPTIONS
      cntl_error                  = 1
      cntl_system_error           = 2
      create_error                = 3
      lifetime_error              = 4
      lifetime_dynpro_dynpro_link = 5.

  IF sy-subrc <> 0.
    MESSAGE ID 'ZHRMSG' TYPE 'E' NUMBER 074.
  ENDIF.

** creo el árbol

  CREATE OBJECT ao_tree
    EXPORTING
      parent                      = ao_container
      node_selection_mode         = cl_gui_column_tree=>node_sel_mode_multiple
      item_selection              = 'X'
      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 ID 'ZHRMSG' TYPE 'E' NUMBER 074.
  ENDIF.

  CALL METHOD ao_tree->get_name_program
    EXPORTING
      p_programa = p_program.

  CALL METHOD zcl_alv_tree_mainp=>build_hierarchy_header
    EXPORTING
      p_struct_header = p_header
      p_progr         = p_program.

  ap_i_struct_name = p_structure.
  ap_i_struct_name_graphic = p_structure.

  CALL METHOD zcl_alv_tree_mainp=>build_fieldcatalog
    EXPORTING
      p_structure_name = p_structure
    IMPORTING
      p_fieldcat       = at_fieldcatalog.

  CALL METHOD zcl_alv_tree_mainp=>assign_alv
    EXPORTING
      p_alv_is_variant         = p_alv_is_variant
      p_alv_i_save             = p_alv_i_save
      p_alv_i_default          = p_alv_i_default
      p_alv_is_exception_field = p_alv_is_exception_field
      p_alv_it_special_groups  = p_alv_it_special_groups
      p_alv_it_list_commentary = p_alv_it_list_commentary
      p_alv_i_logo             = p_alv_i_logo
      p_alv_i_background_id    = p_alv_i_background_id
      p_alv_it_except_qinfo    = p_alv_it_except_qinfo
      p_alv_it_filter          = p_alv_it_filter.

  CALL METHOD zcl_alv_tree_mainp=>hide_functions
    EXPORTING
      p_mc_fc_f4               = p_hide_mc_fc_f4
      p_mc_fc_calculate        = p_hide_mc_fc_calculate
      p_mc_fc_calculate_avg    = p_hide_mc_fc_calculate_avg
      p_mc_fc_calculate_max    = p_hide_mc_fc_calculate_max
      p_mc_fc_calculate_min    = p_hide_mc_fc_calculate_min
      p_mc_fc_calculate_sum    = p_hide_mc_fc_calculate_sum
      p_mc_fc_collapse         = p_hide_mc_fc_collapse
      p_mc_fc_col_invisible    = p_hide_mc_fc_col_invisible
      p_mc_fc_col_optimize     = p_hide_mc_fc_col_optimize
      p_mc_fc_current_variant  = p_hide_mc_fc_current_variant
      p_mc_fc_detail           = p_hide_mc_fc_detail
      p_mc_fc_expand           = p_hide_mc_fc_expand
      p_mc_fc_find             = p_hide_mc_fc_find
      p_mc_fc_graphics         = p_hide_mc_fc_graphics
      p_mc_fc_help             = p_hide_mc_fc_help
      p_mc_fc_load_variant     = p_hide_mc_fc_load_variant
      p_mc_fc_maintain_variant = p_hide_mc_fc_maintain_variant
      p_mc_fc_print_back       = p_hide_mc_fc_print_back
      p_mc_fc_print_back_all   = p_hide_mc_fc_print_back_all
      p_mc_fc_print_prev       = p_hide_mc_fc_print_prev
      p_mc_fc_print_prev_all   = p_hide_mc_fc_print_prev_all
      p_mc_fc_save_variant     = p_hide_mc_fc_save_variant
      p_mc_fc_settop           = p_hide_mc_fc_settop
      p_mc_fc_find_more        = p_hide_mc_fc_find_more.

  CALL METHOD zcl_alv_tree_mainp=>hide_functions_class
    EXPORTING
      p_ap_button_crr = p_hide_ap_button_crr
      p_ap_button_crl = p_hide_ap_button_crl
      p_ap_button_ctl = p_hide_ap_button_ctl
      p_ap_button_ctr = p_hide_ap_button_ctr
      p_ap_button_sel = p_hide_ap_button_sel
      p_ap_button_des = p_hide_ap_button_des
      p_ap_button_gr1 = p_hide_ap_button_gr1
      p_ap_button_gr2 = p_hide_ap_button_gr2
      p_ap_button_xxl = p_hide_ap_button_xxl
      p_ap_button_isu = p_hide_ap_button_isu
      p_ap_button_isd = p_hide_ap_button_isd
      p_ap_button_fil = p_hide_ap_button_fil
      p_ap_button_und = p_hide_ap_button_und
      p_ap_button_adl = p_hide_ap_button_adl
      p_ap_button_sul = p_hide_ap_button_sul
      p_ap_button_sch = p_hide_ap_button_sch
      p_ap_button_dch = p_hide_ap_button_dch
      p_ap_button_sep = p_hide_ap_button_sep.

ENDMETHOD.

METHOD BUILD_HIERARCHY_HEADER.


  aw_is_hierarchy_header = p_struct_header.
  ap_program = p_progr.

ENDMETHOD.

METHOD BUILD_FIELDCATALOG.


  DATA: lt_fieldcatalog TYPE lvc_t_fcat.
  FIELD-SYMBOLS: <fs_fieldcat> TYPE lvc_s_fcat.

  CLEAR lt_fieldcatalog.
  REFRESH lt_fieldcatalog[].

  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name = p_structure_name
    CHANGING
      ct_fieldcat      = lt_fieldcatalog.

  at_fieldcatalog = lt_fieldcatalog.

  LOOP AT at_fieldcatalog ASSIGNING <fs_fieldcat>.

    IF ( <fs_fieldcat>-fieldname = ap_label_key OR  <fs_fieldcat>-fieldname = ap_label_type
  OR <fs_fieldcat>-fieldname = ap_label_tscreen OR <fs_fieldcat>-fieldname = ap_label_zsave
 OR <fs_fieldcat>-fieldname = ap_label_page OR <fs_fieldcat>-fieldname = ap_label_com ).
      <fs_fieldcat>-no_out = 'X' .
    ENDIF.
  ENDLOOP.

  p_fieldcat = at_fieldcatalog.

ENDMETHOD.

METHOD HIDE_FUNCTIONS.


  IF p_mc_fc_f4 = 'X'.
    APPEND ao_tree->mc_fc_f4 TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_calculate = 'X'.
    APPEND ao_tree->mc_fc_calculate TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_calculate_avg = 'X'.
    APPEND ao_tree->mc_fc_calculate_avg TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_calculate_max = 'X'.
    APPEND ao_tree->mc_fc_calculate_max TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_calculate_min = 'X'.
    APPEND ao_tree->mc_fc_calculate_min TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_calculate_sum = 'X'.
    APPEND ao_tree->mc_fc_calculate_sum TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_collapse = 'X'.
    APPEND ao_tree->mc_fc_collapse TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_col_invisible = 'X'.
    APPEND ao_tree->mc_fc_col_invisible TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_col_optimize = 'X'.
    APPEND ao_tree->mc_fc_col_optimize TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_current_variant = 'X'.
    APPEND ao_tree->mc_fc_current_variant TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_detail = 'X'.
    APPEND ao_tree->mc_fc_detail TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_expand = 'X'.
    APPEND ao_tree->mc_fc_expand TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_find = 'X'.
    APPEND ao_tree->mc_fc_find TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_graphics = 'X'.
    APPEND ao_tree->mc_fc_graphics TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_help = 'X'.
    APPEND ao_tree->mc_fc_help TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_load_variant = 'X'.
    APPEND ao_tree->mc_fc_load_variant TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_maintain_variant = 'X'.
    APPEND ao_tree->mc_fc_maintain_variant TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_print_back = 'X'.
    APPEND ao_tree->mc_fc_print_back TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_print_back_all = 'X'.
    APPEND ao_tree->mc_fc_print_back_all TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_print_prev = 'X'.
    APPEND ao_tree->mc_fc_print_prev TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_print_prev_all = 'X'.
    APPEND ao_tree->mc_fc_print_prev_all TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_save_variant = 'X'.
    APPEND ao_tree->mc_fc_save_variant TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_settop = 'X'.
    APPEND ao_tree->mc_fc_settop TO at_toolbar_excl.
  ENDIF.

  IF p_mc_fc_find_more = 'X'.
    APPEND ao_tree->mc_fc_find_more TO at_toolbar_excl.
  ENDIF.


ENDMETHOD.                    "hide_functions

* CALL METHOD zcl_alv_tree=>first_display.

METHOD HIDE_FUNCTIONS_CLASS.


  IF p_ap_button_crr = 'X'.
    APPEND ap_button_crr TO at_toolbar_excl.
  ENDIF.

  IF p_ap_button_crl = 'X'.
    APPEND ap_button_crl TO at_toolbar_excl.
  ENDIF.

  IF p_ap_button_ctl = 'X'.
    APPEND ap_button_ctl TO at_toolbar_excl.
  ENDIF.

  IF p_ap_button_ctr = 'X'.
    APPEND ap_button_ctr TO at_toolbar_excl.
  ENDIF.

  IF p_ap_button_sel = 'X'.
    APPEND ap_button_sel TO at_toolbar_excl.
  ENDIF.

  IF p_ap_button_des = 'X'.
    APPEND ap_button_des TO at_toolbar_excl.
  ENDIF.

  IF p_ap_button_gr1 = 'X'.
    APPEND ap_button_gr1 TO at_toolbar_excl.
  ENDIF.

  IF p_ap_button_gr2 = 'X'.
    APPEND ap_button_gr2 TO at_toolbar_excl.
  ENDIF.

  IF p_ap_button_xxl = 'X'.
    APPEND ap_button_xxl TO at_toolbar_excl.
  ENDIF.

  IF p_ap_button_isu = 'X'.
    APPEND ap_button_isu TO at_toolbar_excl.
  ENDIF.

  IF p_ap_button_isd = 'X'.
    APPEND ap_button_isd TO at_toolbar_excl.
  ENDIF.

  IF p_ap_button_fil = 'X'.
    APPEND ap_button_fil TO at_toolbar_excl.
  ENDIF.

  IF p_ap_button_und = 'X'.
    APPEND ap_button_und TO at_toolbar_excl.
  ENDIF.

  IF p_ap_button_adl = 'X'.
    APPEND ap_button_adl TO at_toolbar_excl.
  ENDIF.

  IF p_ap_button_sul = 'X'.
    APPEND ap_button_sul TO at_toolbar_excl.
  ENDIF.

  IF p_ap_button_sch = 'X'.
    APPEND ap_button_sch TO at_toolbar_excl.
  ENDIF.

  IF p_ap_button_dch = 'X'.
    APPEND ap_button_dch TO at_toolbar_excl.
  ENDIF.

  IF p_ap_button_sep = 'X'. "separador
    APPEND ap_button_sep TO at_toolbar_excl.
  ENDIF.

ENDMETHOD.                    "hide_functions

* CALL METHOD zcl_alv_tree=>first_display.

METHOD DISPLAY_ALV.


  DATA: at_node TYPE REF TO data.
  FIELD-SYMBOLS: <ta> TYPE table.
  FIELD-SYMBOLS: <fs_at_fieldcatalog> TYPE lvc_s_fcat.
  DATA: indice TYPE i.

  IF ap_i_struct_name <> space.
    CREATE DATA at_node TYPE TABLE OF (ap_i_struct_name).
    ASSIGN at_node->* TO <ta>.

    CALL METHOD ao_tree->set_table_for_first_display
      EXPORTING
        i_structure_name     = ap_i_struct_name
        is_variant           = aw_is_variant
        i_save               = ap_i_save
        i_default               = ap_i_default
        is_hierarchy_header  = aw_is_hierarchy_header
        is_exception_field   = aw_is_exception_field
        it_special_groups       = at_it_special_groups
        it_list_commentary   = at_it_list_commentary
        i_logo               = ap_i_logo
        i_background_id         = ap_i_background_id
        it_toolbar_excluding = at_toolbar_excl
        it_except_qinfo         = at_it_except_qinfo
      CHANGING
        it_outtab               = <ta>
        it_filter               = at_it_filter
        it_fieldcatalog         = at_fieldcatalog.

  ENDIF.

** new - 31-10-11
  ao_tree_b = ao_tree.
**

** new  - variante
  LOOP AT at_fieldcatalog ASSIGNING <fs_at_fieldcatalog>.
    indice = sy-tabix.
    <fs_at_fieldcatalog>-col_pos = indice.
*    MODIFY at_fieldcatalog FROM <fs_at_fieldcatalog>.
  ENDLOOP.
*** new

ENDMETHOD.

METHOD SEND_DATA.

  DATA: conta(2) TYPE n.
  DATA: etiq_valida TYPE string.
  FIELD-SYMBOLS: <fs_etiq_valida> TYPE dynfnam.
  DATA: etiq_valida2 TYPE string.
  FIELD-SYMBOLS: <fs_etiq_valida2> TYPE dynfnam.
  DATA: etiq_valida3 TYPE string.
  FIELD-SYMBOLS: <fs_etiq_valida3> TYPE dynfnam.
  DATA: etiq_valida4 TYPE string.
  FIELD-SYMBOLS: <fs_etiq_valida4> TYPE dynfnam.
  DATA: etiq_valida5 TYPE string.
  FIELD-SYMBOLS: <fs_etiq_valida5> TYPE dynfnam.
  DATA: etiq_valida6 TYPE string.
  FIELD-SYMBOLS: <fs_etiq_valida6> TYPE dynfnam.

  DATA: flag_p TYPE c.
  DATA: etiq TYPE string.

  DATA: conta_nivel(2) TYPE n.
  DATA: conta_busq TYPE n LENGTH 2.

  DATA: key_relative2 TYPE lvc_nkey.

***************************************************************************************
  ao_nodetab = p_nodetab.

  ap_field_out_excel = p_field_out_excel.
  ap_name_file_excel = p_name_file_excel.

  IF p_agroup_field IS NOT INITIAL.
    ap_group = 'X'.
  ELSE.
    ap_group = space.
  ENDIF.

** new ****************
  ap_field_graphics = p_field_graphics.
  ap_nivel_graphics = p_nivel_graphics.
  ap_collect_graphics = p_collect_graphics.

****************************************************************************************
  FIELD-SYMBOLS: <ti> TYPE table.
  ASSIGN ao_nodetab->* TO <ti>.
*****************************************
  DATA: node_result TYPE REF TO data.
  FIELD-SYMBOLS: <wi> TYPE ANY.
  CREATE DATA node_result TYPE (ap_i_struct_name).
  ASSIGN node_result->* TO <wi>.
******************************************************************************************

** new -> 29-11-11
  DATA: indice TYPE i.
  READ TABLE <ti> INTO <wi> WITH KEY (ap_label_type) = '00'.
  indice = sy-tabix.
  IF sy-subrc <= 2.
    CALL METHOD zcl_alv_tree_mainp=>add_node_tree
      EXPORTING
        p_node_result = <wi>
        p_relat_key   = space
        p_idx         = 0
      CHANGING
        p_new_key     = key_relative2.

    DELETE <ti> INDEX indice.

  ELSE.
    CALL METHOD zcl_alv_tree_mainp=>add_node_tree
      EXPORTING
        p_node_result = space
        p_relat_key   = space
        p_idx         = 0
      CHANGING
        p_new_key     = key_relative2.
  ENDIF.

** adiciono el nodo raiz.

************************************************************************

  conta_nivel = '00'.

  DO lim_nivel TIMES.
    conta_busq = conta_busq + 1.

    READ TABLE <ti> INTO <wi> WITH KEY (ap_label_type) = conta_busq.
    IF sy-subrc <= 2.
      conta_nivel = conta_nivel + 1.
    ENDIF.
  ENDDO.

  IF conta_nivel > 0.
    etiq = ap_field_run_nivel.

****************************************** asignaciones x agrupacion

    CALL METHOD zcl_alv_tree_mainp=>assign_by_group
      EXPORTING
        p_agroup_field = p_agroup_field.

************************************* asignaciones x screen

    CALL METHOD zcl_alv_tree_mainp=>assign_by_screen
      EXPORTING
        p_screen_field = p_screen_field.

**************************************

    ap_nivel_excel = p_nivel_excel.

**************************************   asignaciones
    conta = '00'.
    DO lim_nivel TIMES.
      conta = conta + 1.
      CONCATENATE ap_label_agroup_field  conta INTO etiq_valida.
      ASSIGN (etiq_valida) TO <fs_etiq_valida>.   "P_AGRUP_CAMPO01

      CONCATENATE ap_label_contain conta INTO etiq_valida2.  "CONTENIDO01"

      CONCATENATE ap_label_group conta INTO etiq_valida3.
      ASSIGN (etiq_valida3) TO <fs_etiq_valida3>.   "ETIQUETA_GRUPO01

      CONCATENATE ap_label_screen conta INTO etiq_valida4.
      ASSIGN (etiq_valida4) TO <fs_etiq_valida4>.   "ETIQUETA_SCREEN01

      CONCATENATE ap_label_screen_field conta INTO etiq_valida5.
      ASSIGN (etiq_valida5) TO <fs_etiq_valida5>.   "P_SCREEN_CAMPO01

      IF <fs_etiq_valida> <> space.
        ap_last_field = <fs_etiq_valida>.
        ap_last_field_cont = etiq_valida2.
        <fs_etiq_valida3> = <fs_etiq_valida>.
        <fs_etiq_valida4> = <fs_etiq_valida5>.
      ENDIF.

      CONCATENATE ap_label_field_group conta INTO etiq_valida6.
      ASSIGN (etiq_valida6) TO <fs_etiq_valida6>.   "CAMPO_GRUPO01

      CONCATENATE ap_structure <fs_etiq_valida3> INTO <fs_etiq_valida6>.

    ENDDO.

    ap_label_screen_page_b  = p_screen_page_begin.
    ap_label_screen_page_e  = p_screen_page_end.

    CALL METHOD zcl_alv_tree_mainp=>(etiq).
    CALL METHOD zcl_alv_tree_mainp=>groupby.

    CALL METHOD ao_tree->expand_node
      EXPORTING
        i_node_key          = key_relative2
      EXCEPTIONS
        failed              = 1
        illegal_level_count = 2
        cntl_system_error   = 3
        node_not_found      = 4
        cannot_expand_leaf  = 5
        OTHERS              = 6.

    flag_p = '0'.
    CALL METHOD zcl_alv_tree_mainp=>pagination
      EXPORTING
        flag_s = flag_p.

  ENDIF.

  CALL METHOD zcl_alv_tree_mainp=>change_toolbar.

  CALL METHOD zcl_alv_tree_mainp=>define_events
    EXPORTING
      p_right_click                  = p_ev_right_click
      p_left_click_design            = p_ev_left_click_design
      p_move_control                 = p_ev_move_control
      p_size_control                 = p_ev_size_control
      p_left_click_run               = p_ev_left_click_run
      p_default_context_menu_request = p_ev_def_context_menu_request
      p_header_context_menu_request  = p_ev_hea_context_menu_request
      p_header_context_menu_select   = p_ev_hea_context_menu_select
      p_before_user_command          = p_ev_before_user_command
      p_after_user_command           = p_ev_after_user_command
      p_top_of_page                  = p_ev_top_of_page
      p_default_context_menu_select  = p_ev_def_context_menu_select
      p_top_of_list                  = p_ev_top_of_list
      p_button_click                 = p_ev_button_click
      p_checkbox_change              = p_ev_checkbox_change
      p_expand_nc                    = p_ev_expand_nc
      p_header_click                 = p_ev_header_click
      p_header_context_menu          = p_ev_header_context_menu
      p_item_context_menu_request    = p_ev_item_cont_menu_request
      p_item_context_menu_selected   = p_ev_item_cont_menu_selected
      p_item_double_click            = p_ev_item_double_click
      p_item_keypress                = p_ev_item_keypress
      p_link_click                   = p_ev_link_click
      p_node_context_menu_request    = p_ev_node_cont_menu_request
      p_node_context_menu_selected   = p_ev_node_cont_menu_selected
      p_node_double_click            = p_ev_node_double_click
      p_on_drag                      = p_ev_on_drag
      p_on_drag_multiple             = p_ev_on_drag_multiple
      p_on_drop                      = p_ev_on_drop
      p_on_drop_complete             = p_ev_on_drop_complete
      p_on_drop_complete_multiple    = p_ev_on_drop_complete_multiple
      p_on_drop_get_flavor           = p_ev_on_drop_get_flavor
      p_selection_changed            = p_ev_selection_changed
      p_node_keypress                = p_ev_node_keypress.

  IF p_update_calculations = 'X'.
    CALL METHOD ao_tree->update_calculations.
  ENDIF.

** Envio la DATA al frontend.
  CALL METHOD ao_tree->frontend_update.

  CALL METHOD cl_gui_cfw=>flush
    EXCEPTIONS
      cntl_system_error = 1
      cntl_error        = 2.

  IF sy-subrc <> 0.
    CALL FUNCTION 'POPUP_TO_INFORM'
      EXPORTING
        titel = text-801
        txt1  = text-802
        txt2  = text-803
        txt3  = text-804.
  ENDIF.

  MESSAGE ID 'ZHRMSG' TYPE 'S' NUMBER 959 WITH ap_nivel_graphics.

ENDMETHOD.

METHOD ADD_NODE_TREE.


  FIELD-SYMBOLS: <fs_all_layout> TYPE zwitem_layout.

  CLEAR aw_layout_node.
  CLEAR aw_item_layout.
  CLEAR at_item_layout.
  REFRESH at_item_layout[].
  CLEAR ap_node_text.

  READ TABLE at_all_layout ASSIGNING <fs_all_layout>
  WITH KEY type = 'T' key_node = p_idx.
  IF sy-subrc <= 2.
    ap_node_text  = <fs_all_layout>-node_text.
  ENDIF.

  READ TABLE at_all_layout ASSIGNING <fs_all_layout>
  WITH KEY type = 'N' key_node = p_idx.
  IF sy-subrc <= 2.
    MOVE-CORRESPONDING <fs_all_layout> TO aw_layout_node.
  ENDIF.

  LOOP AT at_all_layout ASSIGNING <fs_all_layout>
  WHERE type = 'I' AND key_node = p_idx.
    CLEAR aw_item_layout.
    MOVE-CORRESPONDING <fs_all_layout> TO aw_item_layout.
    APPEND aw_item_layout TO at_item_layout.
  ENDLOOP.

  CALL METHOD ao_tree->add_node
    EXPORTING
      i_relat_node_key     = p_relat_key
      i_relationship       = cl_gui_column_tree=>relat_last_child
      i_node_text          = ap_node_text
      is_outtab_line       = p_node_result
      is_node_layout       = aw_layout_node
      it_item_layout       = at_item_layout
    IMPORTING
      e_new_node_key       = p_new_key
    EXCEPTIONS
      relat_node_not_found = 1
      node_not_found       = 2
      OTHERS               = 3.

  IF sy-subrc <> 0.
    CASE sy-subrc.
      WHEN '1'.
        MESSAGE ID 'ZHRMSG' TYPE 'I' NUMBER 499.
      WHEN '2'.
        MESSAGE ID 'ZHRMSG' TYPE 'I' NUMBER 503.

      WHEN OTHERS.
        MESSAGE ID sy-msgid
    TYPE sy-msgty
    NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDCASE.
  ENDIF.

ENDMETHOD.

METHOD PAGINATION.


  DATA: conta_reg TYPE i,
        conta_max TYPE i,
        conta_min TYPE i,
        page_cociente TYPE i,
        is_visible TYPE c.

  DATA: conta_s TYPE num.
  DATA idt TYPE sytabix.
  DATA ramificacion TYPE lvc_t_nkey.
  FIELD-SYMBOLS: <fs_field_key> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_type> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_tscreen> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_page> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group01> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group02> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group03> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group04> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group05> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group06> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group07> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group08> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group09> TYPE ANY.

  FIELD-SYMBOLS: <fs_nombre_campo> TYPE ANY.
  FIELD-SYMBOLS: <fs_valor_campo> TYPE ANY.
  DATA: etiq_campo TYPE string.
  DATA: etiq_campo2 TYPE string.
  FIELD-SYMBOLS: <fs> TYPE ANY.

***********************************
  FIELD-SYMBOLS: <ti> TYPE table.
  ASSIGN ao_nodetab->* TO <ti>.
***********************************

*****************************************
  DATA: wnode_tab TYPE REF TO data.
  FIELD-SYMBOLS: <wi> TYPE ANY.
  CREATE DATA wnode_tab TYPE (ap_i_struct_name).
  ASSIGN wnode_tab->* TO <wi>.
*************************************************

*****************************************
  DATA: w_outtab TYPE REF TO data.
  FIELD-SYMBOLS: <wi2> TYPE ANY.
  CREATE DATA w_outtab TYPE (ap_i_struct_name).
  ASSIGN w_outtab->* TO <wi2>.
*************************************************

  conta_reg = 0.
  ap_items_x_page = 0.
  ap_page_end = 0.
  page_cociente = 0.

*** abrir nodos
  ap_pulsac_open = '00'.

  IF flag_s <> '0' AND ap_group = space.
    EXIT.
  ELSE.

    CLEAR <wi>.
    SORT <ti> BY (ap_label_page) (ap_label_key).

    LOOP AT <ti> INTO <wi>.

      idt = sy-tabix.

      ASSIGN (ap_field_key) TO <fs_field_key>.
      ASSIGN (ap_field_type) TO <fs_field_type>.
      ASSIGN (ap_field_tscreen) TO <fs_field_tscreen>.

      IF <fs_field_type> = '01'.
        <fs_field_tscreen> = space.
        MODIFY <ti> INDEX idt FROM <wi>
        TRANSPORTING (ap_label_tscreen).
      ENDIF.

    ENDLOOP.

    CLEAR <wi>.
    IF ap_group = 'X'.
      ASSIGN (ap_field_page) TO <fs_field_page>.
      READ TABLE <ti> INDEX idt INTO <wi>.
      ap_page_end = <fs_field_page>.
    ELSE.
      ap_page_end = 1.
    ENDIF.

** el usuario da click en el boton avanzar derecha

    CASE flag_s.
      WHEN '0'.
        ap_page_present = 1.
      WHEN '1'.
        IF ap_page_present < ap_page_end.
          ap_page_present = ap_page_present + 1.
        ENDIF.
      WHEN '2'.
        IF ap_page_present > 1.
          ap_page_present = ap_page_present - 1.
        ENDIF.
      WHEN '3'.
        ap_page_present = 1.
      WHEN '4'.
        ap_page_present = ap_page_end.
      WHEN OTHERS.

    ENDCASE.
*
*** asignamos las solicitudes que van a salir por pantalla
*** ( tlock )
*
    ap_page_min = ap_page_present.
    ap_page_max = ap_page_end.
*
    CLEAR <wi>.

    LOOP AT <ti> INTO <wi>.
      idt = sy-tabix.

      ASSIGN (ap_field_type) TO <fs_field_type>.
      ASSIGN (ap_field_tscreen) TO <fs_field_tscreen>.
      ASSIGN (ap_field_page) TO <fs_field_page>.
      ASSIGN (ap_field_group01) TO <fs_field_group01>.
      ASSIGN (ap_field_group02) TO <fs_field_group02>.
      ASSIGN (ap_field_group03) TO <fs_field_group03>.
      ASSIGN (ap_field_group04) TO <fs_field_group04>.
      ASSIGN (ap_field_group05) TO <fs_field_group05>.
      ASSIGN (ap_field_group06) TO <fs_field_group06>.
      ASSIGN (ap_field_group07) TO <fs_field_group07>.
      ASSIGN (ap_field_group08) TO <fs_field_group08>.
      ASSIGN (ap_field_group09) TO <fs_field_group09>.

      IF <fs_field_type> = '01' AND <fs_field_page> = ap_page_present.
        <fs_field_tscreen> = 'X'.
        MODIFY <ti> INDEX idt FROM <wi> TRANSPORTING (ap_label_tscreen).

        IF ap_group = 'X' AND conta_reg = 0.
          conta_reg = 1.

          conta_s = 0.
          DO lim_nivel TIMES.
            conta_s = conta_s + 1.
            CONCATENATE ap_label_screen conta_s INTO etiq_campo.
            ASSIGN (etiq_campo) TO <fs_nombre_campo>.

            CONCATENATE ap_field_fieldgroup conta_s '>' INTO etiq_campo2.
            ASSIGN (etiq_campo2) TO <fs>.

            CALL METHOD zcl_alv_tree_mainp=>update_field_dynpro
              EXPORTING
                p_nombre_programa = ap_program
                p_nombre_dynpro   = sy-dynnr
                p_nombre_campo    = <fs_nombre_campo>
                p_valor           = <fs>.

          ENDDO.

        ENDIF.
      ENDIF.
    ENDLOOP.
*
    IF <wi> IS NOT INITIAL.

*** modifico el layout.
      CLEAR <wi>.
      CLEAR <wi2>.
      CLEAR aw_node_layout.
      is_visible = space.
      REFRESH at_nodes_marked_header.

      LOOP AT <ti> INTO <wi2>.

        idt = sy-tabix.

        ASSIGN (ap_field_key2) TO <fs_field_key>.
        ASSIGN (ap_field_type2) TO <fs_field_type>.
        ASSIGN (ap_field_tscreen2) TO <fs_field_tscreen>.

        IF <fs_field_type> = '01'.

          ap_node_id_key = <fs_field_key>.

          CALL METHOD ao_tree->get_outtab_line
            EXPORTING
              i_node_key     = ap_node_id_key
            IMPORTING
              e_outtab_line  = <wi>
              es_node_layout = aw_layout_node
            EXCEPTIONS
              node_not_found = 1
              OTHERS         = 2.

          MOVE-CORRESPONDING aw_layout_node TO aw_node_layout.

          REFRESH ramificacion.

          CALL METHOD ao_tree->get_children
            EXPORTING
              i_node_key         = ap_node_id_key
            IMPORTING
              et_children        = ramificacion
            EXCEPTIONS
              historic_error     = 1
              node_key_not_found = 2
              OTHERS             = 3.

          IF ( <fs_field_tscreen> <> 'X' ).
            aw_node_layout-hidden = 'X'.
            aw_node_layout-u_hidden = 'X'.
          ELSE.
            aw_node_layout-hidden = ''.
            aw_node_layout-u_hidden = 'X'.
            is_visible = 'X'.
            IF ramificacion IS NOT INITIAL.
              APPEND ap_node_id_key TO at_nodes_marked_header.
            ENDIF.
          ENDIF.

          CALL METHOD ao_tree->change_node
            EXPORTING
              i_node_key     = ap_node_id_key
              i_outtab_line  = <wi>
              is_node_layout = aw_node_layout
            EXCEPTIONS
              node_not_found = 1
              OTHERS         = 2.

        ENDIF.
      ENDLOOP.
    ENDIF.
  ENDIF.
*
** actualizo el front-end
  CALL METHOD ao_tree->frontend_update.

  IF ap_label_screen_page_b IS NOT INITIAL.
    CALL METHOD zcl_alv_tree_mainp=>update_field_dynpro
      EXPORTING
        p_nombre_programa = ap_program
        p_nombre_dynpro   = sy-dynnr
        p_nombre_campo    = ap_label_screen_page_b
        p_valor           = ap_page_min.
  ENDIF.

  IF ap_label_screen_page_e IS NOT INITIAL.
    CALL METHOD zcl_alv_tree_mainp=>update_field_dynpro
      EXPORTING
        p_nombre_programa = ap_program
        p_nombre_dynpro   = sy-dynnr
        p_nombre_campo    = ap_label_screen_page_e
        p_valor           = ap_page_max.
  ENDIF.

  CALL METHOD cl_gui_cfw=>flush
    EXCEPTIONS
      cntl_system_error = 1
      cntl_error        = 2
      OTHERS            = 3.

ENDMETHOD.

METHOD CHANGE_TOOLBAR.

  FIELD-SYMBOLS : <fs_toolbar> TYPE ui_func.

** creamos el toolbar

  CALL METHOD ao_tree->get_toolbar_object
    IMPORTING
      er_toolbar = ao_toolbar.

  CHECK NOT ao_toolbar IS INITIAL.

** modifico toolbar
** adiciono el separador

  CALL METHOD ao_toolbar->add_button
    EXPORTING
      fcode            = ''
      icon             = ''
      butn_type        = cntb_btype_sep
    EXCEPTIONS
      cntl_error       = 1
      cntb_btype_error = 2
      cntb_error_fcode = 3
      OTHERS           = 4.

  READ TABLE at_toolbar_excl ASSIGNING <fs_toolbar> WITH KEY table_line = '&SEL'.
  IF sy-subrc > 2.
    CALL METHOD ao_toolbar->add_button
     EXPORTING
       fcode     = '&SEL'
*      icon      = ICON_EXPAND
       icon      = icon_next_node
       butn_type = cntb_btype_button
       text      = 'Abrir'
       quickinfo = 'Abrir Nodos del Nivel'
     EXCEPTIONS
       cntl_error       = 1
       cntb_btype_error = 2
       cntb_error_fcode = 3
       OTHERS           = 4.
  ENDIF.

  READ TABLE at_toolbar_excl ASSIGNING <fs_toolbar> WITH KEY table_line = '&DES'.
  IF sy-subrc > 2.
    CALL METHOD ao_toolbar->add_button
      EXPORTING
        fcode     = '&DES'
*      icon      = ICON_COLLAPSE
        icon      = icon_previous_node
        butn_type = cntb_btype_button
        text      = 'Cerrar'
        quickinfo = 'Cerrar Todos los Nodos'
      EXCEPTIONS
        cntl_error       = 1
        cntb_btype_error = 2
        cntb_error_fcode = 3
        OTHERS           = 4.
  ENDIF.


  CALL METHOD ao_toolbar->add_button
    EXPORTING
      fcode            = ''
      icon             = ''
      butn_type        = cntb_btype_sep
    EXCEPTIONS
      cntl_error       = 1
      cntb_btype_error = 2
      cntb_error_fcode = 3
      OTHERS           = 4.

  READ TABLE at_toolbar_excl ASSIGNING <fs_toolbar> WITH KEY table_line = '&SCH'.
  IF sy-subrc > 2.
    CALL METHOD ao_toolbar->add_button
     EXPORTING
       fcode     = '&SCH'
*      icon      = ICON_EXPAND
       icon      = icon_select_all
       butn_type = cntb_btype_button
       text      = ''
       quickinfo = 'Marcar Todo'
     EXCEPTIONS
       cntl_error       = 1
       cntb_btype_error = 2
       cntb_error_fcode = 3
       OTHERS           = 4.
  ENDIF.

  READ TABLE at_toolbar_excl ASSIGNING <fs_toolbar> WITH KEY table_line = '&DCH'.
  IF sy-subrc > 2.
    CALL METHOD ao_toolbar->add_button
      EXPORTING
        fcode     = '&DCH'
*      icon      = ICON_COLLAPSE
        icon      = icon_deselect_all
        butn_type = cntb_btype_button
        text      = ''
        quickinfo = 'Desmarcar Todo'
      EXCEPTIONS
        cntl_error       = 1
        cntb_btype_error = 2
        cntb_error_fcode = 3
        OTHERS           = 4.
  ENDIF.

  CALL METHOD ao_toolbar->add_button
    EXPORTING
      fcode            = ''
      icon             = ''
      butn_type        = cntb_btype_sep
    EXCEPTIONS
      cntl_error       = 1
      cntb_btype_error = 2
      cntb_error_fcode = 3
      OTHERS           = 4.

  READ TABLE at_toolbar_excl ASSIGNING <fs_toolbar> WITH KEY table_line = '&CTL'.
  IF sy-subrc > 2.

    CALL METHOD ao_toolbar->add_button
      EXPORTING
        fcode            = '&CTL'
        icon             = icon_total_left
        butn_type        = cntb_btype_button
        text             = ''
        quickinfo        = 'Ir pagina inicial'
      EXCEPTIONS
        cntl_error       = 1
        cntb_btype_error = 2
        cntb_error_fcode = 3
        OTHERS           = 4.
  ENDIF.

  READ TABLE at_toolbar_excl ASSIGNING <fs_toolbar> WITH KEY table_line = '&CRL'.
  IF sy-subrc > 2.

    CALL METHOD ao_toolbar->add_button
      EXPORTING
        fcode            = '&CRL'
        icon             = icon_column_left
        butn_type        = cntb_btype_button
        text             = ''
        quickinfo        = 'Avanza izquierda'
      EXCEPTIONS
        cntl_error       = 1
        cntb_btype_error = 2
        cntb_error_fcode = 3
        OTHERS           = 4.
  ENDIF.

  READ TABLE at_toolbar_excl ASSIGNING <fs_toolbar> WITH KEY table_line = '&CRR'.
  IF sy-subrc > 2.

    CALL METHOD ao_toolbar->add_button
      EXPORTING
        fcode            = '&CRR'
        icon             = icon_column_right
        butn_type        = cntb_btype_button
        text             = ''
        quickinfo        = 'Avanza derecha'
      EXCEPTIONS
        cntl_error       = 1
        cntb_btype_error = 2
        cntb_error_fcode = 3
        OTHERS           = 4.
  ENDIF.

  READ TABLE at_toolbar_excl ASSIGNING <fs_toolbar> WITH KEY table_line = '&CTR'.
  IF sy-subrc > 2.

    CALL METHOD ao_toolbar->add_button
      EXPORTING
        fcode            = '&CTR'
        icon             = icon_total_right
        butn_type        = cntb_btype_button
        text             = ''
        quickinfo        = 'Ir pagina final'
      EXCEPTIONS
        cntl_error       = 1
        cntb_btype_error = 2
        cntb_error_fcode = 3
        OTHERS           = 4.
  ENDIF.

  CALL METHOD ao_toolbar->add_button
    EXPORTING
      fcode            = ''
      icon             = ''
      butn_type        = cntb_btype_sep
    EXCEPTIONS
      cntl_error       = 1
      cntb_btype_error = 2
      cntb_error_fcode = 3
      OTHERS           = 4.

  READ TABLE at_toolbar_excl ASSIGNING <fs_toolbar> WITH KEY table_line = '&GR1'.
  IF sy-subrc > 2.

    CALL METHOD ao_toolbar->add_button
       EXPORTING
         fcode     = '&GR1'
*      icon      = ICON_EXPAND
         icon      = icon_graphics
         butn_type = cntb_btype_button
         text      = 'Estadísticas'
         quickinfo = 'Estadisticas'
       EXCEPTIONS
         cntl_error       = 1
         cntb_btype_error = 2
         cntb_error_fcode = 3
         OTHERS           = 4.
  ENDIF.

*  READ TABLE at_toolbar_excl ASSIGNING <fs_toolbar> WITH KEY table_line = '&GR2'.
*  IF sy-subrc > 2.
*
*    CALL METHOD ao_toolbar->add_button
*       EXPORTING
*         fcode     = '&GR2'
**      icon      = ICON_EXPAND
*         icon      = icon_graphics
*         butn_type = cntb_btype_button
*         text      = 'Estadística 2'
*         quickinfo = 'Estadistica 2'
*       EXCEPTIONS
*         cntl_error       = 1
*         cntb_btype_error = 2
*         cntb_error_fcode = 3
*         OTHERS           = 4.
*  ENDIF.

  READ TABLE at_toolbar_excl ASSIGNING <fs_toolbar> WITH KEY table_line = '&ADL'.
  IF sy-subrc > 2.

    CALL METHOD ao_toolbar->add_button
      EXPORTING
        fcode            = '&ADL'
        icon             = icon_procurement_alternative
        butn_type        = cntb_btype_button
        text             = ''
        quickinfo        = 'Adicionar Nivel'
      EXCEPTIONS
        cntl_error       = 1
        cntb_btype_error = 2
        cntb_error_fcode = 3
        OTHERS           = 4.
  ENDIF.

  READ TABLE at_toolbar_excl ASSIGNING <fs_toolbar> WITH KEY table_line = '&SUL'.
  IF sy-subrc > 2.

    CALL METHOD ao_toolbar->add_button
      EXPORTING
        fcode            = '&SUL'
        icon             = icon_consumption_alternative
        butn_type        = cntb_btype_button
        text             = ''
        quickinfo        = 'Restar Nivel'
      EXCEPTIONS
        cntl_error       = 1
        cntb_btype_error = 2
        cntb_error_fcode = 3
        OTHERS           = 4.
  ENDIF.

  CALL METHOD ao_toolbar->add_button
    EXPORTING
      fcode            = ''
      icon             = ''
      butn_type        = cntb_btype_sep
    EXCEPTIONS
      cntl_error       = 1
      cntb_btype_error = 2
      cntb_error_fcode = 3
      OTHERS           = 4.

  READ TABLE at_toolbar_excl ASSIGNING <fs_toolbar> WITH KEY table_line = '&ISU'.
  IF sy-subrc > 2.

    CALL METHOD ao_toolbar->add_button
    EXPORTING
      fcode     = '&ISU'
*      icon      = ICON_EXPAND
      icon      = icon_sort_up
      butn_type = cntb_btype_button
      text      = ''
      quickinfo = 'Ordena Ascendentemente'
    EXCEPTIONS
      cntl_error       = 1
      cntb_btype_error = 2
      cntb_error_fcode = 3
      OTHERS           = 4.

  ENDIF.

  READ TABLE at_toolbar_excl ASSIGNING <fs_toolbar> WITH KEY table_line = '&ISD'.
  IF sy-subrc > 2.

    CALL METHOD ao_toolbar->add_button
    EXPORTING
      fcode     = '&ISD'
*      icon      = ICON_EXPAND
      icon      = icon_sort_down
      butn_type = cntb_btype_button
      text      = ''
      quickinfo = 'Ordena Descendentemente'
    EXCEPTIONS
      cntl_error       = 1
      cntb_btype_error = 2
      cntb_error_fcode = 3
      OTHERS           = 4.

  ENDIF.

  CALL METHOD ao_toolbar->add_button
    EXPORTING
      fcode            = ''
      icon             = ''
      butn_type        = cntb_btype_sep
    EXCEPTIONS
      cntl_error       = 1
      cntb_btype_error = 2
      cntb_error_fcode = 3
      OTHERS           = 4.

  READ TABLE at_toolbar_excl ASSIGNING <fs_toolbar> WITH KEY table_line = '&FIL'.
  IF sy-subrc > 2.

    CALL METHOD ao_toolbar->add_button
    EXPORTING
      fcode     = '&FIL'
*      icon      = ICON_EXPAND
      icon      = icon_filter
      butn_type = cntb_btype_button
      text      = ''
      quickinfo = 'Filtrar'
    EXCEPTIONS
      cntl_error       = 1
      cntb_btype_error = 2
      cntb_error_fcode = 3
      OTHERS           = 4.

  ENDIF.

  READ TABLE at_toolbar_excl ASSIGNING <fs_toolbar> WITH KEY table_line = '&UND'.
  IF sy-subrc > 2.

    CALL METHOD ao_toolbar->add_button
      EXPORTING
        fcode            = '&UND'
        icon             = icon_filter_undo
        butn_type        = cntb_btype_button
        text             = ''
        quickinfo        = 'Deshacer Filtro'
      EXCEPTIONS
        cntl_error       = 1
        cntb_btype_error = 2
        cntb_error_fcode = 3
        OTHERS           = 4.
  ENDIF.

  CALL METHOD ao_toolbar->add_button
    EXPORTING
      fcode            = ''
      icon             = ''
      butn_type        = cntb_btype_sep
    EXCEPTIONS
      cntl_error       = 1
      cntb_btype_error = 2
      cntb_error_fcode = 3
      OTHERS           = 4.


  READ TABLE at_toolbar_excl ASSIGNING <fs_toolbar> WITH KEY table_line = '&XXL'.
  IF sy-subrc > 2.

    CALL METHOD ao_toolbar->add_button
    EXPORTING
      fcode     = '&XXL'
*      icon      = ICON_EXPAND
      icon      = icon_xxl
      butn_type = cntb_btype_button
      text      = ''
      quickinfo = 'Exporta a Excel'
    EXCEPTIONS
      cntl_error       = 1
      cntb_btype_error = 2
      cntb_error_fcode = 3
      OTHERS           = 4.

  ENDIF.

ENDMETHOD.

METHOD DEFINE_EVENTS.


  DATA: events TYPE cntl_simple_events,
        event TYPE cntl_simple_event,
        l_event_receiver TYPE REF TO lcl_toolbar_event_receiver.

  CLEAR events.

  CALL METHOD ao_tree->get_registered_events
    IMPORTING
      events     = events
    EXCEPTIONS
      cntl_error = 1
      OTHERS     = 2.

  IF p_default_context_menu_request  = 'X'.
    event-eventid = cl_gui_column_tree=>eventid_def_context_menu_req.
    event-appl_event = 'X'.
    APPEND event TO events.
  ENDIF.

  IF p_expand_nc = 'X'.
    event-eventid = cl_gui_column_tree=>eventid_expand_no_children.
    event-appl_event = 'X'.
    APPEND event TO events.
  ENDIF.

  IF p_node_context_menu_request   = 'X'.
    event-eventid = cl_gui_column_tree=>eventid_node_context_menu_req.
    event-appl_event = 'X'.
    APPEND event TO events.
  ENDIF.

  IF p_node_double_click = 'X'.
    event-eventid = cl_gui_column_tree=>eventid_node_double_click.
    event-appl_event = 'X'.
    APPEND event TO events.
  ENDIF.

  IF p_selection_changed  = 'X'.
    event-eventid = cl_gui_column_tree=>eventid_selection_changed.
    event-appl_event = 'X'.
    APPEND event TO events.
  ENDIF.

  IF p_node_keypress = 'X'.
    event-eventid = cl_gui_column_tree=>eventid_node_keypress.
    event-appl_event = 'X'.
    APPEND event TO events.
  ENDIF.

  IF p_checkbox_change  = 'X'.
    event-eventid = cl_gui_column_tree=>eventid_checkbox_change.
    event-appl_event = 'X'.
    APPEND event TO events.
  ENDIF.

  IF p_link_click  = 'X'.
    event-eventid = cl_gui_column_tree=>eventid_link_click.
    event-appl_event = 'X'.
    APPEND event TO events.
  ENDIF.

** NUEVO - 26.10.11

  IF p_header_click = 'X'.
    event-eventid = cl_gui_column_tree=>eventid_header_click.
    event-appl_event = 'X'.
    APPEND event TO events.
  ENDIF.

  IF p_item_keypress = 'X'.
    event-eventid = cl_gui_column_tree=>eventid_item_keypress.
    event-appl_event = 'X'.
    APPEND event TO events.
  ENDIF.

  IF p_item_double_click = 'X'.
    event-eventid = cl_gui_column_tree=>eventid_item_double_click.
    event-appl_event = 'X'.
    APPEND event TO events.
  ENDIF.

  IF p_button_click = 'X'.
    event-eventid = cl_gui_column_tree=>eventid_button_click.
    event-appl_event = 'X'.
    APPEND event TO events.
  ENDIF.

  IF p_item_context_menu_request = 'X'.
    event-eventid = cl_gui_column_tree=>eventid_item_context_menu_req.
    event-appl_event = 'X'.
    APPEND event TO events.
  ENDIF.

************************************************************************

  CALL METHOD ao_tree->set_registered_events
    EXPORTING
      events                    = events
    EXCEPTIONS
      cntl_error                = 1
      cntl_system_error         = 2
      illegal_event_combination = 3.

  IF sy-subrc <> 0.
    MESSAGE ID 'ZHRMSG' TYPE 'E' NUMBER 081.
  ENDIF.

  IF p_right_click = 'X'.
    SET HANDLER ao_tree->ev_right_click FOR ao_tree.
  ENDIF.

  IF p_left_click_design = 'X'.
    SET HANDLER ao_tree->ev_left_click_design FOR ao_tree.
  ENDIF.

  IF p_move_control = 'X'.
    SET HANDLER ao_tree->ev_move_control FOR ao_tree.
  ENDIF.

  IF p_size_control = 'X'.
    SET HANDLER ao_tree->ev_size_control FOR ao_tree.
  ENDIF.

  IF p_left_click_run = 'X'.
    SET HANDLER ao_tree->ev_left_click_run FOR ao_tree.
  ENDIF.

  IF p_default_context_menu_request  = 'X'.
    SET HANDLER ao_tree->ev_def_context_menu_request FOR ao_tree.
  ENDIF.

  IF p_header_context_menu_request  = 'X'.
    SET HANDLER ao_tree->ev_hea_context_menu_request FOR ao_tree.
  ENDIF.

  IF p_header_context_menu_select = 'X'.
    SET HANDLER ao_tree->ev_hea_context_menu_select FOR ao_tree.
  ENDIF.

  IF p_before_user_command  = 'X'.
    SET HANDLER ao_tree->ev_before_user_command FOR ao_tree.
  ENDIF.

  IF p_after_user_command  = 'X'.
    SET HANDLER ao_tree->ev_after_user_command FOR ao_tree.
  ENDIF.

  IF p_top_of_page   = 'X'.
    SET HANDLER ao_tree->ev_top_of_page FOR ao_tree.
  ENDIF.

  IF p_default_context_menu_select    = 'X'.
    SET HANDLER ao_tree->ev_def_context_menu_select FOR ao_tree.
  ENDIF.

  IF p_top_of_list = 'X'.
    SET HANDLER ao_tree->ev_top_of_list FOR ao_tree.
  ENDIF.

  IF p_button_click = 'X'.
    SET HANDLER ao_tree->ev_button_click FOR ao_tree.
  ENDIF.

  IF p_checkbox_change  = 'X'.
    SET HANDLER ao_tree->ev_checkbox_change FOR ao_tree.
  ENDIF.

  IF p_expand_nc = 'X'.
    SET HANDLER ao_tree->ev_expand_nc FOR ao_tree.
  ENDIF.

  IF p_header_click = 'X'.
    SET HANDLER ao_tree->ev_header_click  FOR ao_tree.
  ENDIF.

  IF p_header_context_menu  = 'X'.
    SET HANDLER ao_tree->ev_hea_context_menu  FOR ao_tree.
  ENDIF.

  IF p_item_context_menu_request  = 'X'.
    SET HANDLER ao_tree->ev_item_context_menu_request FOR ao_tree.
  ENDIF.

  IF p_item_context_menu_selected = 'X'.
    SET HANDLER ao_tree->ev_item_context_menu_selected FOR ao_tree.
  ENDIF.

  IF p_item_double_click = 'X'.
    SET HANDLER ao_tree->ev_item_double_click FOR ao_tree.
  ENDIF.

  IF p_item_keypress = 'X'.
    SET HANDLER ao_tree->ev_item_keypress FOR ao_tree.
  ENDIF.

  IF p_link_click  = 'X'.
    SET HANDLER ao_tree->ev_link_click FOR ao_tree.
  ENDIF.

  IF p_node_context_menu_request   = 'X'.
    SET HANDLER ao_tree->ev_node_context_menu_request FOR ao_tree.
  ENDIF.

  IF p_node_context_menu_selected = 'X'.
    SET HANDLER ao_tree->ev_node_context_menu_selected FOR ao_tree.
  ENDIF.

  IF p_node_double_click = 'X'.
    SET HANDLER ao_tree->ev_node_double_click  FOR ao_tree.
  ENDIF.

  IF p_on_drag  = 'X'.
    SET HANDLER ao_tree->ev_on_drag FOR ao_tree.
  ENDIF.

  IF p_on_drag_multiple = 'X'.
    SET HANDLER ao_tree->ev_on_drag_multiple FOR ao_tree.
  ENDIF.

  IF p_on_drop = 'X'.
    SET HANDLER ao_tree->ev_on_drop FOR ao_tree.
  ENDIF.

  IF p_on_drop_complete = 'X'.
    SET HANDLER ao_tree->ev_on_drop_complete FOR ao_tree.
  ENDIF.

  IF p_on_drop_complete_multiple = 'X'.
    SET HANDLER ao_tree->ev_on_drop_complete_multiple  FOR ao_tree.
  ENDIF.

  IF p_on_drop_get_flavor = 'X'.
    SET HANDLER ao_tree->ev_on_drop_get_flavor FOR ao_tree.
  ENDIF.

  IF p_selection_changed  = 'X'.
    SET HANDLER ao_tree->ev_selection_changed FOR ao_tree.
  ENDIF.

  IF p_node_keypress = 'X'.
    SET HANDLER ao_tree->ev_node_keypress FOR ao_tree.
  ENDIF.

*
** establezco comunicacion con el manejador de eventos de ao_toolbar
  CREATE OBJECT l_event_receiver.
  SET HANDLER l_event_receiver->on_function_selected FOR ao_toolbar.

ENDMETHOD.

METHOD ASSIGN_ALV.


  aw_is_variant = p_alv_is_variant.
  ap_i_save = p_alv_i_save.
  ap_i_default = p_alv_i_default.
  aw_is_exception_field = p_alv_is_exception_field.
  at_it_special_groups = p_alv_it_special_groups.
  at_it_list_commentary = p_alv_it_list_commentary.
  ap_i_logo = p_alv_i_logo.
  ap_i_background_id = p_alv_i_background_id.
  at_it_except_qinfo = p_alv_it_except_qinfo.
  at_it_filter = p_alv_it_filter.

ENDMETHOD.

METHOD RUN_NIVEL.


  FIELD-SYMBOLS: <ti> TYPE table.
  ASSIGN ao_nodetab->* TO <ti>.

  DATA: conta TYPE num.
  DATA: etiq_grupo TYPE string.
  DATA: etiq_contenido TYPE string.

  FIELD-SYMBOLS: <fs_grupo> TYPE ANY.
  FIELD-SYMBOLS: <fs_grupo2> TYPE ANY.
  FIELD-SYMBOLS: <fs_contenido> TYPE ANY.

***********************************

*****************************************
  DATA: node_result TYPE REF TO data.
  FIELD-SYMBOLS: <wi> TYPE ANY.
  CREATE DATA node_result TYPE (ap_i_struct_name).
  ASSIGN node_result->* TO <wi>.

  DATA: idx TYPE sytabix.
  DATA: conta_key(2) TYPE n.
  DATA: etiq_campo_in TYPE dynfnam.
  DATA: etiq_campo_out TYPE dynfnam.
  FIELD-SYMBOLS: <fs_campo_key_in> TYPE lvc_nkey.
  FIELD-SYMBOLS: <fs_campo_key_out> TYPE lvc_nkey.

  FIELD-SYMBOLS: <fs_field_key> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_type> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group01> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group02> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group03> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group04> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group05> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group06> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group07> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group08> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group09> TYPE ANY.

  CLEAR at_group.
  REFRESH at_group[].

  LOOP AT <ti> INTO <wi>.

    idx = sy-tabix.
    conta = '00'.

    ASSIGN (ap_field_key) TO <fs_field_key>.
    ASSIGN (ap_field_type) TO <fs_field_type>.
**
    IF <fs_field_type> = '01'.
      DO lim_nivel TIMES.
        conta = conta + 1.
        CONCATENATE ap_label_field_group conta INTO etiq_grupo.

        ASSIGN (etiq_grupo) TO <fs_grupo>.
        ASSIGN (<fs_grupo>) TO <fs_grupo2>.

        IF <fs_grupo2> IS ASSIGNED.
          CONCATENATE ap_field_group conta INTO etiq_contenido.
          ASSIGN (etiq_contenido) TO <fs_contenido>.
          <fs_contenido> = <fs_grupo2>.
        ENDIF.

      ENDDO.
    ENDIF.
** grupo
    COLLECT aw_group INTO at_group.

***
    conta_key = <fs_field_type>.

    CLEAR etiq_campo_in.
    CLEAR etiq_campo_out.
    CONCATENATE ap_label_field_key conta_key INTO etiq_campo_in.
    conta_key = conta_key = conta_key + 1.
    CONCATENATE ap_label_field_key conta_key INTO etiq_campo_out.

    ASSIGN (etiq_campo_in) TO <fs_campo_key_in>.
    ASSIGN (etiq_campo_out) TO <fs_campo_key_out>.

    CALL METHOD zcl_alv_tree_mainp=>add_node_tree
      EXPORTING
        p_node_result = <wi>
        p_relat_key   = <fs_campo_key_in>
        p_idx         = idx
      CHANGING
        p_new_key     = <fs_campo_key_out>.

    <fs_field_key> = <fs_campo_key_out>.

    MODIFY <ti> INDEX idx FROM <wi>
    TRANSPORTING (ap_label_key).

  ENDLOOP.

ENDMETHOD.

METHOD GROUPBY.


  FIELD-SYMBOLS: <fs_field_group01> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group02> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group03> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group04> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group05> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group06> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group07> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group08> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_group09> TYPE ANY.
  FIELD-SYMBOLS: <fs_field_page> TYPE ANY.

  FIELD-SYMBOLS: <fs_grupo> TYPE zwdatatree.
  DATA: idx TYPE sytabix.

  DATA: conta_g TYPE i.

  FIELD-SYMBOLS: <ti> TYPE table.
  ASSIGN ao_nodetab->* TO <ti>.
***********************************

*****************************************
  DATA: node_result TYPE REF TO data.
  FIELD-SYMBOLS: <wi> TYPE ANY.
  CREATE DATA node_result TYPE (ap_i_struct_name).
  ASSIGN node_result->* TO <wi>.

******************************************

  DELETE at_group WHERE contain01 = space AND contain02 = space AND contain03 = space
  AND contain04 = space AND contain05 = space AND contain06 = space AND contain07 = space
  AND contain08 = space AND contain09 = space.

  SORT at_group BY contain01 contain02 contain03 contain04
  contain05 contain06 contain07 contain08 contain09.

  CONCATENATE ap_structure ap_last_field INTO ap_label_last_field.

*  read table at_grupo ASSIGNING <fs_grupo>
  conta_g = 0.
  IF ap_group = 'X'.
    LOOP AT at_group ASSIGNING <fs_grupo>.
      AT NEW (ap_last_field_cont).
        conta_g = conta_g + 1.
      ENDAT.
      <fs_grupo>-num_group = conta_g.
    ENDLOOP.
  ELSE.
    conta_g = 0.
    LOOP AT at_group ASSIGNING <fs_grupo>.
      conta_g = 1.
      <fs_grupo>-num_group = conta_g.
    ENDLOOP.
  ENDIF.

  LOOP AT <ti> INTO <wi>.
    idx = sy-tabix.

    ASSIGN (ap_field_group01) TO <fs_field_group01>.
    ASSIGN (ap_field_group02) TO <fs_field_group02>.
    ASSIGN (ap_field_group03) TO <fs_field_group03>.
    ASSIGN (ap_field_group04) TO <fs_field_group04>.
    ASSIGN (ap_field_group05) TO <fs_field_group05>.
    ASSIGN (ap_field_group06) TO <fs_field_group06>.
    ASSIGN (ap_field_group07) TO <fs_field_group07>.
    ASSIGN (ap_field_group08) TO <fs_field_group08>.
    ASSIGN (ap_field_group09) TO <fs_field_group09>.
    ASSIGN (ap_field_page) TO <fs_field_page>.

    IF at_group IS NOT INITIAL.
      READ TABLE at_group ASSIGNING <fs_grupo> WITH KEY contain01 = <fs_field_group01>
      contain02 = <fs_field_group02>
      contain03 = <fs_field_group03> contain04 = <fs_field_group04>
      contain05 = <fs_field_group05> contain06 = <fs_field_group06>
      contain07 = <fs_field_group07> contain08 = <fs_field_group08>
      contain09 = <fs_field_group09>.
      IF sy-subrc <= 2.
        <fs_field_page> = <fs_grupo>-num_group.
        MODIFY <ti> INDEX idx FROM <wi> TRANSPORTING (ap_label_page).
      ENDIF.
    ELSE.
      <fs_field_page> = 1.
      MODIFY <ti> INDEX idx FROM <wi> TRANSPORTING (ap_label_page).
    ENDIF.
  ENDLOOP.

ENDMETHOD.

METHOD OPEN_NODES_TREE.


  FIELD-SYMBOLS: <wmarked> TYPE lvc_nkey.
  FIELD-SYMBOLS: <t_nodetab> TYPE table.

  CLEAR ap_nodes_marked01.
  CLEAR at_nodes_marked02.
  CLEAR at_nodes_marked03.
  CLEAR at_marked.
  REFRESH at_nodes_marked01[].
  REFRESH at_nodes_marked02[].
  REFRESH at_nodes_marked03[].
  REFRESH at_marked[].

  ASSIGN ao_nodetab->* TO <t_nodetab>.

  ap_pulsac_open = ap_pulsac_open + 1.

  IF ap_pulsac_open = '01'.

    CALL METHOD ao_tree->expand_nodes
      EXPORTING
        it_node_key             = at_nodes_marked_header
      EXCEPTIONS
        failed                  = 1
        cntl_system_error       = 2
        error_in_node_key_table = 3
        dp_error                = 4
        node_not_found          = 5
        OTHERS                  = 6.

  ELSE.

    CALL METHOD ao_tree->get_expanded_nodes
      CHANGING
        ct_expanded_nodes = at_nodes_marked01
      EXCEPTIONS
        cntl_system_error = 1
        dp_error          = 2
        failed            = 3
        OTHERS            = 4.

    LOOP AT at_nodes_marked01 INTO ap_nodes_marked01.

      CALL METHOD ao_tree->get_children
        EXPORTING
          i_node_key         = ap_nodes_marked01
        IMPORTING
          et_children        = at_nodes_marked02
        EXCEPTIONS
          historic_error     = 1
          node_key_not_found = 2
          OTHERS             = 3.

** verifico si tiene hijos.
      LOOP AT at_nodes_marked02 ASSIGNING <wmarked>.
        CALL METHOD ao_tree->get_children
          EXPORTING
            i_node_key         = <wmarked>
          IMPORTING
            et_children        = at_marked
          EXCEPTIONS
            historic_error     = 1
            node_key_not_found = 2
            OTHERS             = 3.

        IF at_marked IS NOT INITIAL.
          APPEND <wmarked> TO at_nodes_marked03.
        ENDIF.

      ENDLOOP.

    ENDLOOP.

    CALL METHOD ao_tree->expand_nodes
      EXPORTING
        it_node_key             = at_nodes_marked03
      EXCEPTIONS
        failed                  = 1
        cntl_system_error       = 2
        error_in_node_key_table = 3
        dp_error                = 4
        node_not_found          = 5
        OTHERS                  = 6.

  ENDIF.

  ap_nodeheader = 1.

  CALL METHOD ao_tree->set_top_node
    EXPORTING
      i_node_key        = ap_nodeheader
    EXCEPTIONS
      cntl_system_error = 1
      node_not_found    = 2
      failed            = 3
      OTHERS            = 4.

ENDMETHOD.

METHOD CLOSE_NODES_TREE.


  ap_pulsac_open = '00'.
  CALL METHOD ao_tree->collapse_all_nodes
    EXCEPTIONS
      failed            = 1
      cntl_system_error = 2
      OTHERS            = 3.

  ap_nodeheader = 1.
  CALL METHOD ao_tree->set_top_node
    EXPORTING
      i_node_key        = ap_nodeheader
    EXCEPTIONS
      cntl_system_error = 1
      node_not_found    = 2
      failed            = 3
      OTHERS            = 4.

ENDMETHOD.

METHOD FREE_PROGRAM.

  CALL METHOD cl_gui_cfw=>flush
    EXCEPTIONS
      cntl_system_error = 1
      cntl_error        = 2
      OTHERS            = 3.

  CALL METHOD ao_tree->free
    EXCEPTIONS
      cntl_error        = 1
      cntl_system_error = 2
      OTHERS            = 3.

  CALL METHOD ao_container->free
    EXCEPTIONS
      cntl_error        = 1
      cntl_system_error = 2
      OTHERS            = 3.

  LEAVE TO SCREEN 0.

ENDMETHOD.

METHOD CHANGE_ICON.


  DATA: status_icon TYPE icons-text.

  CALL FUNCTION 'ICON_CREATE'
    EXPORTING
      name                  = p_item_image
      text                  = p_text
      info                  = p_text
      add_stdinf            = 'X'
    IMPORTING
      RESULT                = status_icon
    EXCEPTIONS
      icon_not_found        = 1
      outputfield_too_short = 2
      OTHERS                = 3.

  p_item_image = status_icon.

ENDMETHOD.

METHOD PRINT_NORMAL_TO_BOLD.


  FIELD-SYMBOLS: <ti> TYPE table.
  ASSIGN ao_nodetab->* TO <ti>.
***********************************

*****************************************
  DATA: node_result TYPE REF TO data.
  FIELD-SYMBOLS: <wi> TYPE ANY.
  CREATE DATA node_result TYPE (ap_i_struct_name).
  ASSIGN node_result->* TO <wi>.

  FIELD-SYMBOLS: <wi2> TYPE ANY.
  ASSIGN node_result->* TO <wi2>.
**********************************************

  FIELD-SYMBOLS: <fs_campo_type> TYPE ANY.
  FIELD-SYMBOLS: <fs_campo_clave> TYPE ANY.
  FIELD-SYMBOLS: <fs_campo_tscreen> TYPE ANY.

  CLEAR aw_layout_node.
  CLEAR aw_node_layout.

  LOOP AT <ti> INTO <wi2>.
    ASSIGN (ap_field_type) TO <fs_campo_type>.
    ASSIGN (ap_field_key) TO <fs_campo_clave>.
    ASSIGN (ap_field_tscreen) TO <fs_campo_tscreen>.

    IF <fs_campo_type> = p_nivel.

      ap_node_id_key = <fs_campo_clave>.

      CALL METHOD ao_tree->get_outtab_line
        EXPORTING
          i_node_key     = ap_node_id_key
        IMPORTING
          e_outtab_line  = <wi>
          es_node_layout = aw_layout_node
        EXCEPTIONS
          node_not_found = 1
          OTHERS         = 2.

      MOVE-CORRESPONDING aw_layout_node TO aw_node_layout.

      IF ( <fs_campo_tscreen> = 'X' ).
        aw_node_layout-style = cl_gui_column_tree=>style_emphasized.
        aw_node_layout-u_style = 'X'.
      ENDIF.

      CALL METHOD ao_tree->change_node
        EXPORTING
          i_node_key     = ap_node_id_key
          i_outtab_line  = <wi>
          is_node_layout = aw_node_layout
        EXCEPTIONS
          node_not_found = 1
          OTHERS         = 2.

    ENDIF.
  ENDLOOP.

ENDMETHOD.

METHOD PRINT_BOLD_TO_NORMAL.

  FIELD-SYMBOLS: <ti> TYPE table.
  ASSIGN ao_nodetab->* TO <ti>.
***********************************

*****************************************
  DATA: node_result TYPE REF TO data.
  FIELD-SYMBOLS: <wi> TYPE ANY.
  CREATE DATA node_result TYPE (ap_i_struct_name).
  ASSIGN node_result->* TO <wi>.

  FIELD-SYMBOLS: <wi2> TYPE ANY.
  ASSIGN node_result->* TO <wi2>.
**********************************************

  FIELD-SYMBOLS: <fs_campo_type> TYPE ANY.
  FIELD-SYMBOLS: <fs_campo_clave> TYPE ANY.
  FIELD-SYMBOLS: <fs_campo_tscreen> TYPE ANY.

  CLEAR aw_layout_node.
  CLEAR aw_node_layout.

  LOOP AT <ti> INTO <wi2>.
    ASSIGN (ap_field_type) TO <fs_campo_type>.
    ASSIGN (ap_field_key) TO <fs_campo_clave>.
    ASSIGN (ap_field_tscreen) TO <fs_campo_tscreen>.

    IF <fs_campo_type> = p_nivel.

      ap_node_id_key = <fs_campo_clave>.

      CALL METHOD ao_tree->get_outtab_line
        EXPORTING
          i_node_key     = ap_node_id_key
        IMPORTING
          e_outtab_line  = <wi>
          es_node_layout = aw_layout_node
        EXCEPTIONS
          node_not_found = 1
          OTHERS         = 2.

      MOVE-CORRESPONDING aw_layout_node TO aw_node_layout.

      IF ( <fs_campo_tscreen> = 'X' ).
        aw_node_layout-style = cl_gui_column_tree=>style_emphasized_c.
        aw_node_layout-u_style = 'X'.
      ENDIF.

      CALL METHOD ao_tree->change_node
        EXPORTING
          i_node_key     = ap_node_id_key
          i_outtab_line  = <wi>
          is_node_layout = aw_node_layout
        EXCEPTIONS
          node_not_found = 1
          OTHERS         = 2.

    ENDIF.
  ENDLOOP.

ENDMETHOD.

METHOD SAVE_NODE_CHECKED.


  FIELD-SYMBOLS: <ti> TYPE table.
  ASSIGN ao_nodetab->* TO <ti>.
***********************************

*****************************************
  DATA: node_result TYPE REF TO data.
  FIELD-SYMBOLS: <wi> TYPE ANY.
  CREATE DATA node_result TYPE (ap_i_struct_name).
  ASSIGN node_result->* TO <wi>.
*****************************************

  FIELD-SYMBOLS: <fs_campo_zsave> TYPE ANY.
  DATA idt TYPE sytabix.

  CLEAR aw_checked.
  REFRESH at_checked.

  CALL METHOD ao_tree->get_checked_items
    IMPORTING
      et_checked_items = at_checked.

  IF at_checked IS NOT INITIAL.
*
    LOOP AT at_checked INTO aw_checked.

      IF flag_g = 1.

** casilla grabacion

        READ TABLE <ti> INTO <wi> WITH KEY (ap_label_key) = aw_checked-nodekey.
        idt = sy-tabix.
        IF sy-subrc <= 2.
          ASSIGN (ap_field_zsave) TO <fs_campo_zsave>.
          <fs_campo_zsave> = 'X'.
          MODIFY <ti> INDEX idt FROM <wi> TRANSPORTING (ap_label_zsave).

          CALL METHOD cl_gui_cfw=>flush.
          CALL METHOD ao_tree->delete_subtree
            EXPORTING
              i_node_key = aw_checked-nodekey.

*   update frontend

          CALL METHOD ao_tree->frontend_update.

          PERFORM unlocked IN PROGRAM (ap_program) USING <wi> IF FOUND.
        ENDIF.
      ENDIF.
    ENDLOOP.
  ENDIF.

ENDMETHOD.

METHOD SAVE_NODE_SELECT.


  FIELD-SYMBOLS: <ti> TYPE table.
  ASSIGN ao_nodetab->* TO <ti>.
***********************************

*****************************************
  DATA: node_result TYPE REF TO data.
  FIELD-SYMBOLS: <wi> TYPE ANY.
  CREATE DATA node_result TYPE (ap_i_struct_name).
  ASSIGN node_result->* TO <wi>.
*****************************************

  FIELD-SYMBOLS: <fs_campo_zsave> TYPE ANY.
  DATA idt TYPE sytabix.

  CLEAR aw_selected.
  REFRESH at_selected.

  CALL METHOD ao_tree->get_selected_nodes
    CHANGING
      ct_selected_nodes = at_selected.

  IF at_selected IS NOT INITIAL.
*
    LOOP AT at_selected INTO aw_selected.

      IF flag_g = 1.

** casilla grabacion

        READ TABLE <ti> INTO <wi> WITH KEY (ap_label_key) = aw_selected-node_key.
        idt = sy-tabix.
        IF sy-subrc <= 2.
          ASSIGN (ap_field_zsave) TO <fs_campo_zsave>.
          <fs_campo_zsave> = 'X'.
          MODIFY <ti> INDEX idt FROM <wi> TRANSPORTING (ap_label_zsave).

          CALL METHOD cl_gui_cfw=>flush.
          CALL METHOD ao_tree->delete_subtree
            EXPORTING
              i_node_key = aw_selected-node_key.

*   update frontend

          CALL METHOD ao_tree->frontend_update.

          PERFORM unlocked IN PROGRAM (ap_program) USING <wi> IF FOUND.
        ENDIF.
      ENDIF.
    ENDLOOP.
  ENDIF.

ENDMETHOD.

METHOD LAYOUT_NIVEL_TEXT.


  CLEAR aw_all_layout.
  aw_all_layout-type = 'T'.  "texto
  aw_all_layout-key_node = p_key.
  aw_all_layout-node_text = p_node_text.

  APPEND aw_all_layout TO at_all_layout.

ENDMETHOD.

METHOD LAYOUT_NIVEL_NODE.


  CLEAR aw_all_layout.

  aw_all_layout-type = 'N'.  "nodo
  aw_all_layout-key_node = p_key.
  aw_all_layout-hidden = p_hidden.
  aw_all_layout-disabled = p_disabled.
  aw_all_layout-isfolder = p_isfolder.
  aw_all_layout-n_image = p_n_image.
  aw_all_layout-exp_image = p_exp_image.
  aw_all_layout-style = p_style.
  aw_all_layout-last_hitem = p_last_hitem.
  aw_all_layout-no_branch = p_no_branch.
  aw_all_layout-expander = p_expander.
  aw_all_layout-dragdropid = p_dragdropid.

  APPEND aw_all_layout TO at_all_layout.

ENDMETHOD.

METHOD LAYOUT_NIVEL_ITEM.


  CLEAR aw_all_layout.

  aw_all_layout-type = 'I'.  "items
  aw_all_layout-key_node = p_key.
  aw_all_layout-fieldname = p_fieldname.
  aw_all_layout-class = p_class.
  aw_all_layout-font = p_font.
  aw_all_layout-disabled = p_disabled.
  aw_all_layout-editable = p_editable.
  aw_all_layout-hidden = p_hidden.
  aw_all_layout-alignment = p_alignment.
  aw_all_layout-t_image = p_t_image.
  aw_all_layout-chosen = p_chosen.
  aw_all_layout-togg_right = p_togg_right.
  aw_all_layout-style = p_style.

  APPEND aw_all_layout TO at_all_layout.

ENDMETHOD.

METHOD DISPLAY_GRAPHIC.


  FIELD-SYMBOLS: <ti> TYPE table.
  ASSIGN ao_nodetab->* TO <ti>.
*****************************************
  DATA: node_result TYPE REF TO data.
  FIELD-SYMBOLS: <wi> TYPE ANY.
  CREATE DATA node_result TYPE (ap_i_struct_name).
  ASSIGN node_result->* TO <wi>.

  DATA: ta TYPE REF TO data.
  FIELD-SYMBOLS: <tax> TYPE table.
  CREATE DATA ta TYPE TABLE OF (ap_i_struct_name).
  ASSIGN ta->* TO <tax>.

  REFRESH <tax>.
  LOOP AT <ti> INTO <wi>.
    APPEND <wi> TO <tax>.
  ENDLOOP.

  DATA: tcol_sel TYPE lvc_t_fnam.
  FIELD-SYMBOLS: <fs_col_sel> TYPE lvc_fname.
  REFRESH tcol_sel.
  CALL METHOD ao_tree->get_selected_columns
    IMPORTING
      et_sel_columns = tcol_sel
    EXCEPTIONS
      dp_error       = 1
      failed         = 2
      OTHERS         = 3.

  DATA: c TYPE i.
  FIELD-SYMBOLS: <fs_fieldcatalog> TYPE lvc_s_fcat.
  DATA: col_pos TYPE string.
  DATA: new_ap_field_graphics TYPE string.
  CLEAR new_ap_field_graphics.

  DESCRIBE TABLE tcol_sel LINES c.
  IF c > 0.
    LOOP AT tcol_sel ASSIGNING <fs_col_sel>.
      CLEAR col_pos.
      READ TABLE at_fieldcatalog ASSIGNING <fs_fieldcatalog>
      WITH KEY fieldname = <fs_col_sel>.
      IF sy-subrc <= 2.
        col_pos = <fs_fieldcatalog>-col_pos.
        CONCATENATE new_ap_field_graphics ',' col_pos INTO new_ap_field_graphics.
      ENDIF.
    ENDLOOP.
    ap_field_graphics = new_ap_field_graphics.
  ELSE.
  ENDIF.
*******************************************************************

  CALL METHOD zcl_alv_tree_mainp=>build_graphics
    EXPORTING
      p_field_graph = ap_field_graphics
      p_nodetab2    = ta
      p_nivel       = ap_nivel_graphics
      p_num_button  = '01'
      p_collect     = ap_collect_graphics.

*******************************************************************
  DATA: etiq_at_fieldcatalog_graphic TYPE string.
  DATA: etiq_at_it_columns TYPE string.
  DATA: etiq_at_it_rows TYPE string.
  DATA: etiq_at_nodetab_graph TYPE string.

  FIELD-SYMBOLS: <fs_at_fieldcatalog_graphic> TYPE lvc_t_fcat.
  FIELD-SYMBOLS: <fs_at_it_columns> TYPE lvc_t_fnam.
  FIELD-SYMBOLS: <fs_at_it_rows> TYPE lvc_t_roid.
  FIELD-SYMBOLS: <fs_at_nodetab_graph> TYPE table.

  CONCATENATE ap_field_fcg p_num_button INTO etiq_at_fieldcatalog_graphic.
  ASSIGN (etiq_at_fieldcatalog_graphic) TO <fs_at_fieldcatalog_graphic>.

  CONCATENATE ap_field_col p_num_button INTO etiq_at_it_columns.
  ASSIGN (etiq_at_it_columns) TO <fs_at_it_columns>.

  CONCATENATE ap_tfield_row  p_num_button INTO etiq_at_it_rows.
  ASSIGN (etiq_at_it_rows) TO <fs_at_it_rows>.

  CONCATENATE ap_field_ng p_num_button  '->*' INTO etiq_at_nodetab_graph.
  ASSIGN (etiq_at_nodetab_graph) TO <fs_at_nodetab_graph>.

  IF <fs_at_nodetab_graph> IS ASSIGNED.
    CREATE OBJECT ao_graphic
      EXPORTING
        it_fieldcatalog        = <fs_at_fieldcatalog_graphic>
        it_outtab              = <fs_at_nodetab_graph>
        it_columns             = <fs_at_it_columns>
        it_rows                = <fs_at_it_rows>
      EXCEPTIONS
        error_create_dialogbox = 1
        error_create_dc        = 2
        error_init_dc          = 3
        error_init_gp          = 4
        error_fill_dc          = 5
        OTHERS                 = 6.
  ENDIF.
ENDMETHOD.

METHOD EXPORT_TO_EXCEL.


  DATA: ruta_arch TYPE string.
  DATA: ruta_comp_arch TYPE string.
  DATA: tabla_campos_excel TYPE ztydatafile.
  DATA: mascara TYPE char255.
  DATA: col_mascara TYPE c.
  DATA: p_answer TYPE c.
  DATA: p_key TYPE lvc_nkey.
  DATA: idx TYPE i.

  CLEAR ruta_arch.
  CLEAR ruta_comp_arch.
  CLEAR mascara.
  CLEAR col_mascara.
  CLEAR tabla_campos_excel.
  REFRESH tabla_campos_excel[].

  FIELD-SYMBOLS: <ti> TYPE table.
  FIELD-SYMBOLS: <fs> TYPE ANY.
  FIELD-SYMBOLS: <fs5> TYPE ANY.
  FIELD-SYMBOLS: <fs5t> TYPE ANY.

  DATA: w_node_ex TYPE REF TO data.
  DATA: w_node_ex2 TYPE REF TO data.

  FIELD-SYMBOLS: <wi> TYPE ANY.
  FIELD-SYMBOLS: <wi5> TYPE ANY.
  FIELD-SYMBOLS: <fstix> TYPE ANY.

  CREATE DATA w_node_ex TYPE (ap_i_struct_name_graphic).
  ASSIGN w_node_ex->* TO <wi>.
  CREATE DATA w_node_ex2 TYPE (ap_i_struct_name_graphic).
  ASSIGN w_node_ex2->* TO <wi5>.

  FIELD-SYMBOLS: <ti5> TYPE table.
  DATA: atx TYPE REF TO data.
  CREATE DATA atx TYPE TABLE OF (ap_i_struct_name_graphic).
  ASSIGN atx->* TO <ti5>.

  FIELD-SYMBOLS: <ti6> TYPE table.
  DATA: aty TYPE REF TO data.
  CREATE DATA aty TYPE TABLE OF (ap_i_struct_name_graphic).
  ASSIGN aty->* TO <ti6>.

  ap_nivel_excel = ap_nivel_graphics.

  DATA: tcol_sel TYPE lvc_t_fnam.
  FIELD-SYMBOLS: <fs_col_sel> TYPE lvc_fname.
  REFRESH tcol_sel.
  CALL METHOD ao_tree->get_selected_columns
    IMPORTING
      et_sel_columns = tcol_sel
    EXCEPTIONS
      dp_error       = 1
      failed         = 2
      OTHERS         = 3.

  DATA: c TYPE i.
  FIELD-SYMBOLS: <fs_fieldcatalog> TYPE lvc_s_fcat.
  DATA: col_pos TYPE string.
  DATA: new_ap_field_excel TYPE string.
  CLEAR new_ap_field_excel.

  DESCRIBE TABLE tcol_sel LINES c.
  IF c > 0.

    DATA: lt_fcexcel TYPE lvc_t_fcat.
    FIELD-SYMBOLS: <fs_fcexcel> TYPE lvc_s_fcat.

    CLEAR lt_fcexcel.
    REFRESH lt_fcexcel[].

    CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
      EXPORTING
        i_structure_name = ap_i_struct_name
      CHANGING
        ct_fieldcat      = lt_fcexcel.

    LOOP AT tcol_sel ASSIGNING <fs_col_sel>.
      CLEAR col_pos.
      READ TABLE lt_fcexcel ASSIGNING <fs_fieldcatalog>
      WITH KEY fieldname = <fs_col_sel>.
      IF sy-subrc <= 2.
        col_pos = <fs_fieldcatalog>-col_pos.
        CONCATENATE new_ap_field_excel ',' col_pos INTO new_ap_field_excel.
      ENDIF.
    ENDLOOP.
    ap_field_out_excel = new_ap_field_excel.
  ELSE.
  ENDIF.

  IF ap_field_out_excel IS INITIAL.
  ELSE.
    APPEND ap_field_out_excel TO tabla_campos_excel.

    CALL METHOD zcl_alv_tree_mainp=>define_mask
      EXPORTING
        p_tabla_i = tabla_campos_excel
      IMPORTING
        p_mascara = mascara.

    col_mascara = 'X'.
  ENDIF.

  ASSIGN ao_nodetab->* TO <ti>.

** 13-02-12
** verificamos.. lo que está escondido x pantalla no sale
  REFRESH <ti5>.
  LOOP AT <ti> INTO <wi>.
    MOVE-CORRESPONDING <wi> TO <wi5>.
    APPEND <wi5> TO <ti5>.
  ENDLOOP.

  <ti6> = <ti5>.

  LOOP AT <ti6> INTO <wi5>.
    idx = sy-tabix.
    ASSIGN (ap_field_key5) TO <fs5>.
    ASSIGN (ap_field_type5) TO <fs5t>.

    p_key = <fs5>.
    CLEAR p_answer.
    CALL METHOD zcl_alv_tree_mainp=>is_hidden
      EXPORTING
        p_key    = p_key
      IMPORTING
        p_answer = p_answer.

    IF p_answer = 'X'.
      READ TABLE <ti5> ASSIGNING <fstix> WITH KEY (ap_label_key) = p_key.
      IF sy-subrc <= 2.
        idx = sy-tabix.
        DELETE <ti5> INDEX idx.
      ENDIF.
    ELSE.
      IF <fs5t> = ap_nivel_excel OR ap_nivel_excel = 0.
      ELSE.
        READ TABLE <ti5> ASSIGNING <fstix> WITH KEY (ap_label_key) = p_key.
        IF sy-subrc <= 2.
          idx = sy-tabix.
          DELETE <ti5> INDEX idx.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.

  IF <ti5> IS ASSIGNED.

    CALL FUNCTION 'ZHR_GET_NAME'
      IMPORTING
        name_file_out = ap_name_file_excel.

    CALL METHOD cl_gui_frontend_services=>directory_browse
      EXPORTING
        window_title         = 'Elija el directorio donde va a grabar el archivo'
      CHANGING
        selected_folder      = ruta_arch
      EXCEPTIONS
        cntl_error           = 1
        error_no_gui         = 2
        not_supported_by_gui = 3
        OTHERS               = 4.

    IF sy-subrc <> 0.
      MESSAGE ID 'ZHRMSG' TYPE 'I' NUMBER '131'.
    ENDIF.

    IF ruta_arch = space.
      ruta_arch = 'C:'.
    ENDIF.

    IF ap_name_file_excel IS INITIAL.
      ap_name_file_excel = '\ARCHIVO.XLS'.
    ELSE.
      CONCATENATE '\' ap_name_file_excel '.XLS' INTO ap_name_file_excel.
    ENDIF.

    CONCATENATE ruta_arch ap_name_file_excel INTO ruta_comp_arch.

    mascara = mascara+1(254).
    CALL METHOD cl_gui_frontend_services=>gui_download
      EXPORTING
        filename                = ruta_comp_arch
        filetype                = 'DAT'
        col_select              = col_mascara
        col_select_mask            = mascara
      CHANGING
        data_tab                = <ti5>
      EXCEPTIONS
        file_write_error        = 1
        no_batch                = 2
        gui_refuse_filetransfer = 3
        invalid_type            = 4
        no_authority            = 5
        unknown_error           = 6
        header_not_allowed      = 7
        separator_not_allowed   = 8
        filesize_not_allowed    = 9
        header_too_long         = 10
        dp_error_create         = 11
        dp_error_send           = 12
        dp_error_write          = 13
        unknown_dp_error        = 14
        access_denied           = 15
        dp_out_of_memory        = 16
        disk_full               = 17
        dp_timeout              = 18
        file_not_found          = 19
        dataprovider_exception  = 20
        control_flush_error     = 21
        not_supported_by_gui    = 22
        error_no_gui            = 23
        OTHERS                  = 24.

    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      MESSAGE ID 'ZHRMSG' TYPE 'I' NUMBER 504.

    ENDIF.

  ENDIF.
ENDMETHOD.

METHOD BUILD_GRAPHICS.


  DATA: idt TYPE sytabix.
  DATA: ptabla TYPE ztydatafile.
  DATA: p_tab_campo_grafico TYPE ztydatafile.
  FIELD-SYMBOLS: <fs_p_tab_campo_grafico> TYPE zwdatafile.
  FIELD-SYMBOLS: <fs_at_fieldcatalog> TYPE lvc_s_fcat.
  DATA: c TYPE i.
  DATA: c2 TYPE i.

  DATA: etiq_t_fieldcatalog_g TYPE string.
  DATA: etiq_t_columns_g TYPE string.
  DATA: etiq_t_rows_g TYPE string.
  DATA: etiq_w_rows_g TYPE string.
  DATA: etiq_at_nodetab_graph TYPE string.

  FIELD-SYMBOLS: <fs_t_cat_g> TYPE lvc_t_fcat.
  FIELD-SYMBOLS: <fs_t_row_g> TYPE lvc_t_roid.
  FIELD-SYMBOLS: <fs_w_row_g> TYPE lvc_s_roid.
  FIELD-SYMBOLS: <fs_t_col_g> TYPE lvc_t_fnam.
  FIELD-SYMBOLS: <fs_at_nodetab_graph> TYPE table.

  DATA: etiq_campo TYPE string.
  DATA: var TYPE char1024.
  FIELD-SYMBOLS: <fs_etiq_campo> TYPE ANY.
  DATA: etiq_type TYPE string.
  FIELD-SYMBOLS: <fs_wgr> TYPE ANY.

  DATA: wlayout TYPE lvc_s_lacn.
  DATA: wnodekey TYPE lvc_nkey.
  DATA: wlayout_node TYPE lvc_s_layn.
  FIELD-SYMBOLS: <fs_key> TYPE ANY.
  DATA: tnodekey TYPE lvc_t_nkey.
  DATA: ti_tnodekey TYPE lvc_t_nkey.
  FIELD-SYMBOLS: <fs_ti_tnodekey> TYPE lvc_nkey.

********************************************************************
  CLEAR p_tab_campo_grafico.
  REFRESH p_tab_campo_grafico[].

  CLEAR ptabla.
  REFRESH ptabla[].

  APPEND p_field_graph TO ptabla.

  IF p_field_graph IS NOT INITIAL.
    CALL METHOD zcl_alv_tree_mainp=>frag_pattern
      EXPORTING
        ps_separador         = ','
        ps_nombre_estructura = 'ZWDATAFILE'
        pt_tabla_i           = ptabla
      IMPORTING
        lt_trama_o           = p_tab_campo_grafico.
  ENDIF.

  ao_nodetab3 = p_nodetab2.

  CONCATENATE ap_field_fcg p_num_button INTO etiq_t_fieldcatalog_g.
  ASSIGN (etiq_t_fieldcatalog_g) TO <fs_t_cat_g>.

  CONCATENATE ap_field_col p_num_button INTO etiq_t_columns_g.
  ASSIGN (etiq_t_columns_g) TO <fs_t_col_g>.

  CONCATENATE ap_tfield_row p_num_button INTO etiq_t_rows_g.
  ASSIGN (etiq_t_rows_g) TO <fs_t_row_g>.

  CONCATENATE ap_wfield_row p_num_button INTO etiq_w_rows_g.
  ASSIGN (etiq_w_rows_g) TO <fs_w_row_g>.

  REFRESH <fs_t_cat_g>.
  REFRESH <fs_t_col_g>.
  REFRESH <fs_t_row_g>.

  <fs_t_cat_g> = at_fieldcatalog.

  FIELD-SYMBOLS: <ti> TYPE table.
  ASSIGN ao_nodetab3->* TO <ti>.

  DATA: w_node_gr TYPE REF TO data.
  FIELD-SYMBOLS: <wi> TYPE ANY.
  CREATE DATA w_node_gr TYPE (ap_i_struct_name_graphic).
  ASSIGN w_node_gr->* TO <wi>.

  FIELD-SYMBOLS: <wix> TYPE ANY.

  DATA: tab TYPE REF TO data.
  FIELD-SYMBOLS: <fstab> TYPE table.
  CREATE DATA tab TYPE TABLE OF (ap_i_struct_name_graphic).
  ASSIGN tab->* TO <fstab>.

  <fstab> = <ti>.

  IF p_nivel IS NOT INITIAL.

    LOOP AT <fstab> INTO <wi>.
      ASSIGN (ap_field_type) TO <fs_wgr>.

      CLEAR wlayout_node.
      CLEAR wlayout.

      ASSIGN (ap_field_key) TO <fs_key>.
      wnodekey = <fs_key>.

      CALL METHOD ao_tree->get_outtab_line
        EXPORTING
          i_node_key     = wnodekey
        IMPORTING
          e_outtab_line  = <wi>
          es_node_layout = wlayout_node
        EXCEPTIONS
          node_not_found = 1
          OTHERS         = 2.

      MOVE-CORRESPONDING wlayout_node TO wlayout.

      IF ( <fs_wgr> = p_nivel AND  wlayout-hidden = ' ' ) OR p_nivel = 0.
      ELSE.
        READ TABLE <ti> ASSIGNING <wix> WITH KEY (ap_label_key) = wnodekey.
        IF sy-subrc <= 2.
          idt = sy-tabix.
          DELETE <ti> INDEX idt.
        ENDIF.
      ENDIF.
*      READ TABLE ti_tnodekey FROM wnodekey  ASSIGNING <fs_ti_tnodekey>.
*      IF sy-subrc <= 2.
*        DELETE <ti> INDEX idt.
*      ENDIF.

    ENDLOOP.

  ENDIF.

  LOOP AT <fs_t_cat_g> ASSIGNING <fs_at_fieldcatalog>.
    var = <fs_at_fieldcatalog>-col_pos.
    CONDENSE var.

    IF p_field_graph IS NOT INITIAL.

      READ TABLE p_tab_campo_grafico ASSIGNING <fs_p_tab_campo_grafico>
      WITH KEY line = var.

      IF sy-subrc <= 2.
        APPEND <fs_at_fieldcatalog>-fieldname TO <fs_t_col_g>.
        <fs_at_fieldcatalog>-no_out = ''.

      ELSE.
        LOOP AT <ti> INTO <wi>.
          idt = sy-tabix.
          CONCATENATE ap_structure <fs_at_fieldcatalog>-fieldname INTO etiq_campo.
          ASSIGN (etiq_campo) TO <fs_etiq_campo>.
          <fs_etiq_campo> = space.
          MODIFY <ti> INDEX idt FROM <wi>
            TRANSPORTING (<fs_at_fieldcatalog>-fieldname).

          <fs_at_fieldcatalog>-no_out = 'X'.
        ENDLOOP.
      ENDIF.

    ELSE.
      APPEND <fs_at_fieldcatalog>-fieldname TO <fs_t_col_g>.
    ENDIF.
  ENDLOOP.

** collect
  FIELD-SYMBOLS: <tgra> TYPE table.
  DATA: at_node TYPE REF TO data.
  CREATE DATA at_node TYPE TABLE OF (ap_i_struct_name_graphic).
  ASSIGN at_node->* TO <tgra>.

  IF p_collect = 'X'.

    LOOP AT <ti> INTO <wi>.
      COLLECT <wi> INTO <tgra>.
    ENDLOOP.
  ELSE.
    <tgra> = <ti>.
  ENDIF.

** new - 25-11-09 -> ojo -> ordena la ultima hoja
  IF p_collect = 'X'.

*    SORT <tgra> BY
*    (ap_field_sort01) (ap_field_sort02) (ap_field_sort03) (ap_field_sort04)
*    (ap_field_sort05) (ap_field_sort06) (ap_field_sort07) (ap_field_sort08) (ap_field_sort09)
*    (ap_field_sort_tkey).

  ENDIF.
*************************************************

  IF p_num_button = '01'.
    ao_nodetab_graph01 = at_node.
  ELSEIF p_num_button = '02'.
    ao_nodetab_graph02 = at_node.
  ENDIF.

  DESCRIBE TABLE <tgra>  LINES c.

  DO c TIMES.
    ADD 1 TO c2.
    <fs_w_row_g>-row_id = c2.
    <fs_w_row_g>-sub_row_id = 0.
    APPEND <fs_w_row_g> TO <fs_t_row_g>.
  ENDDO.

ENDMETHOD.

METHOD BUILD_EXCEL.


  DATA: etiq_type TYPE string.
  DATA: idx TYPE sytabix.

  ao_nodetab5    = p_nodetab3.

  FIELD-SYMBOLS: <ti> TYPE table.
  FIELD-SYMBOLS: <fs_ti> TYPE ANY.
  FIELD-SYMBOLS: <fs_ti2> TYPE ANY.

  ASSIGN ao_nodetab5->* TO <ti>.

  DATA: w_node_ex TYPE REF TO data.
  FIELD-SYMBOLS: <wi> TYPE ANY.
  CREATE DATA w_node_ex TYPE (ap_i_struct_name_graphic).
  ASSIGN w_node_ex->* TO <wi>.

  IF p_nivel IS NOT INITIAL.
    LOOP AT <ti> INTO <wi>.
      idx = sy-tabix.
      ASSIGN (ap_field_type) TO <fs_ti>.
      IF <fs_ti> = p_nivel.
      ELSE.
        DELETE <ti> INDEX idx.
      ENDIF.
    ENDLOOP.
  ENDIF.

ENDMETHOD.

METHOD ASSIGN_BY_GROUP.

  DATA: conta(2) TYPE n.
  DATA: ptabla TYPE ztydatafile.
  DATA: p_tab_agrup_campo TYPE ztydatafile.
  FIELD-SYMBOLS: <fs_p_tab_agrup_campo> TYPE zwdatafile.
  FIELD-SYMBOLS: <fs_at_fieldcatalog> TYPE lvc_s_fcat.
  DATA: etiq_valida TYPE dynfnam.
  FIELD-SYMBOLS: <fs_etiq_valida> TYPE dynfnam.

  CLEAR p_tab_agrup_campo.
  REFRESH p_tab_agrup_campo[].

  CLEAR ptabla.
  REFRESH ptabla[].

  IF p_agroup_field IS NOT INITIAL.
    APPEND p_agroup_field TO ptabla.
    CALL METHOD zcl_alv_tree_mainp=>frag_pattern
      EXPORTING
        ps_separador         = ','
        ps_nombre_estructura = 'ZWDATAFILE'
        pt_tabla_i           = ptabla
      IMPORTING
        lt_trama_o           = p_tab_agrup_campo.

    conta = 0.
    LOOP AT p_tab_agrup_campo ASSIGNING <fs_p_tab_agrup_campo>.

      READ TABLE at_fieldcatalog ASSIGNING <fs_at_fieldcatalog>
      WITH KEY col_pos = <fs_p_tab_agrup_campo>-line.
      IF sy-subrc <= 2.
        conta = conta + 1.
        CONCATENATE ap_label_agroup_field  conta INTO etiq_valida.
        ASSIGN (etiq_valida) TO <fs_etiq_valida>.
        <fs_etiq_valida> = <fs_at_fieldcatalog>-fieldname.
      ENDIF.

      IF conta = '09'.
        EXIT.
      ENDIF.
    ENDLOOP.
  ENDIF.

ENDMETHOD.

METHOD ASSIGN_BY_SCREEN.

  DATA: conta(2) TYPE n.
  DATA: ptabla TYPE ztydatafile.
  DATA: p_tab_screen_campo TYPE ztydatafile.
  FIELD-SYMBOLS: <fs_p_tab_screen_campo> TYPE zwdatafile.
  DATA: etiq_valida TYPE dynfnam.
  FIELD-SYMBOLS: <fs_etiq_valida> TYPE dynfnam.

  CLEAR p_tab_screen_campo.
  REFRESH p_tab_screen_campo[].

  CLEAR ptabla.
  REFRESH ptabla[].

  IF p_screen_field IS NOT INITIAL.
    APPEND p_screen_field TO ptabla.

    CALL METHOD zcl_alv_tree_mainp=>frag_pattern
      EXPORTING
        ps_separador         = ','
        ps_nombre_estructura = 'ZWDATAFILE'
        pt_tabla_i           = ptabla
      IMPORTING
        lt_trama_o           = p_tab_screen_campo.

    conta = 0.
    LOOP AT p_tab_screen_campo ASSIGNING <fs_p_tab_screen_campo>.
      conta = conta + 1.
      CONCATENATE ap_label_screen_field conta INTO etiq_valida.
      ASSIGN (etiq_valida) TO <fs_etiq_valida>.
      <fs_etiq_valida> = <fs_p_tab_screen_campo>-line.

      IF conta = '09'.
        EXIT.
      ENDIF.
    ENDLOOP.
  ENDIF.

ENDMETHOD.

METHOD DELETE_NIVEL.


  DATA: idx TYPE sytabix.
  DATA: idx2 TYPE sytabix.
  FIELD-SYMBOLS : <fs> TYPE ANY.
  DATA: e TYPE lvc_nkey.
  DATA: y TYPE num2.
  DATA: nodo TYPE zwassign.
  FIELD-SYMBOLS : <fs_min_nivel> TYPE zwassign.

  CALL METHOD zcl_alv_tree_mainp=>assign_by_nivel
    EXPORTING
      p_nivel = p_nivel.

  ao_nodetab_nivel = p_nodetab.

***************************************************************************************

  FIELD-SYMBOLS: <ti> TYPE table.
  ASSIGN ao_nodetab_nivel->* TO <ti>.
***********************************

  DATA: tb TYPE REF TO data.
  FIELD-SYMBOLS: <fstb> TYPE table.
  FIELD-SYMBOLS: <wix> TYPE ANY.
  CREATE DATA tb TYPE TABLE OF (ap_i_struct_name).
  ASSIGN tb->* TO <fstb>.

*****************************************
  DATA: node_result TYPE REF TO data.
  FIELD-SYMBOLS: <wi> TYPE ANY.
  CREATE DATA node_result TYPE (p_structure).
  ASSIGN node_result->* TO <wi>.
******************************************************************************************

  <fstb> = <ti>.

  LOOP AT <ti> INTO <wi>.
    idx = sy-tabix.
    e = idx.
    ASSIGN (ap_field_type) TO <fs>.
    IF <fs> = ap_nivel_field01 OR <fs> = ap_nivel_field02 OR <fs> = ap_nivel_field03 OR <fs> = ap_nivel_field04
    OR <fs> = ap_nivel_field05 OR <fs> = ap_nivel_field06 OR <fs> = ap_nivel_field07 OR <fs> = ap_nivel_field08
    OR <fs> = ap_nivel_field09.
      DELETE at_all_layout WHERE key_node = e.
    ENDIF.
  ENDLOOP.

** borro las "divisiones"
  LOOP AT <fstb> INTO <wi>.
    ASSIGN (ap_field_type) TO <fs>.
    IF <fs> = ap_nivel_field01 OR <fs> = ap_nivel_field02 OR <fs> = ap_nivel_field03 OR <fs> = ap_nivel_field04
    OR <fs> = ap_nivel_field05 OR <fs> = ap_nivel_field06 OR <fs> = ap_nivel_field07 OR <fs> = ap_nivel_field08
    OR <fs> = ap_nivel_field09.

      READ TABLE <ti> ASSIGNING <wix> WITH KEY (ap_label_type) = <fs>.
      IF sy-subrc <= 2.
        idx = sy-tabix.
        DELETE <ti> INDEX idx.
      ENDIF.
    ENDIF.
  ENDLOOP.

  LOOP AT <ti> INTO <wi>.
    idx = sy-tabix.
    ASSIGN (ap_field_type) TO <fs>.
    nodo = <fs>.
    COLLECT nodo INTO at_min_nivel.
  ENDLOOP.
*
  SORT at_min_nivel ASCENDING.

  y = '00'.
  LOOP AT at_min_nivel ASSIGNING <fs_min_nivel>.
    y = y + 1.
    <fs_min_nivel>-equivalent = y.
  ENDLOOP.

  LOOP AT <ti> INTO <wi>.
    idx = sy-tabix.
    ASSIGN (ap_field_type) TO <fs>.

    READ TABLE at_min_nivel ASSIGNING <fs_min_nivel> WITH KEY
    node = <fs>.
    IF sy-subrc <= 2.
      <fs> = <fs_min_nivel>-equivalent.
      MODIFY <ti> INDEX idx FROM <wi>.
    ENDIF.

  ENDLOOP.

** reasigno layouts
  FIELD-SYMBOLS: <fs_lay> TYPE zwitem_layout.
  DATA: r TYPE i.
  DATA: c1 TYPE lvc_nkey.

  DO p_conta TIMES.
    c1 = c1 + 1.
    READ TABLE at_all_layout ASSIGNING <fs_lay> WITH KEY key_node = c1.
    IF sy-subrc <= 2.
      r = r + 1.
      <fs_lay>-key_node = r.

      MODIFY at_all_layout FROM <fs_lay> TRANSPORTING key_node WHERE key_node = c1.

    ENDIF.
  ENDDO.

** busco los padres
  LOOP AT <ti> INTO <wi>.
    idx = sy-tabix.
    c1 = idx.
    ASSIGN (ap_field_type) TO <fs>.

    IF <fs> = '01'.
      LOOP AT at_all_layout ASSIGNING <fs_lay> WHERE key_node = c1.
        idx2 = sy-tabix.
        IF <fs_lay>-type = 'N'.
          <fs_lay>-hidden = 'X'.
          <fs_lay>-fieldname = space.
        ELSEIF <fs_lay>-type = 'I'.
          <fs_lay>-hidden = space.
          <fs_lay>-fieldname = ao_tree->c_hierarchy_column_name.
        ENDIF.
        MODIFY at_all_layout FROM <fs_lay> INDEX idx2.
      ENDLOOP.
    ENDIF.

  ENDLOOP.

ENDMETHOD.

METHOD ASSIGN_BY_NIVEL.


  DATA: conta(2) TYPE n.
  DATA: ptabla TYPE ztydatafile.
  DATA: p_tab_nivel TYPE ztydatafile.
  FIELD-SYMBOLS: <fs_p_tab_nivel> TYPE zwdatafile.
  FIELD-SYMBOLS: <fs_at_fieldcatalog> TYPE lvc_s_fcat.
  DATA: etiq_valida TYPE dynfnam.
  FIELD-SYMBOLS: <fs_etiq_valida> TYPE dynfnam.

  CLEAR p_tab_nivel.
  REFRESH p_tab_nivel[].

  CLEAR ptabla.
  REFRESH ptabla[].

  IF p_nivel IS NOT INITIAL.
    APPEND p_nivel TO ptabla.
    CALL METHOD zcl_alv_tree_mainp=>frag_pattern
      EXPORTING
        ps_separador         = ','
        ps_nombre_estructura = 'ZWDATAFILE'
        pt_tabla_i           = ptabla
      IMPORTING
        lt_trama_o           = p_tab_nivel.

    conta = 0.
    LOOP AT p_tab_nivel ASSIGNING <fs_p_tab_nivel>.
      conta = conta + 1.
      CONCATENATE ap_label_nivel_field conta INTO etiq_valida.
      ASSIGN (etiq_valida) TO <fs_etiq_valida>.
      <fs_etiq_valida> = <fs_p_tab_nivel>-line.

      IF conta = '09'.
        EXIT.
      ENDIF.
    ENDLOOP.

  ENDIF.

ENDMETHOD.

METHOD SORT_COLUMN.


  DATA: conta TYPE num.
  DATA: conta2 TYPE num.
  DATA: conta_esp TYPE num.
  DATA: idt TYPE sytabix.
  DATA: idx TYPE sytabix.
  DATA: idb TYPE sytabix.
  DATA: ida TYPE sytabix.
  DATA: etiq_label TYPE string.
  DATA: o TYPE int2.
  DATA: l TYPE num2.
  DATA: lt_selected_nodes TYPE lvc_t_nkey.
  DATA: ban TYPE i.
  DATA: lt_fathers TYPE lvc_t_nkey.
  FIELD-SYMBOLS: <fs_fathers> TYPE lvc_nkey.
  FIELD-SYMBOLS: <fs_fieldcatalog> TYPE lvc_s_fcat.
  DATA: new_ap_field_graphics TYPE string.
  DATA: new_ap_field_graphics2 TYPE string.
  DATA: col_pos TYPE string.

  FIELD-SYMBOLS: <ti> TYPE table.
  ASSIGN ao_nodetab->* TO <ti>.
***********************************

***13-02-12

  DATA: ta TYPE REF TO data.
  FIELD-SYMBOLS: <ti2> TYPE table.
  CREATE DATA ta TYPE TABLE OF (ap_i_struct_name).
  ASSIGN ta->* TO <ti2>.

  DATA: wnode_tab TYPE REF TO data.
  FIELD-SYMBOLS: <wi> TYPE ANY.
  CREATE DATA wnode_tab TYPE (ap_i_struct_name).
  ASSIGN wnode_tab->* TO <wi>.

  DATA: wnode_tab2 TYPE REF TO data.
  FIELD-SYMBOLS: <wi2> TYPE ANY.
  CREATE DATA wnode_tab2 TYPE (ap_i_struct_name).
  ASSIGN wnode_tab2->* TO <wi2>.

  DATA: wnode_tab3 TYPE REF TO data.
  FIELD-SYMBOLS: <wi3> TYPE ANY.
  CREATE DATA wnode_tab3 TYPE (ap_i_struct_name).
  ASSIGN wnode_tab3->* TO <wi3>.

  DATA: tb TYPE REF TO data.
  FIELD-SYMBOLS: <ti3> TYPE table.
  CREATE DATA tb TYPE TABLE OF (ap_i_struct_name).
  ASSIGN tb->* TO <ti3>.

  DATA: tc TYPE REF TO data.
  FIELD-SYMBOLS: <ti4> TYPE table.
  CREATE DATA tc TYPE TABLE OF (ap_i_struct_name).
  ASSIGN tc->* TO <ti4>.

  FIELD-SYMBOLS: <fskey2> TYPE ANY.
  DATA: p_answer TYPE c.
  DATA: p_key TYPE lvc_nkey.

  REFRESH <ti2>.

  LOOP AT <ti> INTO <wi>.
    MOVE-CORRESPONDING <wi> TO <wi2>.
    APPEND <wi2> TO <ti2>.
  ENDLOOP.

*********************************************
  FIELD-SYMBOLS: <fs> TYPE ANY.
  FIELD-SYMBOLS: <fs1> TYPE ANY.
  FIELD-SYMBOLS: <fs1a> TYPE zwtype.
  FIELD-SYMBOLS: <fs_type> TYPE ANY.
  FIELD-SYMBOLS: <fs_key> TYPE ANY.
  FIELD-SYMBOLS: <fs_type2> TYPE ANY.
  FIELD-SYMBOLS: <fs_key2> TYPE ANY.

  DATA: tcol_sel TYPE lvc_t_fnam.
  FIELD-SYMBOLS: <fs_col_sel> TYPE lvc_fname.
  FIELD-SYMBOLS: <fs_at_nodes_sorted> TYPE zwsort.
  FIELD-SYMBOLS: <fs_at_nodes_sortedm> TYPE zwsort.
  FIELD-SYMBOLS: <fs_at_nodes_sorted2> TYPE zwsort.
  FIELD-SYMBOLS: <fs_at_nodes_sortedx> TYPE zwsort.
  FIELD-SYMBOLS: <fs_last> TYPE zwsort.

  DATA: texp_nodes TYPE lvc_t_nkey.
  FIELD-SYMBOLS: <fs_texp_nodes> TYPE lvc_nkey.
  DATA: tnivel_nodos TYPE ztytype.
  FIELD-SYMBOLS: <fs_tnivel_nodos> TYPE zwtype.
  DATA: wnivel_nodos TYPE zwtype.

***********************************************

  REFRESH at_nodes_sorted.
  REFRESH at_nodes_sorted2.
  REFRESH at_nodes_sorted3.
  REFRESH at_nodes_sorted4.
  REFRESH lt_selected_nodes.
  REFRESH lt_fathers.
  REFRESH tcol_sel.

  CALL METHOD ao_tree->get_selected_columns
    IMPORTING
      et_sel_columns = tcol_sel
    EXCEPTIONS
      dp_error       = 1
      failed         = 2
      OTHERS         = 3.

  conta = '00'.
  LOOP AT tcol_sel ASSIGNING <fs_col_sel>.
    conta = conta + 1.
    CONCATENATE ap_label_field_sort conta INTO etiq_label.
    ASSIGN (etiq_label) TO <fs>.
    <fs> = <fs_col_sel>.
  ENDLOOP.

  IF <ti2> IS ASSIGNED.

    LOOP AT <ti2> INTO <wi2>.  "no ordenado
      idt = sy-tabix.
      ASSIGN (ap_field_key2) TO <fs_key2>.
      ASSIGN (ap_field_type2) TO <fs_type2>.

      CLEAR aw_nodes_sorted.
      aw_nodes_sorted-node = <fs_key2>.
      aw_nodes_sorted-type = <fs_type2>.

      CALL METHOD ao_tree->get_parent
        EXPORTING
          i_node_key        = <fs_key2>
        IMPORTING
          e_parent_node_key = aw_nodes_sorted-father.

      APPEND aw_nodes_sorted TO at_nodes_sorted4.
      COLLECT aw_nodes_sorted-father INTO lt_fathers.

    ENDLOOP.

    IF p_ucomm = '&ISU'.
      SORT <ti2> BY
      (ap_field_sort01) (ap_field_sort02) (ap_field_sort03) (ap_field_sort04)
      (ap_field_sort05) (ap_field_sort06) (ap_field_sort07) (ap_field_sort08) (ap_field_sort09)
      (ap_field_sort_tkey) ASCENDING.
    ELSE.
      SORT <ti2> DESCENDING BY
      (ap_field_sort01) (ap_field_sort02) (ap_field_sort03) (ap_field_sort04)
     (ap_field_sort05) (ap_field_sort06) (ap_field_sort07) (ap_field_sort08) (ap_field_sort09)
      (ap_field_sort_tkey) ASCENDING.
    ENDIF.

    LOOP AT <ti2> INTO <wi2>.   "ordenado
      idt = sy-tabix.
      ASSIGN (ap_field_key2) TO <fs_key2>.
      ASSIGN (ap_field_type2) TO <fs_type2>.

      CLEAR aw_nodes_sorted2.
      aw_nodes_sorted2-node = <fs_key2>.
      aw_nodes_sorted2-type = <fs_type2>.

      CALL METHOD ao_tree->get_parent
        EXPORTING
          i_node_key        = <fs_key2>
        IMPORTING
          e_parent_node_key = aw_nodes_sorted2-father.

      APPEND aw_nodes_sorted2 TO at_nodes_sorted3.

    ENDLOOP.

    conta = '00'.

    "evaluo cada padre

    LOOP AT lt_fathers ASSIGNING <fs_fathers>.

      REFRESH at_nodes_sorted.
      REFRESH at_nodes_sorted2.

      INSERT LINES OF at_nodes_sorted3 INTO TABLE at_nodes_sorted2.  "ordenado
      INSERT LINES OF at_nodes_sorted4 INTO TABLE at_nodes_sorted.   "no ordenado

      DELETE at_nodes_sorted2 WHERE father <> <fs_fathers>.
      DELETE at_nodes_sorted WHERE father <> <fs_fathers>.

      DESCRIBE TABLE at_nodes_sorted LINES o.

      LOOP AT at_nodes_sorted2 ASSIGNING <fs_at_nodes_sorted2>.  "ordenados
        idt = sy-tabix.

        READ TABLE at_nodes_sorted ASSIGNING <fs_at_nodes_sorted>
        WITH KEY node = <fs_at_nodes_sorted2>-node.
        idx = sy-tabix.

        IF sy-subrc <= 2.
          IF idt <> idx .

            ban = 0.
            WHILE ban = 0.

              READ TABLE at_nodes_sorted ASSIGNING <fs_at_nodes_sortedx>
              INDEX idt.  "no ordenados"
              ida = sy-tabix.

              IF sy-subrc <= 2.
                IF <fs_at_nodes_sortedx>-mark = space.

                  READ TABLE at_nodes_sorted INDEX o ASSIGNING <fs_last>.
                  IF sy-subrc <= 2.

                    CALL METHOD ao_tree->move_node
                      EXPORTING
                        i_node_key         = <fs_at_nodes_sortedx>-node
                        i_relatkey         = <fs_last>-node
                        i_relatship        = 2
                      EXCEPTIONS
                        node_not_found     = 1
                        relative_not_found = 2
                        OTHERS             = 3.

                    CALL METHOD cl_gui_cfw=>flush
                      EXCEPTIONS
                        cntl_system_error = 1
                        cntl_error        = 2
                        OTHERS            = 3.

                    conta = conta + 1.
** simulacion de mover nodo
                    CLEAR aw_nodes_sorted.
                    aw_nodes_sorted-node =  <fs_at_nodes_sortedx>-node.
                    APPEND aw_nodes_sorted TO at_nodes_sorted.
                    DELETE at_nodes_sorted INDEX ida.

                    READ TABLE at_nodes_sorted INDEX idt ASSIGNING <fs_at_nodes_sortedm>.
                    IF sy-subrc <= 2.
                      IF <fs_at_nodes_sortedm>-node = <fs_at_nodes_sorted2>-node.
                        <fs_at_nodes_sortedm>-mark = 'X'.
                        ban = 1.
                      ENDIF.
                    ENDIF.

                  ENDIF.

                ENDIF.
              ENDIF.

            ENDWHILE.

          ELSE.
            <fs_at_nodes_sorted>-mark = 'X'.
          ENDIF.
        ELSE.
        ENDIF.

      ENDLOOP.
    ENDLOOP.
  ENDIF.

  MESSAGE ID 'ZHRMSG' TYPE 'S' NUMBER 517 WITH conta.

************************* new ******************************************

  CALL METHOD ao_tree->frontend_update.

  REFRESH <ti>.
  <ti> = <ti2>.  "ordenada

****************************************************************************************

ENDMETHOD.

METHOD ASSIGN_SORT.


  DATA: conta TYPE num.
  DATA: conta2 TYPE num.
  DATA: idt TYPE sytabix.
  DATA: idx TYPE sytabix.
  DATA: idb TYPE sytabix.
  DATA: ida TYPE sytabix.
  DATA: etiq_label TYPE string.
  DATA: o TYPE int2.
  DATA: lt_selected_nodes TYPE lvc_t_nkey.

  FIELD-SYMBOLS: <ti> TYPE table.
  ASSIGN ao_nodetab->* TO <ti>.
***********************************
  FIELD-SYMBOLS: <ti2> TYPE table.
  ASSIGN ao_nodetab_sort->* TO <ti2>.

***********************************************
  REFRESH <ti2>.
  INSERT LINES OF <ti> INTO TABLE <ti2>.  " lo que hay en ese momento en ti

ENDMETHOD.

METHOD FILTER.

  DATA: tcol_sel TYPE lvc_t_fnam.
  DATA: wcol_sel TYPE zwfname.
  DATA: tcol_sel2 TYPE lvc_t_col.
  DATA: wcol_sel2 TYPE lvc_s_col.
  DATA: wlayout TYPE lvc_s_lacn.
  DATA: wnodekey TYPE lvc_nkey.
  DATA: wlayout_node TYPE lvc_s_layn.
  DATA: idt TYPE sytabix.
  DATA: ttype TYPE ztytype.
  DATA: wtype TYPE zwtype.
  DATA: conta TYPE i.

  FIELD-SYMBOLS: <ti> TYPE table.
  ASSIGN ao_nodetab->* TO <ti>.

  DATA: wnode_tab TYPE REF TO data.
  FIELD-SYMBOLS: <wi> TYPE ANY.
  CREATE DATA wnode_tab TYPE (ap_i_struct_name).
  ASSIGN wnode_tab->* TO <wi>.

  FIELD-SYMBOLS : <fs_key> TYPE ANY.
  FIELD-SYMBOLS : <fs_type> TYPE ANY.
  FIELD-SYMBOLS : <fs_wtype> TYPE zwtype.
  FIELD-SYMBOLS:  <fs_filter> TYPE lvc_s_filt.
*************************************************

  DATA: t_filter_index  TYPE  lvc_t_fidx.
  DATA: t_grouplevels_filter  TYPE  lvc_t_grpl.
  DATA: t_filter_index_inside TYPE  lvc_t_fidx.
  DATA: w_filter_flagname TYPE  char40.

  DATA: t_filter_index2  TYPE  lvc_t_fidx.
  DATA: t_grouplevels_filter2  TYPE  lvc_t_grpl.
  DATA: t_filter_index_inside2 TYPE  lvc_t_fidx.
  DATA: w_filter_flagname2 TYPE  char40.

  DATA: aw_layo TYPE lvc_s_layo.
  DATA: filt TYPE lvc_t_filt.
  DATA: wfilt TYPE lvc_s_filt.
  FIELD-SYMBOLS: <fs_index> TYPE int4.
  DATA: tot_filter TYPE i.
  DATA: tot_ti TYPE i.
  DATA: tnodekey TYPE lvc_t_nkey.
  DATA: ti_tnodekey TYPE lvc_t_nkey.
  FIELD-SYMBOLS: <fs_ti_tnodekey> TYPE lvc_nkey.

***************************************************
  CLEAR: t_filter_index[], t_grouplevels_filter[], t_filter_index_inside[], w_filter_flagname.
  CLEAR: t_filter_index2[], t_grouplevels_filter2[], t_filter_index_inside2[], w_filter_flagname2.
  REFRESH: t_filter_index, t_grouplevels_filter, t_filter_index_inside.
  REFRESH: t_filter_index2, t_grouplevels_filter2, t_filter_index_inside2.
  CLEAR: aw_layo.

  CLEAR: tcol_sel[], tcol_sel2[].
  REFRESH: tcol_sel, tcol_sel2.
  conta = 0.

  DATA: campo TYPE lvc_fname.
  FIELD-SYMBOLS: <fscat> TYPE lvc_s_fcat.

  IF ap_nivel_graphics = 0.
    LOOP AT at_fieldcatalog ASSIGNING <fscat>.
      IF <fscat>-no_out = ' '.
        campo = <fscat>-fieldname.
        APPEND campo TO tcol_sel.
      ENDIF.
    ENDLOOP.
  ELSE.
    CALL METHOD ao_tree->get_selected_columns
      IMPORTING
        et_sel_columns = tcol_sel
      EXCEPTIONS
        dp_error       = 1
        failed         = 2
        OTHERS         = 3.
  ENDIF.

  LOOP AT tcol_sel INTO wcol_sel.
    CLEAR wcol_sel2.
    wcol_sel2-fieldname = wcol_sel.
    APPEND wcol_sel2 TO tcol_sel2.
  ENDLOOP.

  APPEND ap_label_type TO tcol_sel2.
****************************************************************************
  IF ap_nivel_graphics > 0 AND ap_nivel_graphics <= 9.
    REFRESH filt.
    wfilt-fieldname = 'TYPE'.
    wfilt-sign = 'I'.
    wfilt-option = 'EQ'.
    wfilt-low = ap_nivel_graphics.
    APPEND wfilt TO filt.
  ENDIF.
****************************************************************************
  CALL FUNCTION 'LVC_FILTER'
    EXPORTING
*   I_CALLBACK_PROGRAMM          = ' '
    it_fieldcat                  = at_fieldcatalog
    it_selected_cols             = tcol_sel2
*   IT_VALUE_UNIT                =
*   IT_GROUPLEVELS               =
      is_layout                    = aw_layo
*   IS_SELFIELD                  =
*   IT_GROUPS                    =
*   IS_FILT_LAYOUT               =
*   IT_EVENTS                    =
*   I_NO_DIALOG                  =
*   IT_EXCEPT_QINFO              =
 IMPORTING
   et_filter_index              = t_filter_index
   et_grouplevels_filter        = t_grouplevels_filter
   et_filter_index_inside       = t_filter_index_inside
   e_filter_flagname            = w_filter_flagname
    TABLES
      it_data                      = <ti>
    CHANGING
      ct_filter                    = filt
 EXCEPTIONS
   no_change                    = 1
   OTHERS                       = 2.

  at_it_filter = filt.

***********************************************************************

  CALL FUNCTION 'LVC_FILTER_APPLY'
    EXPORTING
      it_filter                    = at_it_filter
*   IT_VALUE_UNIT                =
*   IT_GROUPLEVELS               =
*   I_FILTER_FLAGNAME            =
*   I_TABNAME                    =
*   I_TABNAME_SLAVE              =
*   I_SLAVE                      =
 IMPORTING
   et_filter_index              = t_filter_index2
   et_grouplevels_filter        = t_grouplevels_filter2
   et_filter_index_inside       = t_filter_index_inside2
    TABLES
      it_data                      = <ti>.

  DESCRIBE TABLE <ti>  LINES tot_ti.
  DESCRIBE TABLE t_filter_index_inside2 LINES tot_filter.

***********************************************************************

  IF t_filter_index_inside2 IS NOT INITIAL AND tot_filter < tot_ti.

    CLEAR ttype[].
    REFRESH ttype.

    DATA: pw_tipo TYPE zdnos_ranges.
    DATA: pt_tipo TYPE ztydnos_ranges.

    READ TABLE at_it_filter ASSIGNING <fs_filter> WITH KEY fieldname = ap_label_type.
    IF sy-subrc <= 2.
      pw_tipo-sign = <fs_filter>-sign.
      pw_tipo-option = <fs_filter>-option.
      pw_tipo-low = <fs_filter>-low.
      pw_tipo-high = <fs_filter>-high.
      APPEND pw_tipo TO pt_tipo.
    ENDIF.

    LOOP AT <ti> INTO <wi>.
      idt = sy-tabix.
      ASSIGN (ap_field_key) TO <fs_key>.
      ASSIGN (ap_field_type) TO <fs_type>.
      wtype = <fs_type>.
      COLLECT wtype INTO ttype.
    ENDLOOP.

    DELETE ttype WHERE LINE NOT IN pt_tipo.

    LOOP AT <ti> INTO <wi>.
      idt = sy-tabix.
      CLEAR wlayout_node.
      CLEAR wlayout.

      ASSIGN (ap_field_key) TO <fs_key>.
      ASSIGN (ap_field_type) TO <fs_type>.
      wnodekey = <fs_key>.

      READ TABLE t_filter_index_inside2 ASSIGNING <fs_index>
      WITH KEY table_line = idt.
      IF sy-subrc > 2.  "si no esta en el filtro, son lo que deberian de ser eliminados

        READ TABLE ttype ASSIGNING <fs_wtype> WITH KEY line = <fs_type>.
        IF sy-subrc <= 2. " si es el tipo o nivel que escogio el usuario, siga

** new
          CLEAR tnodekey.
          REFRESH tnodekey.
          CALL METHOD ao_tree->get_subtree
            EXPORTING
              i_node_key       = wnodekey
            IMPORTING
              et_subtree_nodes = tnodekey.

          LOOP AT tnodekey ASSIGNING <fs_ti_tnodekey>.
            CALL METHOD ao_tree->get_outtab_line
              EXPORTING
                i_node_key     = <fs_ti_tnodekey>
              IMPORTING
                e_outtab_line  = <wi>
                es_node_layout = wlayout_node
              EXCEPTIONS
                node_not_found = 1
                OTHERS         = 2.

            MOVE-CORRESPONDING wlayout_node TO wlayout.

            wlayout-hidden = 'X'.
            wlayout-u_hidden = 'X'.

            CALL METHOD ao_tree->change_node
              EXPORTING
                i_node_key     = <fs_ti_tnodekey>
                i_outtab_line  = <wi>
                is_node_layout = wlayout
              EXCEPTIONS
                node_not_found = 1
                OTHERS         = 2.

            conta = conta + 1.
          ENDLOOP.

        ENDIF.
      ENDIF.
    ENDLOOP.

    MESSAGE ID 'ZHRMSG' TYPE 'S' NUMBER 531 WITH conta.
    CALL METHOD ao_tree->frontend_update.

  ENDIF.

ENDMETHOD.

METHOD UNDO_FILTER.


  DATA: wlayout TYPE lvc_s_lacn.
  DATA: wnodekey TYPE lvc_nkey.
  DATA: wlayout_node TYPE lvc_s_layn.
  DATA: idt TYPE sytabix.
  DATA: conta TYPE i.

  FIELD-SYMBOLS: <ti> TYPE table.
  ASSIGN ao_nodetab->* TO <ti>.
*************************************************
  DATA: wnode_tab TYPE REF TO data.
  FIELD-SYMBOLS: <wi> TYPE ANY.
  CREATE DATA wnode_tab TYPE (ap_i_struct_name).
  ASSIGN wnode_tab->* TO <wi>.

  FIELD-SYMBOLS : <fs_key> TYPE ANY.
  FIELD-SYMBOLS : <fs_type> TYPE ANY.

*************************************************
***************************************************
  conta = 0.

  LOOP AT <ti> INTO <wi>.
    idt = sy-tabix.
    CLEAR wlayout_node.
    CLEAR wlayout.

    ASSIGN (ap_field_key) TO <fs_key>.
    ASSIGN (ap_field_type) TO <fs_type>.
    wnodekey = <fs_key>.

    CALL METHOD ao_tree->get_outtab_line
      EXPORTING
        i_node_key     = wnodekey
      IMPORTING
        e_outtab_line  = <wi>
        es_node_layout = wlayout_node
      EXCEPTIONS
        node_not_found = 1
        OTHERS         = 2.

    MOVE-CORRESPONDING wlayout_node TO wlayout.

    wlayout-hidden = ''.
    wlayout-u_hidden = 'X'.

    CALL METHOD ao_tree->change_node
      EXPORTING
        i_node_key     = wnodekey
        i_outtab_line  = <wi>
        is_node_layout = wlayout
      EXCEPTIONS
        node_not_found = 1
        OTHERS         = 2.

    conta = conta + 1.

  ENDLOOP.

  CALL METHOD ao_tree->frontend_update.

ENDMETHOD.

METHOD ADD_LEVEL.


  DATA: sig_nivel TYPE numc2.

**************************************

  sig_nivel = ap_nivel_graphics + 1.
  ap_nivel_graphics = sig_nivel.
*
  IF ap_nivel_graphics >= 0 AND ap_nivel_graphics <= 9.
    MESSAGE ID 'ZHRMSG' TYPE 'S' NUMBER 684 WITH ap_nivel_graphics.
  ELSE.
    MESSAGE ID 'ZHRMSG' TYPE 'S' NUMBER 718 WITH lim_nivel.
  ENDIF.

ENDMETHOD.

METHOD SUBTRACT_LEVEL.


  DATA sig_nivel TYPE numc2.

  sig_nivel = ap_nivel_graphics - 1.
  ap_nivel_graphics = sig_nivel.
*
  IF ap_nivel_graphics < 0.
    ap_nivel_graphics = 0.
  ENDIF.
*
  IF ap_nivel_graphics >= 0 AND ap_nivel_graphics <= 9.
    MESSAGE ID 'ZHRMSG' TYPE 'S' NUMBER 684 WITH ap_nivel_graphics.
  ELSE.
    MESSAGE ID 'ZHRMSG' TYPE 'S' NUMBER 718 WITH lim_nivel.
  ENDIF.

ENDMETHOD.

METHOD CHANGE_GRAPHIC.

  FIELD-SYMBOLS: <ti> TYPE table.
  ASSIGN ao_nodetab->* TO <ti>.
**************************************

  DATA: wa TYPE REF TO data.
  FIELD-SYMBOLS: <wi> TYPE ANY.
  CREATE DATA wa TYPE (ap_i_struct_name).
  ASSIGN wa->* TO <wi>.

  DATA: ta TYPE REF TO data.
  FIELD-SYMBOLS: <ta2> TYPE table.
  CREATE DATA ta TYPE TABLE OF (ap_i_struct_name).
  ASSIGN ta->* TO <ta2>.

  REFRESH <ta2>.
  LOOP AT <ti> INTO <wi>.
    APPEND <wi> TO <ta2>.
  ENDLOOP.

  ao_nodetab_graph02 = ta.

  CLEAR ao_nodetab3.   "dentro de build_graphics
  CLEAR ao_nodetab_graph01.
  CLEAR at_fieldcatalog_graphic01.
  CLEAR at_columns01.
  CLEAR at_rows01.

*
  CALL METHOD zcl_alv_tree_mainp=>build_graphics
    EXPORTING
      p_field_graph = ap_field_graphics
      p_nodetab2    = ao_nodetab_graph02
      p_nivel       = ap_nivel_graphics
      p_num_button  = '01'
      p_collect     = ap_collect_graphics.

ENDMETHOD.

METHOD BUTTON_ACTIVATED.

  ap_button_activated = p_button.

ENDMETHOD.

METHOD SELECT_ALL.

  FIELD-SYMBOLS: <te> TYPE table.
  ASSIGN ao_nodetab->* TO <te>.

  DATA: wnode_tabe TYPE REF TO data.
  FIELD-SYMBOLS: <we> TYPE ANY.
  CREATE DATA wnode_tabe TYPE (ap_i_struct_name).
  ASSIGN wnode_tabe->* TO <we>.

  DATA: wnode_tabf TYPE REF TO data.
  FIELD-SYMBOLS: <wf> TYPE ANY.
  CREATE DATA wnode_tabf TYPE (ap_i_struct_name).
  ASSIGN wnode_tabf->* TO <wf>.

  DATA: titem_layout TYPE lvc_t_layi,
        witem_layout TYPE lvc_s_layi.
  DATA: wnode_layout TYPE lvc_s_layn.
  DATA: tchange_item TYPE lvc_t_laci,
        wchange_item TYPE lvc_s_laci.

  FIELD-SYMBOLS: <fs_caden> TYPE xfeld.
  FIELD-SYMBOLS: <fs_caden2> TYPE lvc_nkey.
  FIELD-SYMBOLS: <fs_caden3> TYPE seu_type.

  DATA: tnkey TYPE lvc_t_nkey.
  DATA: wnkey TYPE lvc_s_nkey.

  LOOP AT <te> ASSIGNING <we>.
    ASSIGN (ap_field_wecheck) TO <fs_caden>.
    ASSIGN (ap_field_wetkey) TO <fs_caden2>.
    ASSIGN (ap_field_wetype) TO <fs_caden3>.

    IF <fs_caden3> = ap_nivel_graphics OR ap_nivel_graphics = 0.

      IF <fs_caden> IS ASSIGNED.
        wnkey-node_key = <fs_caden2>.

        REFRESH titem_layout.
        CLEAR wnode_layout.
        CALL METHOD ao_tree->get_outtab_line
          EXPORTING
            i_node_key     = wnkey-node_key
          IMPORTING
            e_outtab_line  = <wf>
            et_item_layout = titem_layout
            es_node_layout = wnode_layout.

        <fs_caden> = 'X'.
        REFRESH tchange_item.

        LOOP AT titem_layout INTO witem_layout.

          CLEAR wchange_item.
          MOVE-CORRESPONDING witem_layout TO wchange_item.
          IF wnode_layout-hidden = ' '.
            wchange_item-chosen = 'X'.
            wchange_item-u_chosen = 'X'.
          ELSE.
            wchange_item-chosen = ' '.
            wchange_item-u_chosen = 'X'.
            <fs_caden> = ' '.
          ENDIF.
          APPEND wchange_item TO tchange_item.
        ENDLOOP.

        IF tchange_item[] IS NOT INITIAL.
          CALL METHOD ao_tree->change_node
            EXPORTING
              i_node_key     = wnkey-node_key
              i_outtab_line  = <we>
              it_item_layout = tchange_item.
        ENDIF.

      ENDIF.

    ENDIF.
  ENDLOOP.

  CALL METHOD ao_tree->frontend_update.

ENDMETHOD.

METHOD UNSELECT_ALL.


  FIELD-SYMBOLS: <te> TYPE table.
  ASSIGN ao_nodetab->* TO <te>.

  DATA: wnode_tabe TYPE REF TO data.
  FIELD-SYMBOLS: <we> TYPE ANY.
  CREATE DATA wnode_tabe TYPE (ap_i_struct_name).
  ASSIGN wnode_tabe->* TO <we>.

  DATA: wnode_tabf TYPE REF TO data.
  FIELD-SYMBOLS: <wf> TYPE ANY.
  CREATE DATA wnode_tabf TYPE (ap_i_struct_name).
  ASSIGN wnode_tabf->* TO <wf>.

  DATA: titem_layout TYPE lvc_t_layi,
        witem_layout TYPE lvc_s_layi.
  DATA: wnode_layout TYPE lvc_s_layn.
  DATA: tchange_item TYPE lvc_t_laci,
        wchange_item TYPE lvc_s_laci.

  FIELD-SYMBOLS: <fs_caden> TYPE xfeld.
  FIELD-SYMBOLS: <fs_caden2> TYPE lvc_nkey.
  FIELD-SYMBOLS: <fs_caden3> TYPE seu_type.

  DATA: tnkey TYPE lvc_t_nkey.
  DATA: wnkey TYPE lvc_s_nkey.

  LOOP AT <te> ASSIGNING <we>.
    ASSIGN (ap_field_wecheck) TO <fs_caden>.
    ASSIGN (ap_field_wetkey) TO <fs_caden2>.
    ASSIGN (ap_field_wetype) TO <fs_caden3>.

    IF <fs_caden3> = ap_nivel_graphics OR ap_nivel_graphics = 0.

      IF <fs_caden> IS ASSIGNED.

        wnkey-node_key = <fs_caden2>.

        REFRESH titem_layout.
        CLEAR wnode_layout.
        CALL METHOD ao_tree->get_outtab_line
          EXPORTING
            i_node_key     = wnkey-node_key
          IMPORTING
            e_outtab_line  = <wf>
            et_item_layout = titem_layout
            es_node_layout = wnode_layout
          EXCEPTIONS
            node_not_found = 0.

        <fs_caden> = ' '.
        REFRESH tchange_item.

        LOOP AT titem_layout INTO witem_layout.

          CLEAR wchange_item.
          MOVE-CORRESPONDING witem_layout TO wchange_item.
          IF wnode_layout-hidden = ' '.
            wchange_item-chosen = ' '.
            wchange_item-u_chosen = 'X'.
          ENDIF.

          APPEND wchange_item TO tchange_item.
        ENDLOOP.

        IF tchange_item[] IS NOT INITIAL.
          CALL METHOD ao_tree->change_node
            EXPORTING
              i_node_key     = wnkey-node_key
              i_outtab_line  = <we>
              it_item_layout = tchange_item.
        ENDIF.

      ENDIF.
    ENDIF.
  ENDLOOP.

  CALL METHOD ao_tree->frontend_update.

ENDMETHOD.

METHOD MARK_FATHER.


  FIELD-SYMBOLS: <te> TYPE table.
  ASSIGN ao_nodetab->* TO <te>.

  DATA: wnode_tabe TYPE REF TO data.
  FIELD-SYMBOLS: <we> TYPE ANY.
  CREATE DATA wnode_tabe TYPE (ap_i_struct_name).
  ASSIGN wnode_tabe->* TO <we>.

  DATA: wnode_tabf TYPE REF TO data.
  FIELD-SYMBOLS: <wf> TYPE ANY.
  CREATE DATA wnode_tabf TYPE (ap_i_struct_name).
  ASSIGN wnode_tabf->* TO <wf>.

  DATA: titem_layout TYPE lvc_t_layi,
        witem_layout TYPE lvc_s_layi.
  DATA: wnode_layout TYPE lvc_s_layn.
  DATA: tchange_item TYPE lvc_t_laci,
        wchange_item TYPE lvc_s_laci.

  FIELD-SYMBOLS: <fs_caden> TYPE xfeld.
  FIELD-SYMBOLS: <fs_caden2> TYPE lvc_nkey.

  DATA: tnkey TYPE lvc_t_nkey.
  DATA: wnkey TYPE lvc_s_nkey.

  CALL METHOD ao_tree->get_subtree
    EXPORTING
      i_node_key       = p_key
    IMPORTING
      et_subtree_nodes = tnkey.

  DATA: cadenax TYPE string.

  LOOP AT tnkey INTO wnkey.

    REFRESH titem_layout.
    CLEAR wnode_layout.
    CALL METHOD ao_tree->get_outtab_line
      EXPORTING
        i_node_key     = wnkey-node_key
      IMPORTING
        e_outtab_line  = <wf>
        et_item_layout = titem_layout
        es_node_layout = wnode_layout.

    LOOP AT <te> ASSIGNING <we>.

      ASSIGN (ap_field_wecheck) TO <fs_caden>.
      ASSIGN (ap_field_wetkey) TO <fs_caden2>.
      IF  <fs_caden2> = wnkey-node_key.
        <fs_caden> = 'X'.
        EXIT.
      ENDIF.

    ENDLOOP.

    REFRESH tchange_item.
    LOOP AT titem_layout INTO witem_layout.

      CLEAR wchange_item.
      MOVE-CORRESPONDING witem_layout TO wchange_item.
      IF wnode_layout-hidden = ' '.
        wchange_item-chosen = 'X'.
        wchange_item-u_chosen = 'X'.
      ELSE.
        wchange_item-chosen = ' '.
        wchange_item-u_chosen = 'X'.
        <fs_caden> = ' '.
      ENDIF.
      APPEND wchange_item TO tchange_item.
    ENDLOOP.

    IF tchange_item[] IS NOT INITIAL.
      CALL METHOD ao_tree->change_node
        EXPORTING
          i_node_key     = wnkey-node_key
          i_outtab_line  = <we>
          it_item_layout = tchange_item.
    ENDIF.

  ENDLOOP.

  CALL METHOD ao_tree->frontend_update.

ENDMETHOD.

METHOD UNMARK_FATHER.


  FIELD-SYMBOLS: <te> TYPE table.
  ASSIGN ao_nodetab->* TO <te>.

  DATA: wnode_tabe TYPE REF TO data.
  FIELD-SYMBOLS: <we> TYPE ANY.
  CREATE DATA wnode_tabe TYPE (ap_i_struct_name).
  ASSIGN wnode_tabe->* TO <we>.

  DATA: wnode_tabf TYPE REF TO data.
  FIELD-SYMBOLS: <wf> TYPE ANY.
  CREATE DATA wnode_tabf TYPE (ap_i_struct_name).
  ASSIGN wnode_tabf->* TO <wf>.

  DATA: titem_layout TYPE lvc_t_layi,
        witem_layout TYPE lvc_s_layi.
  DATA: wnode_layout TYPE lvc_s_layn.
  DATA: tchange_item TYPE lvc_t_laci,
        wchange_item TYPE lvc_s_laci.

  FIELD-SYMBOLS: <fs_caden> TYPE xfeld.
  FIELD-SYMBOLS: <fs_caden2> TYPE lvc_nkey.

  DATA: tnkey TYPE lvc_t_nkey.
  DATA: wnkey TYPE lvc_s_nkey.

  CALL METHOD ao_tree->get_subtree
    EXPORTING
      i_node_key       = p_key
    IMPORTING
      et_subtree_nodes = tnkey.

  LOOP AT tnkey INTO wnkey.

    REFRESH titem_layout.
    CLEAR wnode_layout.
    CALL METHOD ao_tree->get_outtab_line
      EXPORTING
        i_node_key     = wnkey-node_key
      IMPORTING
        e_outtab_line  = <wf>
        et_item_layout = titem_layout
        es_node_layout = wnode_layout.

    LOOP AT <te> ASSIGNING <we>.
      ASSIGN (ap_field_wecheck) TO <fs_caden>.
      ASSIGN (ap_field_wetkey) TO <fs_caden2>.
      IF  <fs_caden2> = wnkey-node_key.
        <fs_caden> = ' '.
        EXIT.
      ENDIF.
    ENDLOOP.

    REFRESH tchange_item.
    LOOP AT titem_layout INTO witem_layout.

      CLEAR wchange_item.
      MOVE-CORRESPONDING witem_layout TO wchange_item.
      IF wnode_layout-hidden = ' '.
        wchange_item-chosen = ' '.
        wchange_item-u_chosen = 'X'.
      ENDIF.

      APPEND wchange_item TO tchange_item.
    ENDLOOP.

    IF tchange_item[] IS NOT INITIAL.
      CALL METHOD ao_tree->change_node
        EXPORTING
          i_node_key     = wnkey-node_key
          i_outtab_line  = <we>
          it_item_layout = tchange_item.
    ENDIF.

  ENDLOOP.

  CALL METHOD ao_tree->frontend_update.

ENDMETHOD.

METHOD IS_HIDDEN.


  FIELD-SYMBOLS: <te> TYPE table.
  ASSIGN ao_nodetab->* TO <te>.

  DATA: titem_layout TYPE lvc_t_layi,
        witem_layout TYPE lvc_s_layi.
  DATA: wnode_layout TYPE lvc_s_layn.
  DATA: tchange_item TYPE lvc_t_laci,
        wchange_item TYPE lvc_s_laci.

  FIELD-SYMBOLS: <fs_caden> TYPE xfeld.
  FIELD-SYMBOLS: <fs_caden2> TYPE lvc_nkey.


  DATA: tnkey TYPE lvc_t_nkey.
  DATA: wnkey TYPE lvc_s_nkey.
  CLEAR wnkey.

  wnkey-node_key = p_key.

  REFRESH titem_layout.
  CLEAR wnode_layout.

  CALL METHOD ao_tree->get_outtab_line
    EXPORTING
      i_node_key     = wnkey-node_key
    IMPORTING
      et_item_layout = titem_layout
      es_node_layout = wnode_layout
    EXCEPTIONS
      node_not_found = 0.

  IF wnode_layout-hidden = 'X'.
    p_answer = 'X'.
  ELSE.
    p_answer = ' '.
  ENDIF.

ENDMETHOD.

method update_field_dynpro.

  DATA: lt_dynpf TYPE STANDARD TABLE OF dynpread.
  DATA: lw_dynpf LIKE LINE OF lt_dynpf.

  CLEAR: lt_dynpf, lw_dynpf.

  lw_dynpf-fieldname = p_nombre_campo.
  lw_dynpf-stepl     = p_linea.
  lw_dynpf-fieldvalue = p_valor.
  APPEND lw_dynpf TO lt_dynpf.

  CALL FUNCTION 'DYNP_UPDATE_FIELDS'
    EXPORTING
      dyname               = p_nombre_programa
      dynumb               = p_nombre_dynpro
      request              = 'A'
    TABLES
      dynpfields           = lt_dynpf
    EXCEPTIONS
      invalid_abapworkarea = 1
      invalid_dynprofield  = 2
      invalid_dynproname   = 3
      invalid_dynpronummer = 4
      invalid_request      = 5
      no_fielddescription  = 6
      undefind_error       = 7
      OTHERS               = 8.

endmethod.

METHOD FRAG_PATTERN.


  DATA: lt_tabla_i TYPE ztydatafile.
  FIELD-SYMBOLS: <lw_tabla_i> TYPE zwdatafile.

  DATA: lt_trama_g TYPE ztydatafile.
  FIELD-SYMBOLS: <lw_trama_r> TYPE zwdatafile.

  DATA: delimitador TYPE c VALUE ','.

***********************************************
*dynamic structure
  DATA: w_estructura TYPE REF TO data.

  FIELD-SYMBOLS: <wa> TYPE ANY.
  FIELD-SYMBOLS <wa2> TYPE ANY.
  CREATE DATA w_estructura TYPE (ps_nombre_estructura).
  ASSIGN w_estructura->* TO <wa>.

***********************************************
*dynamic table
  DATA: t_tabla TYPE REF TO data.
  FIELD-SYMBOLS: <ta> TYPE table.
  FIELD-SYMBOLS <ta2> TYPE table.

  CREATE DATA t_tabla TYPE TABLE OF (ps_nombre_estructura).
  ASSIGN t_tabla->* TO <ta>.

***********************************************
* assign the parameter for the object table

  FIELD-SYMBOLS: <ka> TYPE table.
  CREATE DATA pt_tabla_o TYPE TABLE OF (ps_nombre_estructura).
  ASSIGN pt_tabla_o->* TO <ka>.

*************************************************
* process
  lt_tabla_i = pt_tabla_i.

  IF ps_separador <> space.
    delimitador = ps_separador.
  ENDIF.

  IF lt_tabla_i IS NOT INITIAL.

    REFRESH lt_trama_g.
    REFRESH lt_trama_o.

** la estructura debe tener el mismo número de campos que son fragmentados
    LOOP AT lt_tabla_i ASSIGNING <lw_tabla_i>.

      SPLIT <lw_tabla_i> AT delimitador INTO TABLE lt_trama_g.
      INSERT LINES OF lt_trama_g INTO TABLE lt_trama_o.
      LOOP AT lt_trama_g ASSIGNING <lw_trama_r>.
        ASSIGN COMPONENT sy-tabix OF STRUCTURE <wa> TO <wa2>.
        <wa2> = <lw_trama_r>.
      ENDLOOP.
      APPEND <wa> TO <ta>.
      CLEAR <wa2>.
    ENDLOOP.

************************************************
* assign the parameter to the object table
    MOVE <ta> TO <ka>.

** Nota: cuando se llame a este metodo, y se quiera referenciar este objeto
** en un programa o reporte, haga lo siguiente:
** FIELD-SYMBOLS: <fs> TYPE table.
** assign param_pt_table_i->* TO <fs>.

  ELSE.

    sy-msgv1 = 'No se han encontrado datos'.
    sy-msgid = 'ZFI'.

    CALL METHOD zcl_alv_tree_mainp=>display
      EXPORTING
        ps_msgty = 'S'.

  ENDIF.

** 001

ENDMETHOD.

METHOD DEFINE_MASK.

  DATA: conta TYPE i.
  DATA: p2_tabla_i TYPE ztydatafile.
  FIELD-SYMBOLS: <fs_p2_tabla_i> TYPE zwdatafile.
  DATA: numreg TYPE i.
  DATA: mascara TYPE char255.
  DATA: wtrama TYPE zwtrama.
  DATA: ttrama TYPE zttrama.
  DATA: wdatos_arch TYPE char2048.

  CLEAR p2_tabla_i.
  REFRESH p2_tabla_i[].

  CALL METHOD zcl_alv_tree_mainp=>frag_pattern
    EXPORTING
      ps_separador         = ','
      ps_nombre_estructura = 'ZWDATAFILE'
      pt_tabla_i           = p_tabla_i
    IMPORTING
      lt_trama_o           = p2_tabla_i.

  DESCRIBE TABLE p2_tabla_i LINES numreg.

  LOOP AT p2_tabla_i ASSIGNING <fs_p2_tabla_i>.
    wtrama-contenido = 'X'.
    wtrama-columna = <fs_p2_tabla_i>-line.
    APPEND wtrama TO ttrama.
  ENDLOOP.
** envio la tabla interna que será tratada como una estructura en este método.
  CALL METHOD zcl_alv_tree_mainp=>fixed_frame_columns
    EXPORTING
      p_trama            = ttrama
    IMPORTING
      pw_info_delimitada = wdatos_arch.

  p_mascara = wdatos_arch.

ENDMETHOD.

METHOD FIXED_FRAME_COLUMNS.


** DESCRIPCION : ARMA UNA TRAMA Y COLOCA LA INFORMACION EN COLUMNAS ESPECIFICADAS.

  DATA: lt_campos_tabla TYPE zttrama,
        ls_resultado TYPE char2048,
        ls_valor TYPE string,
        tamano TYPE i,
        acum_pos TYPE i.

  FIELD-SYMBOLS: <l_to>     TYPE ANY.
  FIELD-SYMBOLS: <lw_campos_tabla>  LIKE LINE OF lt_campos_tabla.

  CLEAR ls_resultado.
  LOOP AT p_trama ASSIGNING <lw_campos_tabla>.
    acum_pos = <lw_campos_tabla>-columna.
    ls_valor = <lw_campos_tabla>-contenido.
    CONDENSE ls_valor.
    tamano = STRLEN( ls_valor ).

    IF tamano > 0.
      ls_resultado+acum_pos(tamano) = ls_valor.
    ENDIF.

  ENDLOOP.
  MOVE ls_resultado TO pw_info_delimitada.

ENDMETHOD.

method DISPLAY.


  DATA: LS_MSGTY TYPE SYMSGTY.

* Permite cambiar el Tipo de Mensaje...
  IF NOT PS_MSGTY IS INITIAL.
    LS_MSGTY = PS_MSGTY.
  ELSE.
    LS_MSGTY = SY-MSGTY.
  ENDIF.

* Diplay Message...
  MESSAGE ID SY-MSGID TYPE LS_MSGTY NUMBER SY-MSGNO
        WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.


endmethod.

No hay comentarios:

Publicar un comentario