Template de Alv con Ordenamientos,
agrupamientos, Colores y Logos
En este template vamos a presentar las siguientes cosas: 1. Colorear Columas
2. Colorear Lineas 3. Ordenar un Alv
4. Agrupar un Alv con subtotales 5. Agregar un Logo en el Top Of Page
Debajo de todo les dejo un ejemplo de programa integrador de todos
estos temas:
Antes que Empecemos la explicación de cómo colorear un alv, vamos a ver los códigos de colores con los cuales contamos y su clasificación:
CLSIFICACION DE COLORES: El color del ALV sigue el siguiente formato CXYZ donde...
C-> indica que es un color
X-> indica el numero de color, que debe ser del 1 al 9 Y-> indica la intensidad: ('0'=off / '1'=on).
1 – Alv con Columas de Colores:
Para poner colores en las columnas habrá que poner en el catálogo que se le pasa a la función ALV que esa columna la pinte de un determinado color. Para ello existe el campo "emphasize" en el catálogo donde se le introduce el color.
gt_catalog-col_pos = col_pos. gt_catalog-ref_tabname = 'MBEW'. gt_catalog-tabname = 'GT_DATOS'. gt_catalog-fieldname = 'MATNR'. gt_catalog-emphasize = 'C401'.
APPEND gt_catalog. CLEAR gt_catalog. ADD 1 TO col_pos.
Ejemplo:
2 – Alv con Filas de Colores
Declaracion:
TYPES: BEGIN OF ty_ztickets.
tickets like ztickets-tickets. cod_cliente like ztickets-cod_cliente, color(4).
END OF ty_ztickets.
DATA: it_ztickets TYPE TABLE OF ty_ztickets. DATA: wa_tk TYPE ty_ztickets.
En el Layout:
ls_layout-info_fieldname = 'COLOR'.
Y luego dependiendo alguna consicion se puede especificar que codigo de color mostrar: LOOP AT it_ztickets INTO wa_tk.
IF wa_tk-cant_hor_apro < 10. wa_tk-color = 'C600'. "Rojo" ELSEIF wa_tk-cant_hor_apro > 40. wa_tk-color = 'C500'. "Verde"
ELSE.
wa_tk-color = 'C400'. "Celeste"
ENDIF.
MODIFY it_ztickets FROM wa_tk. ENDLOOP.
Este código lo que se hace es pasarle un código de código diferente según el contenido del campo CANT_HOR_APRO.
3 – Ordenar Alv
Para ordenar un alv hay que agregar además de las variables LAYOUT, FIELDCAT, etc las siguientes:
DATA: ls_layout TYPE slis_layout_alv, lt_fieldcat TYPE slis_t_fieldcat_alv, ls_fieldcat TYPE slis_fieldcat_alv, lv_repid TYPE sy-repid,
t_sort TYPE slis_sortinfo_alv, it_sort TYPE slis_t_sortinfo_alv..
Y ya que estamos tambien agregamos un perform Sort entre los demas que teniamos:
PERFORM layout. PERFORM sort. PERFORM fieldcat.
Dentro de ese form Sort, vamos a especificar cuales son los campos por los cuales se debe ordenar, como también si el orden es ascendente o descendente.
La tabla puede ordenar por uno o más campos, donde en el campo SPOS de indicamos cual será el orden. *&---* *& Form SORT *&---* * text *---* * --> p1 text * <-- p2 text *---* FORM sort .
t_sort-fieldname = 'FECHA'. t_sort-tabname = 'IT_ZTICKETS'. t_sort-spos = 1.
t_sort-up = 'X'. t_sort-subtot = 'X'. APPEND t_sort TO it_sort. CLEAR t_sort.
t_sort-fieldname = 'COD_CLIENTE'. t_sort-tabname = 'IT_ZTICKETS'. t_sort-spos = 2.
t_sort-up = 'X'. t_sort-subtot = 'X'. APPEND t_sort TO it_sort. CLEAR t_sort.
ENDFORM. " SORT
Y luego en la llamada a la función del alv hay que agregar el registro:
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING i_callback_program = lv_repid is_layout = ls_layout it_fieldcat = lt_fieldcat it_sort = it_sort[] TABLES t_outtab = it_ztickets EXCEPTIONS program_error = 1
OTHERS = 2.
4 – Agrupar Alv
Esta parte de Agrupa complete el ordenamiento.
Y se agrupa poniéndole en el fieldcat del campo por el cual se quiere agrupar, lo siguiente:
ADD 1 TO lv_posi.
ls_fieldcat-col_pos = lv_posi.
ls_fieldcat-fieldname = 'CANT_HOR_APRO'. ls_fieldcat-tabname = 'IT_ZTICKETS'. ls_fieldcat-seltext_m = 'Horas Apro'.
ls_fieldcat-do_sum = 'X'. ls_fieldcat-datatype = 'CURR'.
APPEND ls_fieldcat TO lt_fieldcat. CLEAR ls_fieldcat.
5 – Agregando un logo en el Top-of-Page
Para Agregar el logo, solamente hay que agregar el registro a la función que grega los comentarios en el top-of-page:
De un logo que haya sido cargado por la transacción OAER.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
EJemplo integrador de todos los temas:
Porgrama: ZPRUEBA_ALV_SORT
*&---* *& Report ZPRUEBA_ALV_SORT
*&
*&---* *&
*&
*&---*
REPORT zprueba_alv_sort.
SELECTION-SCREEN: BEGIN OF BLOCK b01 WITH FRAME TITLE text-tit. SELECTION-SCREEN: BEGIN OF BLOCK b02 WITH FRAME TITLE text-ti2. PARAMETERS: p_top AS CHECKBOX USER-COMMAND top.
PARAMETERS: p_logo AS CHECKBOX.
SELECTION-SCREEN: SKIP.
SELECTION-SCREEN: BEGIN OF BLOCK b03 WITH FRAME TITLE text-ti3. PARAMETERS: p_sort AS CHECKBOX.
PARAMETERS: p_agru AS CHECKBOX. SELECTION-SCREEN: END OF BLOCK b03. SELECTION-SCREEN: SKIP.
SELECTION-SCREEN: BEGIN OF BLOCK b04 WITH FRAME TITLE text-ti4. PARAMETERS: p_scol RADIOBUTTON GROUP gr1.
PARAMETERS: p_colc RADIOBUTTON GROUP gr1. PARAMETERS: p_colr RADIOBUTTON GROUP gr1. SELECTION-SCREEN: END OF BLOCK b04. SELECTION-SCREEN: END OF BLOCK b01.
TYPES: BEGIN OF ty_ztickets.
INCLUDE STRUCTURE ztickets. TYPES: color(4).
TYPES: END OF ty_ztickets.
DATA: it_ztickets TYPE TABLE OF ty_ztickets. DATA: wa_tk TYPE ty_ztickets.
*variables de alv
TYPE-POOLS: slis.
DATA: ls_layout TYPE slis_layout_alv, lt_fieldcat TYPE slis_t_fieldcat_alv, ls_fieldcat TYPE slis_fieldcat_alv, lv_repid TYPE sy-repid,
t_sort TYPE slis_sortinfo_alv, it_sort TYPE slis_t_sortinfo_alv.. DATA: lv_top TYPE slis_formname.
DATA: lv_logo(30).
*Evento para Habilitar Opcion de Logo cuando se habilita Mostrar Top of P age
AT SELECTION-SCREEN OUTPUT. PERFORM habilitar_logo.
*Seleccion de Datos
PERFORM seleccion.
*Armado de Alv
PERFORM layout. PERFORM sort. PERFORM fieldcat.
*Ejecucion de Alv
PERFORM run_alv.
*&---* *& Form HABILITAR_LOGO *&---* * text *---* * --> p1 text * <-- p2 text *---* FORM habilitar_logo .
IF p_top = 'X'. "Si se eligio mostrar TOP OF PAGE
IF sy-ucomm = 'TOP'.
" Habilitar Opcion de Logo y Nombre
LOOP AT SCREEN.
IF screen-name = 'P_LOGO'. screen-input = 1.
MODIFY SCREEN. ENDIF.
IF screen-name = 'P_LOGNOM'. screen-input = 1.
MODIFY SCREEN. ENDIF. ENDLOOP. ENDIF. ELSE. "Sino se eleigio la opcion de TOP oF PAGe deshabilitar Opcion de Logo y Nombre
LOOP AT SCREEN.
IF screen-name = 'P_LOGO'. screen-input = 0.
MODIFY SCREEN. ENDIF.
IF screen-name = 'P_LOGNOM'. screen-input = 0.
MODIFY SCREEN. ENDIF.
ENDLOOP. ENDIF.
*&---* *& Form SELECCION *&---* * text *---* * --> p1 text * <-- p2 text *---* FORM seleccion . SELECT *
FROM ztickets
INTO TABLE it_ztickets.
*Si se eligio la opcion de Color por Filas
IF p_colr = 'X'.
LOOP AT it_ztickets INTO wa_tk. IF wa_tk-cant_hor_apro < 10.
wa_tk-color = 'C600'. "Rojo"
ELSEIF wa_tk-cant_hor_apro > 40.
wa_tk-color = 'C500'. "Verde"
ELSE.
wa_tk-color = 'C400'. "Celeste"
ENDIF.
MODIFY it_ztickets FROM wa_tk. ENDLOOP. ENDIF. ENDFORM. " SELECCION *&---* *& Form LAYOUT *&---* * text *---* * --> p1 text * <-- p2 text *---* FORM layout .
ls_layout-colwidth_optimize = 'X'. ls_layout-zebra = 'X'.
* Si se eligio la opcion de color por columnas
IF p_colr = 'X'.
ls_layout-info_fieldname = 'COLOR'. ENDIF.
ENDFORM. " LAYOUT
*&---* * text *---* * --> p1 text * <-- p2 text *---* FORM sort . * Significa que la IT_ZTICKETS a mostrar en el Alv se va a ordenar: * Primero por FECHA en forma ascendente mostrando subtotales * Segundo por COD_CLIENTE en forma ascentente mostrando subtotales
t_sort-fieldname = 'FECHA'. t_sort-tabname = 'IT_ZTICKETS'. t_sort-spos = 1.
t_sort-up = 'X'. t_sort-subtot = 'X'. APPEND t_sort TO it_sort. CLEAR t_sort.
t_sort-fieldname = 'COD_CLIENTE'. t_sort-tabname = 'IT_ZTICKETS'. t_sort-spos = 2.
t_sort-up = 'X'. t_sort-subtot = 'X'. APPEND t_sort TO it_sort. CLEAR t_sort.
ENDFORM. " SORT
*&---*& Form FIELDCAT
*&---FORM fieldcat .
DATA: lv_posi TYPE i. ADD 1 TO lv_posi.
ls_fieldcat-col_pos = lv_posi. ls_fieldcat-fieldname = 'FECHA'. ls_fieldcat-tabname = 'IT_ZTICKETS'. ls_fieldcat-seltext_m = 'Fecha'.
APPEND ls_fieldcat TO lt_fieldcat. CLEAR ls_fieldcat.
******************************************
ADD 1 TO lv_posi.
ls_fieldcat-col_pos = lv_posi.
ls_fieldcat-seltext_m = 'codigo cliente'.
* Si se eligio color por columas le indicar que color tendra ese columna
IF p_colc = 'X'.
ls_fieldcat-emphasize = 'C500'. ENDIF.
APPEND ls_fieldcat TO lt_fieldcat. CLEAR ls_fieldcat.
******************************************
ADD 1 TO lv_posi.
ls_fieldcat-col_pos = lv_posi. ls_fieldcat-fieldname = 'TICKET'. ls_fieldcat-tabname = 'IT_ZTICKETS'. ls_fieldcat-seltext_m = 'ticket'.
* Si se eligio color por columas le indicar que color tendra ese columna
IF p_colc = 'X'.
ls_fieldcat-emphasize = 'C501'. ENDIF.
APPEND ls_fieldcat TO lt_fieldcat. CLEAR ls_fieldcat.
******************************************
ADD 1 TO lv_posi.
ls_fieldcat-col_pos = lv_posi. ls_fieldcat-fieldname = 'ADMIN'. ls_fieldcat-tabname = 'IT_ZTICKETS'. ls_fieldcat-seltext_m = 'administrador'.
* Si se eligio color por columas le indicar que color tendra ese columna
IF p_colc = 'X'.
ls_fieldcat-emphasize = 'C510'. ENDIF.
APPEND ls_fieldcat TO lt_fieldcat. CLEAR ls_fieldcat.
******************************************
ADD 1 TO lv_posi.
ls_fieldcat-col_pos = lv_posi.
ls_fieldcat-fieldname = 'CANT_HOR_APRO'. ls_fieldcat-tabname = 'IT_ZTICKETS'. ls_fieldcat-seltext_m = 'Horas Apro'.
IF p_agru = 'X'.
ls_fieldcat-do_sum = 'X'. ls_fieldcat-datatype = 'CURR'. ENDIF.
* Si se eligio color por columas le indicar que color tendra ese columna
IF p_colc = 'X'.
ls_fieldcat-emphasize = 'C511'. ENDIF.
APPEND ls_fieldcat TO lt_fieldcat. CLEAR ls_fieldcat.
******************************************
ENDFORM. "fieldcat
*&---* *& Form top_of_page
*&---* * text
*---*
FORM top_of_page.
DATA: it_top TYPE slis_t_listheader. "TABLA DEL TOP_OF_PAGE
DATA: wa_top TYPE slis_listheader. DATA: cantidad(3).
*
REFRESH it_top. wa_top-typ = 'H'. wa_top-key = ''.
wa_top-info = 'Informacion de Alquileres'.
APPEND wa_top TO it_top.
DESCRIBE TABLE it_ztickets LINES cantidad. wa_top-typ = 'S'.
wa_top-key = ''.
APPEND wa_top TO it_top. wa_top-typ = 'S'.
wa_top-key = ''.
CONCATENATE 'Usuario:' sy-uname INTO wa_top-info SEPARATED BY space. APPEND wa_top TO it_top.
wa_top-typ = 'S'. wa_top-key = ''.
CONCATENATE 'Fecha:' sy-datum
INTO wa_top-info SEPARATED BY space. APPEND wa_top TO it_top.
*si se eligio un logo se lo pasamos a la funcion
IF p_logo = 'X'. lv_logo = p_lognom. ENDIF.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
i_logo = lv_logo it_list_commentary = it_top i_alv_form = 'X'.
ENDFORM. "top_of_page *&---* *& Form RUN_ALV *&---* * text *---* * --> p1 text * <-- p2 text *---* FORM run_alv . lv_repid = sy-repid. * Opcion de ver top of page
IF p_top = 'X'.
* Opcion de ordenar
IF p_sort <> 'X'. REFRESH it_sort. ENDIF.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = lv_repid is_layout = ls_layout it_fieldcat = lt_fieldcat i_callback_top_of_page = lv_top it_sort = it_sort[] TABLES
t_outtab = it_ztickets EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. " RUN_ALV