Saturday, May 19, 2007

ALV Tree Orientado a Objetos


Seguramente muchos de ustedes no saben como crear un ALV Tree y quizás menos sepan crearlo utilizando ABAP Orientado a Objetos...Yo hasta hace un par de semanas, tampoco sabía como hacerlo -:) Simplemente porque nunca me lo habían pedido...Así que aquí les dejo un ejemplo simple y funcional.


Lo único que necesitamos es un Dynpro 100, con un Custom Contro llamado TREE_CONTROL.


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.

Saludos,

Blag.


Technorati tags:

7 comments:

Anonymous said...

Buenas, por cierto no sabrás como hacer dicho ALV Tree que algún campo sea editable no? porque necesito que algún que otro registro de los nodos padres o hijos sean editables para así poder meter la información que se quiera. Espero tus noticias. frc.pity@gmail.com

Anonymous said...

hola, estuve revisando tu ejemplo, pero creo que no está bien definido el field-symbol, ya que al pasarlo a un editor da errores...

FIELD-SYMBOLS: LIKE LINE OF T_HEADER,
LIKE LINE OF T_SPFLI.

Alvaro "Blag" Tejada Galindo said...

Gracias! No me había dado cuenta de que no había reemplazo los tags de HTML, es por eso que los Field-Symbols no aparecían...ya está corregido -;)

Saludos,

Blag.

|3L_N3GR0| said...

Buenas, mi consulta es la misma que la que realizaron en un principio. Tengo un ALV TREE al cual necesito adicionarle un check box, el cual no es probelma, y un campo editable para agregar cierta informacion. Existe la manera de realizar esta opcion en este tipo de ALV TREE?
Saludos y atento a comentarios,
Alexis.
alexischavero@gmail.com

Anonymous said...

Hola me sumo al comentario de arriba. es posible hacer un campo del tree editable?
gracias.

Anonymous said...

Es posible que alguno de los campos del tree sea editable?
gracias

Jonathán Barrio said...

La información que tengo hasta la fecha es que no es posible hacer un TREE editable. Parece ser que SAP no ha habilitado en R/3 esa función para los TREE.

Hay un colega que dice "no me pidas lo que SAP no hace".