ALV Tree Orientado a Objetos

26 11 2007

Hace unos días en el trabajo me tocó hacer un reporte ALV Tree .
image 

No encontré mucha información ni manuales al respecto, mucho menos en español. Pero por suerte pude encontrar un ejemplo que me sirvió mucho. Es un post de ALV Tree orientado a objetos del conocido Alvaro Tejada Galindo (http://atejada.blogspot.com/2007/05/alv-tree-orientado-objetos.html#links)

Por lo tanto aprovecho para hacer referencia de ese post con algunas cosas que faltaban y cambios en la sintaxis para que active. Y además voy a describir en detalle como crear una Dynpro y el Custom Control necesarios para correr el reporte ALV Tree.


1º) Desde la transacción SE38 creamos el reporte Z_ALV_TREE y pegamos el siguiente código:

*&———————————————————————*
*& Report  Z_ALV_TREE                                                  *
*&                                                                     *
*&———————————————————————*
*&                                                                     *
*&                                                                     *
*&———————————————————————*

REPORT Z_ALV_TREE.

*——————————————————————*
*  DECLARACION DE TYPES                                            *
*——————————————————————*

TYPES: BEGIN OF TY_SPFLI,
       CARRID TYPE SPFLI-CARRID,
       CONNID TYPE SPFLI-CONNID,
       COUNTRYFR TYPE SPFLI-COUNTRYFR,
       CITYFROM TYPE SPFLI-CITYFROM,
       AIRPFROM TYPE SPFLI-AIRPFROM,
       COUNTRYTO TYPE SPFLI-COUNTRYTO,
       CITYTO TYPE SPFLI-CITYTO,
       END OF TY_SPFLI.

TYPES: BEGIN OF TY_HEADER,
       CARRID TYPE SPFLI-CARRID,
       END OF TY_HEADER.

*—————————————————————–*
*  DECLARACION DE TABLAS INTERNAS                                 *
*—————————————————————–*

DATA: T_SPFLI TYPE STANDARD TABLE OF TY_SPFLI
      WITH HEADER LINE,
      TAB_TREE TYPE STANDARD TABLE OF TY_SPFLI
      WITH HEADER LINE,
      T_TREE TYPE STANDARD TABLE OF TY_SPFLI
      WITH HEADER LINE,
      T_HEADER TYPE STANDARD TABLE OF TY_HEADER
      WITH HEADER LINE.

*—————————————————————–*
*  DECLARACION DE VARIABLES                                       *
*—————————————————————–*

DATA: G_ALV_TREE TYPE REF TO CL_GUI_ALV_TREE,
      L_HIERARCHY_HEADER TYPE TREEV_HHDR,
      GS_FIELDCAT TYPE LVC_S_FCAT,
      GT_FIELDCAT_TREE TYPE LVC_T_FCAT,
      G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.

*—————————————————————–*
*  DECLARACION DE FIELD-SYMBOLS                                   *
*—————————————————————–*

FIELD-SYMBOLS:  <HEADER> LIKE LINE OF T_HEADER,
                <SPFLI> LIKE LINE OF T_SPFLI.

*—————————————————————–*
*   SELECTION-SCREEN                                              *
*—————————————————————–*

SELECTION-SCREEN BEGIN OF SCREEN 1001.
SELECTION-SCREEN END OF SCREEN 1001.

*—————————————————————–*
*   START-OF-SELECTION                                            *
*—————————————————————–*

START-OF-SELECTION.

  PERFORM OBTENER_DATOS.

  IF G_ALV_TREE IS INITIAL.
    PERFORM INIT_TREE.

    CALL METHOD CL_GUI_CFW=>FLUSH
            EXCEPTIONS CNTL_SYSTEM_ERROR = 1
                       CNTL_ERROR        = 2.
  ENDIF.

  CALL SCREEN 100.

*—————————————————————–*
*       FORM init_tree                                            *
*—————————————————————–*

