✒️ABAP El ALV jerárquico y el agrupamiento
ABAP El ALV jerárquico y el agrupamiento
ALV JERARQUICO Y AGRUPAMIENTO
AGRUPAMIENTO EN UN ALV
Podemos agrupar los registros que mostramos en un ALV. Para ello declaramos una tabla del tipo SLIS_T_SORTINFO_ALV y una estructura del tipo SLIS_SORTINFO_ALV.
* Tabla y estructura para ordenamiento
ti_sort TYPE slis_t_sortinfo_alv,
st_sort TYPE slis_sortinfo_alv ,
Luego antes de llamar a la función ALV, cargamos la tabla TI_SORT con los registros en el orden en que deseamos agrupar:
FORM ordenar .
CLEAR st_sort.
st_sort-spos = 1. " Orden del agrupamiento
st_sort-fieldname = 'ESTADO_CIVIL'. " Nombre del campo que agrupa
APPEND st_sort TO ti_sort.
ENDFORM. " ORDENAR
Ahora debemos completar el parámetro exporting IT_SORT con nuestra tabla interna TI_SORT.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = v_repid
i_callback_pf_status_set = 'PF_STATUS'
i_callback_user_command = 'USER_COMMAND'
it_fieldcat = ti_catalogo[]
i_callback_top_of_page = 'TOP_OF_PAGE'
is_layout = st_layout
it_sort = ti_sort
TABLES
t_outtab = ti_usuarios.
Finalmente si ejecutamos el reporte, veremos la agrupación por estado civil.
_____________________________________________
ALV JERÁRQUICO
Se utilizan para mostrar en un reporte, datos de cabecera y de posición. En las declaraciones de tablas internas de cabecera y posiciones debe haber como mínimo un campo en común.
En el caso que mostramos a continuación, el campo común es el CARRID, que es la compañía aérea.
* Tabla interna de la cabecera
DATA: BEGIN OF ti_cabecera OCCURS 0,
carrid LIKE scarr-carrid,
carrname LIKE scarr-carrname,
END OF ti_cabecera.
* Tabla interna de posiciones
DATA: BEGIN OF ti_detalle OCCURS 0,
carrid LIKE sflight-carrid,
connid LIKE sflight-connid,
fldate LIKE sflight-fldate,
price LIKE sflight-price,
currency LIKE sflight-currency,
planetype LIKE sflight-planetype,
END OF ti_detalle.
Debemos declarar una estructura del tipo SLIS_KEYINFO_ALV, que será ST_KEYINFO y contendrá el campo clave que une a las dos tablas internas.
* Campo Clave
st_keyinfo TYPE slis_keyinfo_alv.
Ahora vamos a cargar las tablas internas de cabecera y detalle con un juego de datos para la compañía aérea ARG. En el programa de ejemplo de la lección, también cargamos un juego de datos para la compañía aérea LAN.
FORM cargar_datos.
CLEAR: ti_cabecera, ti_detalle.
REFRESH: ti_cabecera, ti_detalle.
* CABECERA 1
ti_cabecera-carrid = 'ARG'.
ti_cabecera-carrname = 'Aerolineas Argentinas'.
APPEND ti_cabecera.
* DETALLE 1
ti_detalle-carrid = 'ARG'.
ti_detalle-connid = '1010'.
ti_detalle-fldate = '20091111'.
ti_detalle-price = '380'.
ti_detalle-currency = 'USD'.
ti_detalle-planetype = 'A310'.
APPEND ti_detalle.
* DETALLE 2
ti_detalle-carrid = 'ARG'.
ti_detalle-connid = '1020'.
ti_detalle-fldate = '20091011'.
ti_detalle-price = '300'.
ti_detalle-currency = 'USD'.
ti_detalle-planetype = 'A330'.
APPEND ti_detalle.
* CABECERA 2
ti_cabecera-carrid = 'LAN'.
ti_cabecera-carrname = 'Lan Chile'.
APPEND ti_cabecera.
* DETALLE 1
ti_detalle-carrid = 'LAN'.
ti_detalle-connid = '1030'.
ti_detalle-fldate = '20091005'.
ti_detalle-price = '500'.
ti_detalle-currency = 'USD'.
ti_detalle-planetype = 'A330'.
APPEND ti_detalle.
* DETALLE 2
ti_detalle-carrid = 'LAN'.
ti_detalle-connid = '1040'.
ti_detalle-fldate = '20091007'.
ti_detalle-price = '600'.
ti_detalle-currency = 'USD'.
ti_detalle-planetype = 'A330'.
APPEND ti_detalle.
ENDFORM. "cargar_datos
Luego crearemos el Catalogo del ALV para ambas tablas internas, sumando los campos de ambas tablas en la tabla del catalogo TI_CATALOGO.
FORM armado_catalogo_automatico.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = sy-repid
i_internal_tabname = 'TI_CABECERA'
i_client_never_display = 'X'
i_inclname = sy-repid
CHANGING
ct_fieldcat = ti_catalogo[]
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = sy-repid
i_internal_tabname = 'TI_DETALLE'
i_client_never_display = 'X'
i_inclname = sy-repid
CHANGING
ct_fieldcat = ti_catalogo[]
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
ENDFORM. "armado_catalogo_automatico
Ahora tenemos que completar la estructura ST_KEYINFO. En los campos HEADER01 y ITEM01 va a ir el campo de la tabla de cabecera que hace de vinculo con la tabla de detalles.
FORM keyinfo_init.
CLEAR st_keyinfo.
st_keyinfo-header01 = 'CARRID'.
st_keyinfo-item01 = 'CARRID'.
ENDFORM. "KEYINFO_INIT
Por ultimo, ejecutamos la función REUSE_ALV_HIERSEQ_LIST_DISPLAY.
FORM hierseq_list_display.
CALL FUNCTION 'REUSE_ALV_HIERSEQ_LIST_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'PF_STATUS'
it_fieldcat = ti_catalogo[]
i_tabname_header = 'TI_CABECERA'
i_tabname_item = 'TI_DETALLE'
is_keyinfo = st_keyinfo
TABLES
t_outtab_header = ti_cabecera
t_outtab_item = ti_detalle
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. "HIERSEQ_LIST_DISPLAY
AUDIO: En un ALV Jerárquico no podemos utilizar el evento TOP_OF_PAGE por lo que no será posible generar una cabecera con títulos y logos como en los ALV Grilla. Otra limitante que tienen los ALV Jerárquicos es que no podemos utilizar el botón de exportación de datos a Excel debido a las diferencias que existen entre el formato de cabecera y el formato de cada registro.
Y veremos el siguiente reporte ALV:
 
 
 
Sobre el autor
Publicación académica de Alexander Castellanos, en su ámbito de estudios para la Carrera Consultor ABAP.
Alexander Castellanos
Profesión: Ingeniero de Sistemas - Colombia - Legajo: JS42A
✒️Autor de: 67 Publicaciones Académicas
🎓Egresado del módulo:
Certificación Académica de Alexander Castellanos