FORM INIT_TREE.

  DATA: L_TREE_CONTAINER_NAME(30) TYPE C.

  L_TREE_CONTAINER_NAME = ‘TREE_CONTROL’.

  CREATE OBJECT G_CUSTOM_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.

  CREATE OBJECT G_ALV_TREE
    EXPORTING
        PARENT              = G_CUSTOM_CONTAINER
        NODE_SELECTION_MODE = CL_GUI_COLUMN_TREE=>NODE_SEL_MODE_SINGLE
        ITEM_SELECTION      = ”
        NO_HTML_HEADER      = ‘X’
        NO_TOOLBAR          = ”
    EXCEPTIONS
        CNTL_ERROR                   = 1
        CNTL_SYSTEM_ERROR            = 2
        CREATE_ERROR                 = 3
        LIFETIME_ERROR               = 4
        ILLEGAL_NODE_SELECTION_MODE  = 5
        FAILED                       = 6
        ILLEGAL_COLUMN_NAME          = 7.

  PERFORM FILL_CATALOG_TREE.
  PERFORM BUILD_HIERARCHY_HEADER CHANGING L_HIERARCHY_HEADER.

  CALL METHOD G_ALV_TREE->SET_TABLE_FOR_FIRST_DISPLAY
       EXPORTING
                 IS_HIERARCHY_HEADER  = L_HIERARCHY_HEADER
       CHANGING
                 IT_OUTTAB        = T_TREE[]
                 IT_FIELDCATALOG  = GT_FIELDCAT_TREE.

  PERFORM CREATE_HIERARCHY.

ENDFORM.

*—————————————————————–*
*   FORM FILL_CATALOG_TREE                                        *
*—————————————————————–*

FORM FILL_CATALOG_TREE.

  DATA: GS_FIELDCAT_ADD TYPE LVC_S_FCAT.

  CLEAR GS_FIELDCAT.
  GS_FIELDCAT-COL_POS   = 1.
  GS_FIELDCAT-REPTEXT   = ‘Flight’.
  GS_FIELDCAT-SCRTEXT_S = ‘Flight’.
  GS_FIELDCAT-FIELDNAME = ‘CONNID’.
  GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
  APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

  CLEAR GS_FIELDCAT.
  GS_FIELDCAT-COL_POS   = 2.
  GS_FIELDCAT-REPTEXT   = ‘Country’.
  GS_FIELDCAT-SCRTEXT_S = ‘Country’.
  GS_FIELDCAT-FIELDNAME = ‘COUNTRYFR’.
  GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
  APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

  CLEAR GS_FIELDCAT.
  GS_FIELDCAT-COL_POS   = 3.
  GS_FIELDCAT-REPTEXT   = ‘Dep.City’.
  GS_FIELDCAT-SCRTEXT_S = ‘Dep.City’.
  GS_FIELDCAT-FIELDNAME = ‘CITYFROM’.
  GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
  GS_FIELDCAT-OUTPUTLEN = ’15’.
  APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

  CLEAR GS_FIELDCAT.
  GS_FIELDCAT-COL_POS   = 4.
  GS_FIELDCAT-REPTEXT   = ‘Dep.Airp’.
  GS_FIELDCAT-SCRTEXT_S = ‘Dep.Airp’.
  GS_FIELDCAT-FIELDNAME = ‘AIRPFROM’.
  GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
  GS_FIELDCAT-OUTPUTLEN = ’20’.
  APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

  CLEAR GS_FIELDCAT.
  GS_FIELDCAT-COL_POS   = 5.
  GS_FIELDCAT-REPTEXT   = ‘Country’.
  GS_FIELDCAT-SCRTEXT_S = ‘Country’.
  GS_FIELDCAT-FIELDNAME = ‘COUNTRYTO’.
  GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
  GS_FIELDCAT-OUTPUTLEN = ’15’.
  APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

  CLEAR GS_FIELDCAT.
  GS_FIELDCAT-COL_POS   = 6.
  GS_FIELDCAT-REPTEXT   = ‘Arr.City’.
  GS_FIELDCAT-SCRTEXT_S = ‘Arr.City’.
  GS_FIELDCAT-FIELDNAME = ‘CITYTO’.
  GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
  GS_FIELDCAT-OUTPUTLEN = ’20’.
  APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

ENDFORM.

*———————————————————————*
*       FORM build_hierarchy_header                                   *
*———————————————————————*

FORM BUILD_HIERARCHY_HEADER CHANGING
                               P_HIERARCHY_HEADER TYPE TREEV_HHDR.

  CLEAR P_HIERARCHY_HEADER.
  P_HIERARCHY_HEADER-HEADING = ‘Airline carrier'(300).
  P_HIERARCHY_HEADER-WIDTH = 18.
  P_HIERARCHY_HEADER-WIDTH_PIX = ‘ ‘.

ENDFORM.

*———————————————————————*
*       FORM create_hierarchy                                         *
*———————————————————————*

FORM CREATE_HIERARCHY.

  DATA: L_ROOT_KEY TYPE LVC_NKEY,
        L_NEXT_KEY TYPE LVC_NKEY,
        L_LAST_KEY TYPE LVC_NKEY,
        HEADER TYPE STRING,
        W_MENGE_TEXT(13) TYPE C.

  CLEAR L_ROOT_KEY.

  LOOP AT T_HEADER ASSIGNING <HEADER>.
    CLEAR L_ROOT_KEY.
    CLEAR L_NEXT_KEY.
    PERFORM ADD_NODE USING <HEADER>-CARRID L_ROOT_KEY
                     CHANGING L_NEXT_KEY.
    LOOP AT T_SPFLI ASSIGNING <SPFLI>
    WHERE CARRID EQ <HEADER>-CARRID.

      MOVE-CORRESPONDING  <SPFLI> TO TAB_TREE.

      PERFORM ADD_LEAF USING TAB_TREE L_NEXT_KEY
                       CHANGING L_LAST_KEY.
    ENDLOOP.
  ENDLOOP.

  CALL METHOD G_ALV_TREE->FRONTEND_UPDATE.

ENDFORM.

*———————————————————————*
*       FORM ADD_NODE                                                 *
*———————————————————————*

FORM ADD_NODE USING L_NAME L_ROOT_KEY
              CHANGING L_NEXT_KEY.

  DATA: L_NODE_TEXT TYPE LVC_VALUE,
        LS_TREE TYPE TY_SPFLI.

  L_NODE_TEXT =  L_NAME.
  CALL METHOD G_ALV_TREE->ADD_NODE
    EXPORTING
          I_RELAT_NODE_KEY = L_ROOT_KEY
          I_RELATIONSHIP   = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
          I_NODE_TEXT      = L_NODE_TEXT
          IS_OUTTAB_LINE   = LS_TREE
    IMPORTING
          E_NEW_NODE_KEY   = L_NEXT_KEY.

ENDFORM.

*———————————————————————*
*       FORM ADD_LEAF                                                 *
*———————————————————————*

FORM ADD_LEAF USING L_TREE TYPE TY_SPFLI
                    L_NEXT_KEY
              CHANGING L_LAST_KEY.

  CALL METHOD G_ALV_TREE->ADD_NODE
    EXPORTING
          I_RELAT_NODE_KEY = L_NEXT_KEY
          I_RELATIONSHIP   = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
          IS_OUTTAB_LINE   = TAB_TREE
       IMPORTING
          E_NEW_NODE_KEY = L_LAST_KEY.

ENDFORM.

*———————————————————————*
*       FORM OBTENER_DATOS                                            *
*———————————————————————*

FORM OBTENER_DATOS.

  SELECT CARRID CONNID COUNTRYFR CITYFROM
         AIRPFROM COUNTRYTO CITYTO
  INTO TABLE T_SPFLI
  FROM SPFLI.

  IF SY-SUBRC EQ 0.
    LOOP AT T_SPFLI ASSIGNING <SPFLI>.
      MOVE <SPFLI>-CARRID TO T_HEADER-CARRID.
      APPEND T_HEADER.
    ENDLOOP.

    SORT T_HEADER.
    DELETE ADJACENT DUPLICATES FROM T_HEADER.

  ENDIF.

ENDFORM.

2º) Luego de activar el reporte vamos a la transacción SE80:
Buscamos nuestro programa Z_ALV_TREE. Nos paramos sobre la carpeta con mismo nombre, click con el botón derecho del mouse… opción Crear y luego Dynpro: 
image
Ingresamos como número de dynpro 100. Ponemos la descripción que queramos y luego de activar apretamos el botón “Dispos.

A continuación se va a abrir el Screen Painter: 
Clickeamos en el botón Custom Control (image ) y creamos un cuadrado con el nombre TREE_CONTROL
image
Simplemente falta guardar, activar… cerrar el Screen Painter. Y por último en la transacción SE80 doble click en la carpeta Z_ALV_TREE y ejecutamos.
Cabe aclarar que este ejemplo trabaja con la tabla SPFLI que se usa comúnmente en los ejemplos.


Technorati tags:


Acciones

Information

25 responses

19 01 2008
claudio

Me encanto tu nota sobre esto…pq? creo que estoy en las mismas que tu…..necesito info sobre este tema programacion orientada a objeto en abap…y no hay mucha…y menos como tu dices en español….
asi muchas gracias por esta ayuda…

Ahora preguntas…:

se le puede ampliar la jerarquia, que sean mas de dos hijos por padre y tambien si ese hijo puede tener mas hijos….?
gracias

12 02 2008
ana

Hola;
me encanto pero haceindo lo que usted refiere en el correo tengo un problema al crear un control en el screen painter
me puedes ayudar..?

13 02 2008
Daniel Panaro

Que tal Claudio, te comento que se puede ampliar la jerarquía. Fijate que en la primera imagen, por ejemplo LH tiene 3 hijos. Todo va a depender de tu tabla y de los campos que tengan los mismos datos.

Que tal Ana, sería mejor si me contactas por mail y me comentas en detalle cuál es el error.

14 02 2008
enma

Hola,
Yo tengo la misma duda que Claudio. Se que un padre puede tener varios hijos pero, un hijo puede tener otro hijo? Es decir, puede haber mas de dos niveles?
Gracias

19 02 2008
Daniel Panaro

Enma, eso sinceramente no se si se puede hacer. Nunca probé, es cuestión de intentarlo.
Habría que tocar el FORM create_hierarchy y ver si se puede.
Saludos!!!

27 02 2008
rbe

Hola.

¿Alguien sabe como puedo refrescar un nodo en este tipo de árboles?

Muchas gracias
Un saludo.

4 03 2008
Natalia

Me pareció muy interesante el artículo. De todas formas, tengo algunos problemas para totalizar y filtrar columnas, como lo puedo solucionar?
Gracias,

29 03 2008
Daniel Panaro

Si todavía continuan con dificultades, les propongo que me escriban por mail. Para ver en detalle cada duda o problema.
Saludos,
Daniel.

11 08 2009
martin

Buenas, quería saber si sabes como hacer para que se actualicen los datos del alv tree. Es decir, por ejemplo se eliminó un nodo (lo elimine en la tabla interna) cómo debo hacer para ver reflejado el cambio en el alv?

16 05 2008
torrescano

Saludos, buen ejemplo sta muy chido, ademas para comentar que podemos ver en los programas standar de SAP mas ejemplos: bcalv_tree*

salud

17 05 2008
Daniel Panaro

Muchas gracias por tu comentario, y muchas gracias por el dato.
Saludos!!!

4 09 2008
llrull

Hola Daniel,

¿cómo lo haces para activar los eventos?

Por ejemplo si deseamos que al hacer doble-click en un nodo se ejecute una determinada transacción.

Gracias y saludos,

llrull

12 08 2009
Daniel Panaro

Que tal IIrull,
Para ALV tree nunca lo probe. En ALV Grid se habilita en el exporting el callback_user_command donde validas la acción que se ejecutó con la variable sy-ucomm.
Habría que verificar si tiene esta opción o su similar en ALV tree.
Saludos,
Daniel.

31 10 2008
Nasly Alexandra

Muchas Gracias,

Me sirvio de mucho

13 11 2008
Nasly Alexandra

oye estoy tratando de implementar un evento doble_click y no me funciona sabes que debo de hacer

12 08 2009
Daniel Panaro

Si te parece escribime un mail con más detalle de lo que hiciste hasta el momento y donde tenés errores, así trato de ayudarte….
Saludos,
Daniel.

11 01 2010
pedro

Hola, quisiera saber si alguno ha echo un ALV TREE con celdas Editables.

2 03 2010
Víctor

al pasar tu cógio y crear la dynpro… se ejecuta y sale una excepción

2 03 2010
Víctor

Ja!.. no me había dadocuenta de los tildes XD!.. nah si funciona esta muy bueno….. no tienes otro ejemplo pero con más de una tabla.. por ejemplo 1 tabla y su detalle?

26 03 2010
Daniel Panaro

=) …. si cuidado al copiar código porque las comillas en el blog no es el mismo caracter que en SAP.
Saludos,
Daniel.

9 08 2010
llanero

Excellente articulo. tengo una duda como hago para disminuir la cantidad de directorios, es decir me aparece de esta forma orden/nombre centro de costo/planta/solicitud/costos y me gustaria que solo salga de esta forma orden/solicitud/costos. nuevamente tremendo articulo felicidades

31 08 2010
Daniel Panaro

LLANERO,
Me parece que lo que estás necesitando se encuentra en el FORM create_hierarchy. Más precisamente en el perform ADDNODE.

Espero que sea esto.
Saudos,
Daniel.

16 09 2010
DanMarthz

Hola buen tuto solo que tengan cuidado si copian el código, porque el porta papeles o el WorkBench copia las comillas como numerales :s

15 11 2011
Anónimo

Hola!. Quisiera saber si alguno pudo descargar a fichero local el ALV Tree. Desde ya muchas gracias!!

4 06 2013
ECordero

muy buen aporte me ayudo bastante..!!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




A %d blogueros les gusta esto: