Tamaño Columnas ALV
Para gestionar el ancho de las columnas hay dos opciones:
- Gestión Automática, el listado del ALV ya se encarga de gestionarlo automáticamente. Se configura en el layout LVC_S_LAYO-CWIDTH_OPT = 'X'. Dependiendo del tamaño de los valores del listado, las columnas varían de un tamaño a otro. Se puede llegar a acortar el título de la columna si el tamaño del valor del campo es menor al título. Para solucionar este último tema y que no se acorten los títulos se puede informar la denominación del título en catálogo LVC_S_FCAT-COLTEXT = 'Título'.
- Gestión Manual, mediante el catálogo de campos se configura el tamaño de la columna manualmente LVC_S_FCAT-OUTPUTLEN = '20'.
NOTA: Todos estos cambios que se realizan en el catálogo sólo afectan en la visualización, en la impresión no se tendrán en cuenta (se imprime en modo texto).
Al trabajar con ALV de OO es posible capturar los eventos de modificación mediante handle_data_changed_finished o handle_data_changed. Estos eventos se capturan si el usuario ha cambiado de celda o a utilizado tecla ENTER. Si el usuario el algún momento decide salir del programa se puede forzar manualmente la ejecución de dichos eventos mediante el método check_changed_data de la clase CL_GUI_ALV_GRID.
CALL METHOD gr_alv->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
Al tratar un instancia de tipo ALV (CL_GUI_ALV_GRID) se puede acceder a los datos que se muestran por medio del atributo MT_OUTTAB. Este atributo es accesible or debbugging pero si queremos acceder por código se puede utilizar el método GET_CELL_DATA que devuelve tabla con una estructura estándard (fila, columna, valor).
Para mostrar una ALV se utiliza el método SET_TABLE_FOR_FIRST_DISPLAY de la clase CL_GUI_ALV_GRID informando una tabla interna con los datos. Esta llamada sólo se debe realizar una única vez. En el caso de modificar el contenido de la tabla interna y querer refrescar los datos se debe llamar al método REFRESH_TABLE_DISPLAY de la misma clase (sin pasarle ningún párametro).
Al ejecutar algún botón estándard o Z de nuestro ALV puede ser que nos interese que proceso PAI del actual DYNPRO. Para esto es necesario informar el campo I_APPL_EVENTS = 'X' en la creación del objeto ALV.
CREATE OBJECT obj_alv_ges_adm
EXPORTING
i_parent = obj_container_ges_adm
i_appl_events = 'X'.En caso contrario el programa ejecuta la función de ALV y NO continua con el PAI.
**********************************************************************************
1) Definir capturador para el evento TOOLBAR y USER_COMMAND:
**********************************************************************************
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
handle_toolbar
FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive,
handle_user_command
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm,
ENDCLASS.**********************************************************************************
2) Definir implementación de los eventos (llama a una rutina)
**********************************************************************************
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_toolbar.
PERFORM handle_toolbar USING e_object.
ENDMETHOD. "handle_toolbar
METHOD handle_user_command.
PERFORM user_command USING e_ucomm.
ENDMETHOD. "handle_user_command
ENDCLASS.
**********************************************************************************
3) Definir rutinas: añadir botón y tratar acción del botón
**********************************************************************************
FORM handle_toolbar USING p_object TYPE REF TO cl_alv_event_toolbar_set.
DATA: ls_toolbar TYPE stb_button.
CLEAR ls_toolbar.
MOVE 'PER' TO ls_toolbar-function. "#EC NOTEXT
MOVE icon_display_text TO ls_toolbar-icon.
MOVE 'Passenger Info'(201) TO ls_toolbar-quickinfo.
MOVE 'Passenger Info'(201) TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled. "#EC NOTEXT
APPEND ls_toolbar TO p_object->mt_toolbar.
ENDFORM. " HANDLE_TOOLBAR
FORM user_command USING p_ucomm TYPE syucomm.
CASE p_ucomm.
WHEN 'PER'.
PERFORM sel_selected_rows_ims.
LEAVE SCREEN.
ENDCASE.
ENDFORM. " USER_COMMAND
**********************************************************************************
4) Registrar Eventos en el PBO
**********************************************************************************
SET HANDLER: lcl_event_receiver=>handle_user_command FOR obj_alv_ims,
lcl_event_receiver=>handle_toolbar FOR obj_alv_ims.
ALV Objetos - Mostrar las opciones de seleccionar y guardar variantes ALV
Se debe informar el parámetro IS_VARIANT del método SET_TABLE_FOR_FIRST_DISPLAY:
MOVE sy-repid TO gs_variant-report.NOTA: Las disposiciones se guardan en una tabla en la cual el nombre del programa es parte de la clave. Si se trabaja con subscreens y varios listados ALV en el mismo programa, hay la posibilidad de diferenciar las disposiciones informando campo:
gs_variant-handle = 'ID_que_queremos'.
Se informa una campo de la variable de layout:
po_layout-no_toolbar = 'X'.
Para redefinir botón standard del la barra de herramientas de un ALV OO:
***********************************************************************************
1) Definir capturador para el evento BEFORE_USER_COMMAND y generar otro evento:
***********************************************************************************
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
handle_before_user_command
FOR EVENT before_user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
handle_user_command
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm,
ENDCLASS. "lcl_event_receiver DEFINITION
***********************************************************************************
2) Definir implemetación de los eventos (llama a una rutina)
***********************************************************************************
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_before_user_command.
PERFORM handle_before_user_command USING e_ucomm.
ENDMETHOD. "handle_before_user_command
METHOD handle_user_command.
PERFORM user_command USING e_ucomm.
ENDMETHOD. "handle_user_command
ENDCLASS.
***********************************************************************************
3) Definir rutinas: recuperar el código del botón estándard y llama a otro.***********************************************************************************
FORM handle_before_user_command USING p_ucomm TYPE syucomm.
CASE p_ucomm .
WHEN '&DETAIL'.
CALL METHOD obj_alv_ims->set_user_command
EXPORTING
i_ucomm = 'SEL_DETAIL_IMS'.
ENDCASE .
ENDFORM. " HANDLE_BEFORE_USER_COMMAND
FORM user_command USING p_ucomm TYPE syucomm.
CASE p_ucomm.
WHEN 'SEL_DETAIL_IMS'.
PERFORM sel_selected_rows_ims.
LEAVE SCREEN.
ENDCASE.
ENDFORM. " USER_COMMAND
***********************************************************************************
4) Registrar Eventos en el PBO
***********************************************************************************
SET HANDLER: lcl_event_receiver=>handle_before_user_command FOR obj_alv_ims.
SET HANDLER: lcl_event_receiver=>handle_user_command FOR obj_alv_ims.***********************************************************************************
NOTA:
***********************************************************************************
- Para forzar PBO del dynpro LEAVE SCREEN.
En el modulo de funcion REUSE_ALV_GRID_DISPLAY hay la posibilidad de configurar el tratamiento de las variantes del ALV mediante el parametro de entrada I_SAVE. Valores posible
I_SAVE = ' ' no se puede ni modificar ni crear variantes.
I_SAVE = 'X' solo se puede crear y modificar las variantes standard (el nombre empieza por ‘/’) .
I_SAVE = 'U' solo se puede crear y modificar las variantes especificas de usuario (el nombre no empieza por ‘/’) .
I_SAVE = 'A' permite crear y modificar tanto las variantes especificas de usuario como las standard.
En todos los casos se permiter recuperar variantes previamente creados.
Pasos:
1) Crear botón en el status y asignarle código.
2) En la rutina USER_COMMAND chequear código y volver hacer la llamada al módulo de funciónREUSE_ALV_GRID_DISPLAY informando el campo IS_VARIANT .
3) En la misma rutina USER_COMMAND llamar a la sentencia LEAVE TO SCREEN O. Es llamada es imprescinble porque al realizar la llamada a REUSE_ALV_GRID_DISPLAY se crear una nueva pantalla a pesar que no es perceptible. En el caso de no poner dicha sentencia para salir del programa seria necesari pulsar el boton BACK tantas veces como cambios de variantes realizadas.
Las pasos para mostrar un icono en un listado ALV son:
- Definir un campo en nuestra estructura de datos de tipo char con 4 dígitos. ICONO TYPE CHAR4
- Incluir el grupo de tipos ICON. TYPE-POOLS: ICON.
- Informar el icono que se quiere mostrar en nuestra estructura IT_ALV-ICONO = '@08@' Gracias a incluir ICON podemos utilizar las constantes IT_ALV_ICONO = ICON_GREEN_LIGHT.
- Informar en el catálogo que el campo muestra un icono. fieldcat-icon = 'X'.
Para mostrar un ALV se debe utilizar el módulo de función REUSE_ALV_GRID_DISPLAY. Es necesario informar los campos del catálogo (campo it_fieldcat). Para ello se puede utilizar el módulo de función REUSE_ALV_FIELDCATALOG_MERGE que recupera el catálogo a partir de una tabla interna del programa, una tabla del diccionario o una estructura del diccionario.
ROW_POS:
Solo se informará este campo en el caso en el que el report de salida sea multilínea. Valores: 0, 1, 2 y 3.
COL_POS:
Solo es relevante en el caso que se quiera que la salida en el listado tenga un orden distinto a su posición en la tabla interna de datos.
TABNAME:
Nombre de la tabla interna que contiene los datos a mostrar en el listado.
REF_FIELDNAME:
Nombre del campo de la tabla del diccionario de datos al cual está referenciado el campo de la tabla interna (en el caso en el que lo esté).
CFIELDNAME:
Nombre del campo de la tabla interna de datos que contiene la moneda para el campo importe.
CTABNAME:
Este dato sólo es relevante informarlo para listados con más de una cabecera.
QFIELDNAME:
Nombre del campo de la tabla interna de datos que contiene la unidad de medida para el campo cantidad.
QTABNAME:
Este dato solo es relevante informarlo para listados con más de una cabecera.
OUTPUTLEN:
Siempre que el campo a mostrar en el listado de salida no esté referenciado a ningún campo de tabla del diccionario, se especificará aquí la longitud de salida del campo.
KEY:
El campo del registro actual se tomará como clave si se marca este campo. No podrá ocultarse en el listado de salida este campo.
KEY_SEL:
El campo será clave, pero podrá no salir en el listado de salida.
NO_OUT:
El campo no será mostrado en el listado de salida.
TECH:
Si se marca este campo, el campo actual no puede nunca salir en el listado de salida.
EMPHASIZE:
Para mostrar el campo de algún color.
HOTSPOT:
El campo aparece como hotspot.
FIX_COLUMN:
Si se marca, este campo aparecería como columna fija.
DO_SUM:
Se calculará la suma de este campo.
NO_SUM:
No se calculará la suma de este campo.
ICON:
El campo será mostrado como un icono.
SYMBOL:
El campo será mostrado como un símbolo.
JUST:
Justificación del campo. R= justificado a la derecha, L= justificado a la izquierda, C= centrado.
LZERO:
Mostrará los campos de tipo NUMC justificados a la derecha y sin ceros a la izquierda.
NO_SIGN:
Mostrará el campo sin signos.
NO_ZERO:
Suprime los 0’s.
EDIT_MASK:
Mostrará el campo con una máscara.
SELTEXT_L:
Se mostrará en la cabecera de la columna el texto largo de la definición del campo en la tabla del diccinario de datos.
SELTEXT_M:
Se mostrará en la cabecera de la columna el texto medio de la definición del campo en la tabla del diccinario de datos.
SELTEXT_S:
Se mostrará en la cabecera de la columna el texto corto de la definición del campo en la tabla del diccinario de datos.
DDICTXT:
Especificará mediante L, M y S el texto largo, medio o corto que se utilizará en los títulos de las cabeceras.
DATATYPE:
Se especificará cuando el campo de la tabla interna de datos no esté referenciado a ningún campo de tabla del diccionario de datos.
DDIC_OUTPUTLEN:
Especifica la longitud de salida. Para campos no referenciados al diccionario de datos.
SP_GROUP:
Si se marca este campo, el campo actual pertenecerá a un grupo que se especificará después en el parámetro IT_SPECIAL_GROUPS.
REPREP:
El campo será tomado como un criterio de selección
1) Informar campos en el catálogo:
l_fieldcat-edit = 'X'.
l_fieldcat-input = 'X'.
2) Declarar variable que se utilizará llamada ALV:
DATA: g_it_grid_setting TYPE lvc_s_glay.
3) Informar variable que se utilizará llamada ALV:
g_it_grid_setting-edt_cll_cb = 'X'.
4) En la llamada 'REUSE_ALV_GRID_DISPLAY añadir parametro:
i_grid_settings = g_it_grid_setting
COMENTARIO:
Útil si el que registro que modificamos en el ALV es el que justamente después seleccionamos con el checbox para tratar.
En una ALV se pueden añadir botones a la barra de STATUS que realicen operaciones sobre los registros. Nos puede interesar actualizar los valores que se muestran en el ALV, si se modifica algún valor de la tabla interna que tiene asociada. Tenemos que capturar la ejecución del nuevo botón en la rutina USER_COMMAND, consultar de nuevo los datos de la base de datos (recomendable tener cread una rutina) y volver a mostrar la información actualizada por pantalla. Esta última operación se realiza forzando la ejecución del evento de refresco que se realiza con la siguiente asignación: i_ucomm = '&REFRESH'.
Tenemos 2 opciones:
1) Mostrar un fila de un color, añadir un campo en la tabla interna de tipo CHAR04 que se le pasa al MF i guardar el nombre de este campo en la variable del LAYOUT g_layout-info_fieldname = 'COLOR'.
ROJO -> C600
2) Mostrar un columna de un color, cuando se informa los valores para el catálogo, además informar el campo g_catalog-emphasize= C123, 1=> color, 2 y 3 => intensidad.
Para más info sobre los colores:
http://www.abap.es/Centro_ALV_colores.htm
Mostrar un campo en la pantalla de selección para seleccionar una variante previamente guardada.1) Crear variables:
DATA: ls_variant TYPE disvariant.
PARAMETERS p_dispo LIKE disvariant-variant.
2) Mostrar matchcode variantes
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_dispo.
MOVE: p_dispo TO ls_variant-variant,
sy-repid TO ls_variant-report.
CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
EXPORTING
is_variant = ls_variant
IMPORTING
es_variant = ls_variant
EXCEPTIONS
not_found = 1
program_error = 2
OTHERS = 3.
MOVE ls_variant-variant TO p_dispo.
3)Indicar variante al mostrar ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
is_variant = ls_variant
ALV - Ejemplo de ALV sencillo
*&---------------------------------------------------------------------*
*& Report zcnps075
*&
*&---------------------------------------------------------------------*
*& ALV COMPARA TX CJ20N CON TX PPOME
*&
*&---------------------------------------------------------------------*
REPORT zcnps075 NO STANDARD PAGE HEADING.
INCLUDE zcnps075_top.
INCLUDE zcnps075_f01.
************************************************************************
* Acciones previas a mostrar la pantalla *
************************************************************************
AT SELECTION-SCREEN.
PERFORM check_data_initial.
START-OF-SELECTION.
PERFORM get_data.
DESCRIBE TABLE gt_alv.
IF sy-tfill = 0.
EXIT.
ENDIF.
END-OF-SELECTION.
PERFORM alv_report USING gt_alv[].
*&---------------------------------------------------------------------*
*& Include Z_ALV_CJ20N_VS_PPOME_TOP
*&---------------------------------------------------------------------*
*Declaraciones estructuras
TYPES: BEGIN OF gs_proj,
posid TYPE prps-posid, "Elemento PEP
pbukr TYPE prps-pbukr, "Sociedad
pgsbr TYPE prps-pgsbr, "Division
prctr TYPE prps-prctr, "Centro beneficio
zzxubname1 TYPE prps-zzxubname1, "Jefe de Obra
denomin_JO_CJ TYPE string,
zzxubname2 TYPE prps-zzxubname2, "Administrativo de Obra
denomin_AO_CJ TYPE string,
jo_ppome TYPE hrp1000-uname, "Jefe Obra Ppome
denomin_JO_PP TYPE string,
ao_ppome TYPE hrp1000-uname, "Administrativo Obra Ppome
denomin_AO_PP TYPE string,
color(4) TYPE c, "Color
check,
END OF gs_proj.
*Otras declaraciones
DATA: gt_alv TYPE STANDARD TABLE OF gs_proj.
DATA: gv_ucomm LIKE sy-ucomm.
DATA: gv_name TYPE prps-zzxubname1.
*Type Pool donde viene definidas todas las estructuras y tablas
TYPE-POOLS: slis.
*tablas. Catalogo de campos
*Estructura de parámetros
DATA: lf_sp_group TYPE slis_t_sp_group_alv, " Manejar grupos de campos
lf_layout TYPE slis_layout_alv, " Manejar diseño de layout
it_top_header TYPE slis_t_listheader, " Manejar cabecera del rep
wa_top LIKE LINE OF it_top_header." Linea para cabecera
*Manejar catálogo de parámetros
DATA: gt_alv_git_fieldcat TYPE slis_t_fieldcat_alv.
DATA: wa_alv_filedcat LIKE LINE OF gt_alv_git_fieldcat.
TABLES: prps. "Genera wa del mismo nombre de la tabla.
*-----------------------------------------------------------------------
* >> PANTALLA DE SELECCION
*-----------------------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK frame1 WITH FRAME TITLE text-001.
SELECT-OPTIONS so_posid FOR prps-posid. "Elemento PEP
SELECT-OPTIONS so_soc FOR prps-pbukr. "Sociedad del proyecto
SELECT-OPTIONS so_div FOR prps-pgsbr. "División del proyecto
SELECT-OPTIONS so_cebe FOR prps-prctr. "Centro de beneficio
SELECTION-SCREEN END OF BLOCK frame1.
*&---------------------------------------------------------------------*
*& Include Z_ALV_CJ20N_VS_PPOME_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form check_data_initial
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM check_data_initial.
IF so_soc IS INITIAL AND
so_div IS INITIAL AND
so_cebe IS INITIAL AND
so_posid IS INITIAL.
MESSAGE text-002 TYPE 'I'.
ENDIF.
ENDFORM. "check_data_initial
*&---------------------------------------------------------------------*
*& Form check_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM get_data.
DATA: t_objid TYPE STANDARD TABLE OF hrp1000-objid.
DATA: lv_short TYPE gs_proj.
DATA: lv_type TYPE c.
FIELD-SYMBOLS <fs_alv> TYPE gs_proj.
DATA: lv_cebe TYPE gs_proj-prctr.
SELECT posid pbukr pgsbr prctr zzxubname1 zzxubname2
FROM prps
INTO CORRESPONDING FIELDS OF TABLE gt_alv
WHERE posid IN so_posid AND
pbukr IN so_soc AND
pgsbr IN so_div AND
prctr IN so_cebe AND
stufe = '1'."Nivel 1 jerarquía
IF sy-subrc NE 0.
MESSAGE 'No existen datos segun criterio seleccionado'(003) TYPE 'I'.
ENDIF.
*1.- Recorro la tabla de valores que he obtenido con los datos de la PS
LOOP AT gt_alv ASSIGNING <fs_alv>.
*Buscar Jefe Obra HRP1000-short = CN...
lv_type = 'J'.
PERFORM busca_datos USING <fs_alv> lv_type.
lv_cebe = <fs_alv>-prctr.
*Buscar Admin Obra HRP1000-short = A_CN...
CONCATENATE 'A_' <fs_alv>-prctr INTO <fs_alv>-prctr.
lv_type = 'A'.
PERFORM busca_datos USING <fs_alv> lv_type.
<fs_alv>-prctr = lv_cebe.
CLEAR lv_type.
ENDLOOP.
ENDFORM. "get_data
*&---------------------------------------------------------------------*
*& Form busca_datos
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM busca_datos USING fv_alv TYPE gs_proj
fv_type TYPE c.
DATA: lv_objid TYPE hrp1000-objid.
DATA: lv_sobid TYPE hrp1001-sobid.
DATA: lv_name TYPE string.
TYPES: BEGIN OF ls_hrp1001,
sobid TYPE hrp1001-sobid,
priox TYPE hrp1001-priox,
END OF ls_hrp1001.
DATA: it_aux TYPE STANDARD TABLE OF ls_hrp1001.
DATA: wa_aux LIKE LINE OF it_aux.
*Buscar Jefe Obra HRP1000-short = CN... o = A_CN...
*Busco en la HRP100 el objid
SELECT SINGLE objid FROM hrp1000
INTO lv_objid
WHERE short = fv_alv-prctr.
*Busco id objeto vinculado
*con campo particularidad de nelace = descendentes (B)
* y Vinculación entre objetos = pertenece (012)
SELECT SINGLE sobid FROM hrp1001 INTO lv_sobid
WHERE objid = lv_objid AND rsign = 'B'(004)
AND relat = '012'(005).
*con el id objeto vinculado busco el usuario
* SELECT SINGLE sobid FROM hrp1001 INTO gv_name
* WHERE objid = lv_sobid AND sclas = 'US'(006).
SELECT sobid priox FROM hrp1001 INTO TABLE it_aux
WHERE objid = lv_sobid AND sclas = 'US'(006)
AND begda <= sy-datum AND endda >= sy-datum.
*si existen dos lineas nos quedamos con la que tenga mayor prioridad.
DESCRIBE TABLE it_aux.
IF sy-tfill = 1.
READ TABLE it_aux INDEX 1 INTO wa_aux.
gv_name = wa_aux-sobid.
ELSEIF sy-tfill > 1.
READ TABLE it_aux WITH KEY priox = 'AA' INTO wa_aux.
IF sy-subrc EQ 0.
gv_name = wa_aux-sobid.
ELSE.
READ TABLE it_aux INDEX sy-tfill INTO wa_aux.
gv_name = wa_aux-sobid.
ENDIF.
ENDIF.
IF fv_type = 'J'(007).
fv_alv-jo_ppome = gv_name.
ENDIF.
IF fv_type = 'A'(008).
fv_alv-ao_ppome = gv_name.
ENDIF.
CLEAR gv_name.
*Ponemos color a las columnas, si el administrativo de la CJ20N es el mismo que el de la PPOME = verde sin rojo
*Igual para el jefe de obra
IF fv_alv-jo_ppome IS INITIAL OR fv_alv-ao_ppome IS INITIAL.
fv_alv-color = 'C600'(033). "rojo
ELSEIF fv_alv-zzxubname1 NE fv_alv-jo_ppome OR fv_alv-zzxubname2 NE fv_alv-ao_ppome.
fv_alv-color = 'C611'(009). "rojo
ELSE.
fv_alv-color = 'C511'(010). "verde
ENDIF.
PERFORM get_user USING fv_alv-jo_ppome CHANGING lv_name.
fv_alv-denomin_jo_pp = lv_name.
PERFORM get_user USING fv_alv-ao_ppome CHANGING lv_name.
fv_alv-denomin_ao_pp = lv_name.
PERFORM get_user USING fv_alv-zzxubname1 CHANGING lv_name.
fv_alv-denomin_jo_cj = lv_name.
PERFORM get_user USING fv_alv-zzxubname2 CHANGING lv_name.
fv_alv-denomin_ao_cj = lv_name.
ENDFORM. "busca_datos
*&---------------------------------------------------------------------*
*& Include Z_ALV_F01
*&---------------------------------------------------------------------*
*performs del ALV
FORM alv_report USING pp_itab LIKE gt_alv[].
* PERFORM elimina_reg USING gt_alv[].
PERFORM sp_group_build USING lf_sp_group[].
PERFORM alv_ini_fieldcat.
PERFORM layout_build USING lf_layout.
PERFORM alv_listado USING pp_itab[].
ENDFORM. "ALV REPORT
*FORM SP_GROUP_BUILD para crear los grupos de campos
FORM sp_group_build USING u_lf_sp_group TYPE slis_t_sp_group_alv.
DATA: ls_sp_group TYPE slis_sp_group_alv.
CLEAR ls_sp_group.
ls_sp_group-sp_group = 'A'.
ls_sp_group-text = text-010.
APPEND ls_sp_group TO u_lf_sp_group.
ENDFORM. "sp_group_build
*Form para crear el catalogo de campos con sus propiedades
FORM alv_ini_fieldcat.
*Elemento PEP
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'POSID'.
wa_alv_filedcat-key = ''.
wa_alv_filedcat-seltext_m = 'Elemento PEP'(011).
wa_alv_filedcat-seltext_l = 'Elemento PEP'(011).
wa_alv_filedcat-col_pos = 1.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Sociedad
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'PBUKR'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'Sociedad'(012).
wa_alv_filedcat-seltext_l = 'Sociedad'(012).
wa_alv_filedcat-col_pos = 2.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Division
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'PGSBR'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'Division'(013).
wa_alv_filedcat-seltext_l = 'Division'(013).
wa_alv_filedcat-col_pos = 3.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Centro beneficio
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'PRCTR'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'CEBE'(014).
wa_alv_filedcat-seltext_l = 'CEBE'(014).
wa_alv_filedcat-col_pos = 4.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Jefe Obra
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'ZZXUBNAME1'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'J.O. CJ20N'(015).
wa_alv_filedcat-seltext_l = 'J.O. CJ20N'(015).
wa_alv_filedcat-col_pos = 5.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Jefe Obra CJ20N denominación
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'DENOMIN_JO_CJ'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'J.O.Name CJ20N'(034).
wa_alv_filedcat-seltext_l = 'J.O.Name CJ20N'(034).
wa_alv_filedcat-col_pos = 6.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Centro beneficio
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'JO_PPOME'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'J.O. PPOME'(017).
wa_alv_filedcat-seltext_l = 'J.O. PPOME'(017).
wa_alv_filedcat-col_pos = 7.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Jefe Obra PPOME denominación
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'DENOMIN_JO_PP'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'J.O.Name PPOME'(035).
wa_alv_filedcat-seltext_l = 'J.O.Name PPOME'(035).
wa_alv_filedcat-col_pos = 8.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Administrativo Obra
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'ZZXUBNAME2'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'A.O.CJ20N'(016).
wa_alv_filedcat-seltext_l = 'A.O.CJ20N'(016).
wa_alv_filedcat-col_pos = 9.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Administrativo Obra CJ20N denominación
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'DENOMIN_AO_CJ'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'A.O.Name CJ20N'(036).
wa_alv_filedcat-seltext_l = 'A.O.Name CJ20N'(036).
wa_alv_filedcat-col_pos = 10.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Centro beneficio
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'AO_PPOME'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'A.O. PPOME'(018).
wa_alv_filedcat-seltext_l = 'A.O. PPOME'(018).
wa_alv_filedcat-col_pos = 11.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*AdministrativoObra PPOME denominación
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'DENOMIN_AO_PP'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'A.O.Name PPOME'(037).
wa_alv_filedcat-seltext_l = 'A.O.Name PPOME'(037).
wa_alv_filedcat-col_pos = 12.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
ENDFORM. "alv_ini_fieldcat
*form para diseñar el layout de salida del ALV.
FORM layout_build USING u_lf_layout TYPE slis_layout_alv.
u_lf_layout-box_fieldname = 'CHECK'. " Checkbox
u_lf_layout-zebra = 'X'.
u_lf_layout-colwidth_optimize = 'X'.
* u_lf_layout-get_selinfos = 'X'.
* u_lf_layout-f2code = 'BEAN'.
* u_lf_layout-confirmation_prompt = 'X'.
* u_lf_layout-key_hotspot ='X'.
*Para poner color a las columnas
u_lf_layout-info_fieldname = 'COLOR'.
ENDFORM. "layout_build
*form para invocar al ALV.
FORM alv_listado USING pp_itab LIKE gt_alv[].
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_top_of_page = 'TOP_OF_PAGE'
i_callback_program = sy-repid* i_callback_pf_status_set = 'PF_STATUS'
* i_callback_user_command = 'USER_COMMAND'
is_layout = lf_layout
it_fieldcat = gt_alv_git_fieldcat[]* it_special_groups = lf_sp_group
i_save = 'X'
TABLES
t_outtab = pp_itab
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. "alv_listado
*E1 FORM TOP_OF_PAGE nos permite configurar la cabecera del reporte
FORM top_of_page.
*ALV Header declarations
DATA: t_header TYPE slis_t_listheader,
wa_header TYPE slis_listheader.
*Title
CLEAR wa_header.
wa_header-typ = 'H'.
wa_header-info = 'Comparacion datos CJ20N con PPOME'(019).
APPEND wa_header TO t_header.
*Date
CLEAR wa_header.
wa_header-typ = 'S'.
wa_header-key = 'Date:'(032).
CONCATENATE sy-datum+6(2) '.'
sy-datum+4(2) '.'
sy-datum(4) INTO wa_header-info. "todays date
APPEND wa_header TO t_header.
* Records Selected
CLEAR wa_header.
wa_header-typ = 'S'.
IF so_posid-low IS NOT INITIAL AND so_posid-high IS INITIAL.
CONCATENATE 'Elem. PEP :'(020) so_posid-low
INTO wa_header-info.
ELSEIF so_posid-low IS NOT INITIAL AND so_posid-high IS NOT INITIAL.
wa_header-typ = 'S'.
CONCATENATE 'Elem. PEP desde:'(021) so_posid-low space 'Elem. PEP hasta:'(022) so_posid-high
INTO wa_header-info.
ENDIF.
APPEND wa_header TO t_header.
CLEAR wa_header.
wa_header-typ = 'S'.
IF so_soc-low IS NOT INITIAL AND so_soc-high IS INITIAL.
CONCATENATE 'Sociedad del proyecto:'(023) so_soc-low
INTO wa_header-info.
ELSEIF so_soc-low IS NOT INITIAL AND so_soc-high IS NOT INITIAL.
CONCATENATE 'Soc. proy. desde:'(024) so_soc-low 'Soc.proy. hasta:'(025) so_soc-high
INTO wa_header-info SEPARATED BY space.
ENDIF.
APPEND wa_header TO t_header.
CLEAR wa_header.
wa_header-typ = 'S'.
IF so_div-low IS NOT INITIAL AND so_div-high IS INITIAL.
CONCATENATE 'Div. del proyecto:'(026) so_div-low
INTO wa_header-info.
ELSEIF so_div-low IS NOT INITIAL AND so_div-high IS NOT INITIAL.
CONCATENATE 'Div. proy. desde:'(027) so_div-low space 'Div. proy. hasta:'(028) so_div-high
INTO wa_header-info.
ENDIF.
APPEND wa_header TO t_header.
CLEAR wa_header.
wa_header-typ = 'S'.
IF so_cebe-low IS NOT INITIAL AND so_cebe-high IS INITIAL.
CONCATENATE 'Centro de beneficio:'(029) so_cebe-low
INTO wa_header-info.
ELSEIF so_cebe-low IS NOT INITIAL AND so_cebe-high IS NOT INITIAL.
CONCATENATE 'CEBE desde:'(030) so_cebe-low space 'CEBE hasta:'(031) so_cebe-high
INTO wa_header-info.
ENDIF.
APPEND wa_header TO t_header.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = t_header.
* i_logo = 'Z_LOGO'.
ENDFORM. "top_of_page
*&---------------------------------------------------------------------*
*& Form GET_USER
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_user USING fv_user
CHANGING fv_name.
DATA: gw_address LIKE bapiaddr3,
gt_return LIKE TABLE OF bapiret2.
TYPES: BEGIN OF ls_users,
user TYPE prps-zzxubname2,
name_user TYPE string,
END OF ls_users.
DATA: lt_users TYPE HASHED TABLE OF ls_users WITH UNIQUE KEY user.
DATA: wa_user LIKE LINE OF lt_users.
*si me pasan un usuario vacio no busco nada
IF fv_user IS NOT INITIAL.
*Leo la tabla auxiliar de usuarios, si no existe el usuario, lo busco por BAPI, si existe lo leo.
READ TABLE lt_users INTO wa_user WITH KEY user = fv_user.
IF sy-subrc EQ 0. "Existe en el buffer
fv_name = wa_user-name_user.
ELSE. "No existe en el buffer
*obtenemos el nombre completo
CALL FUNCTION 'BAPI_USER_GET_DETAIL'
EXPORTING
username = fv_user
cache_results = 'X'
IMPORTING
address = gw_address
TABLES
return = gt_return.
CONCATENATE gw_address-firstname gw_address-lastname
INTO fv_name SEPARATED BY ' '.
wa_user-user = fv_user.
wa_user-name_user = fv_name.
fv_name = gw_address-fullname.
INSERT wa_user INTO TABLE lt_users.
CLEAR gw_address.
ENDIF.
ENDIF.
ENDFORM. " GET_USER
- Gestión Automática, el listado del ALV ya se encarga de gestionarlo automáticamente. Se configura en el layout LVC_S_LAYO-CWIDTH_OPT = 'X'. Dependiendo del tamaño de los valores del listado, las columnas varían de un tamaño a otro. Se puede llegar a acortar el título de la columna si el tamaño del valor del campo es menor al título. Para solucionar este último tema y que no se acorten los títulos se puede informar la denominación del título en catálogo LVC_S_FCAT-COLTEXT = 'Título'.
- Gestión Manual, mediante el catálogo de campos se configura el tamaño de la columna manualmente LVC_S_FCAT-OUTPUTLEN = '20'.
NOTA: Todos estos cambios que se realizan en el catálogo sólo afectan en la visualización, en la impresión no se tendrán en cuenta (se imprime en modo texto).
CALL METHOD gr_alv->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
CREATE OBJECT obj_alv_ges_adm
EXPORTING
i_parent = obj_container_ges_adm
i_appl_events = 'X'.En caso contrario el programa ejecuta la función de ALV y NO continua con el PAI.
1) Definir capturador para el evento TOOLBAR y USER_COMMAND:
**********************************************************************************
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
handle_toolbar
FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive,
handle_user_command
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm,
ENDCLASS.**********************************************************************************
2) Definir implementación de los eventos (llama a una rutina)
**********************************************************************************
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_toolbar.
PERFORM handle_toolbar USING e_object.
ENDMETHOD. "handle_toolbar
METHOD handle_user_command.
PERFORM user_command USING e_ucomm.
ENDMETHOD. "handle_user_command
ENDCLASS.
**********************************************************************************
3) Definir rutinas: añadir botón y tratar acción del botón
**********************************************************************************
FORM handle_toolbar USING p_object TYPE REF TO cl_alv_event_toolbar_set.
DATA: ls_toolbar TYPE stb_button.
CLEAR ls_toolbar.
MOVE 'PER' TO ls_toolbar-function. "#EC NOTEXT
MOVE icon_display_text TO ls_toolbar-icon.
MOVE 'Passenger Info'(201) TO ls_toolbar-quickinfo.
MOVE 'Passenger Info'(201) TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled. "#EC NOTEXT
APPEND ls_toolbar TO p_object->mt_toolbar.
ENDFORM. " HANDLE_TOOLBAR
FORM user_command USING p_ucomm TYPE syucomm.
CASE p_ucomm.
WHEN 'PER'.
PERFORM sel_selected_rows_ims.
LEAVE SCREEN.
ENDCASE.
ENDFORM. " USER_COMMAND
**********************************************************************************
4) Registrar Eventos en el PBO
**********************************************************************************
SET HANDLER: lcl_event_receiver=>handle_user_command FOR obj_alv_ims,
lcl_event_receiver=>handle_toolbar FOR obj_alv_ims.
MOVE sy-repid TO gs_variant-report.NOTA: Las disposiciones se guardan en una tabla en la cual el nombre del programa es parte de la clave. Si se trabaja con subscreens y varios listados ALV en el mismo programa, hay la posibilidad de diferenciar las disposiciones informando campo:
gs_variant-handle = 'ID_que_queremos'.
po_layout-no_toolbar = 'X'.
***********************************************************************************
1) Definir capturador para el evento BEFORE_USER_COMMAND y generar otro evento:
***********************************************************************************
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
handle_before_user_command
FOR EVENT before_user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
handle_user_command
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm,
ENDCLASS. "lcl_event_receiver DEFINITION
***********************************************************************************
2) Definir implemetación de los eventos (llama a una rutina)
***********************************************************************************
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_before_user_command.
PERFORM handle_before_user_command USING e_ucomm.
ENDMETHOD. "handle_before_user_command
METHOD handle_user_command.
PERFORM user_command USING e_ucomm.
ENDMETHOD. "handle_user_command
ENDCLASS.
***********************************************************************************
3) Definir rutinas: recuperar el código del botón estándard y llama a otro.***********************************************************************************
FORM handle_before_user_command USING p_ucomm TYPE syucomm.
CASE p_ucomm .
WHEN '&DETAIL'.
CALL METHOD obj_alv_ims->set_user_command
EXPORTING
i_ucomm = 'SEL_DETAIL_IMS'.
ENDCASE .
ENDFORM. " HANDLE_BEFORE_USER_COMMAND
FORM user_command USING p_ucomm TYPE syucomm.
CASE p_ucomm.
WHEN 'SEL_DETAIL_IMS'.
PERFORM sel_selected_rows_ims.
LEAVE SCREEN.
ENDCASE.
ENDFORM. " USER_COMMAND
***********************************************************************************
4) Registrar Eventos en el PBO
***********************************************************************************
SET HANDLER: lcl_event_receiver=>handle_before_user_command FOR obj_alv_ims.
SET HANDLER: lcl_event_receiver=>handle_user_command FOR obj_alv_ims.***********************************************************************************
NOTA:
***********************************************************************************
- Para forzar PBO del dynpro LEAVE SCREEN.
I_SAVE = ' ' no se puede ni modificar ni crear variantes.
En todos los casos se permiter recuperar variantes previamente creados.
1) Crear botón en el status y asignarle código.
2) En la rutina USER_COMMAND chequear código y volver hacer la llamada al módulo de funciónREUSE_ALV_GRID_DISPLAY informando el campo IS_VARIANT .
3) En la misma rutina USER_COMMAND llamar a la sentencia LEAVE TO SCREEN O. Es llamada es imprescinble porque al realizar la llamada a REUSE_ALV_GRID_DISPLAY se crear una nueva pantalla a pesar que no es perceptible. En el caso de no poner dicha sentencia para salir del programa seria necesari pulsar el boton BACK tantas veces como cambios de variantes realizadas.
- Definir un campo en nuestra estructura de datos de tipo char con 4 dígitos. ICONO TYPE CHAR4
- Incluir el grupo de tipos ICON. TYPE-POOLS: ICON.
- Informar el icono que se quiere mostrar en nuestra estructura IT_ALV-ICONO = '@08@' Gracias a incluir ICON podemos utilizar las constantes IT_ALV_ICONO = ICON_GREEN_LIGHT.
- Informar en el catálogo que el campo muestra un icono. fieldcat-icon = 'X'.
Solo se informará este campo en el caso en el que el report de salida sea multilínea. Valores: 0, 1, 2 y 3.
COL_POS:
Solo es relevante en el caso que se quiera que la salida en el listado tenga un orden distinto a su posición en la tabla interna de datos.
TABNAME:
Nombre de la tabla interna que contiene los datos a mostrar en el listado.
REF_FIELDNAME:
Nombre del campo de la tabla del diccionario de datos al cual está referenciado el campo de la tabla interna (en el caso en el que lo esté).
CFIELDNAME:
Nombre del campo de la tabla interna de datos que contiene la moneda para el campo importe.
CTABNAME:
Este dato sólo es relevante informarlo para listados con más de una cabecera.
QFIELDNAME:
Nombre del campo de la tabla interna de datos que contiene la unidad de medida para el campo cantidad.
QTABNAME:
Este dato solo es relevante informarlo para listados con más de una cabecera.
OUTPUTLEN:
Siempre que el campo a mostrar en el listado de salida no esté referenciado a ningún campo de tabla del diccionario, se especificará aquí la longitud de salida del campo.
KEY:
El campo del registro actual se tomará como clave si se marca este campo. No podrá ocultarse en el listado de salida este campo.
KEY_SEL:
El campo será clave, pero podrá no salir en el listado de salida.
NO_OUT:
El campo no será mostrado en el listado de salida.
TECH:
Si se marca este campo, el campo actual no puede nunca salir en el listado de salida.
EMPHASIZE:
Para mostrar el campo de algún color.
HOTSPOT:
El campo aparece como hotspot.
FIX_COLUMN:
Si se marca, este campo aparecería como columna fija.
DO_SUM:
Se calculará la suma de este campo.
NO_SUM:
No se calculará la suma de este campo.
ICON:
El campo será mostrado como un icono.
SYMBOL:
El campo será mostrado como un símbolo.
JUST:
Justificación del campo. R= justificado a la derecha, L= justificado a la izquierda, C= centrado.
LZERO:
Mostrará los campos de tipo NUMC justificados a la derecha y sin ceros a la izquierda.
NO_SIGN:
Mostrará el campo sin signos.
NO_ZERO:
Suprime los 0’s.
EDIT_MASK:
Mostrará el campo con una máscara.
SELTEXT_L:
Se mostrará en la cabecera de la columna el texto largo de la definición del campo en la tabla del diccinario de datos.
SELTEXT_M:
Se mostrará en la cabecera de la columna el texto medio de la definición del campo en la tabla del diccinario de datos.
SELTEXT_S:
Se mostrará en la cabecera de la columna el texto corto de la definición del campo en la tabla del diccinario de datos.
DDICTXT:
Especificará mediante L, M y S el texto largo, medio o corto que se utilizará en los títulos de las cabeceras.
DATATYPE:
Se especificará cuando el campo de la tabla interna de datos no esté referenciado a ningún campo de tabla del diccionario de datos.
DDIC_OUTPUTLEN:
Especifica la longitud de salida. Para campos no referenciados al diccionario de datos.
SP_GROUP:
Si se marca este campo, el campo actual pertenecerá a un grupo que se especificará después en el parámetro IT_SPECIAL_GROUPS.
REPREP:
El campo será tomado como un criterio de selección
l_fieldcat-edit = 'X'.
l_fieldcat-input = 'X'.
2) Declarar variable que se utilizará llamada ALV:
DATA: g_it_grid_setting TYPE lvc_s_glay.
3) Informar variable que se utilizará llamada ALV:
g_it_grid_setting-edt_cll_cb = 'X'.
4) En la llamada 'REUSE_ALV_GRID_DISPLAY añadir parametro:
i_grid_settings = g_it_grid_setting
COMENTARIO:
Útil si el que registro que modificamos en el ALV es el que justamente después seleccionamos con el checbox para tratar.
1) Mostrar un fila de un color, añadir un campo en la tabla interna de tipo CHAR04 que se le pasa al MF i guardar el nombre de este campo en la variable del LAYOUT g_layout-info_fieldname = 'COLOR'.
ROJO -> C600
2) Mostrar un columna de un color, cuando se informa los valores para el catálogo, además informar el campo g_catalog-emphasize= C123, 1=> color, 2 y 3 => intensidad.
Para más info sobre los colores:
http://www.abap.es/Centro_ALV_colores.htm
DATA: ls_variant TYPE disvariant.
PARAMETERS p_dispo LIKE disvariant-variant.
2) Mostrar matchcode variantes
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_dispo.
MOVE: p_dispo TO ls_variant-variant,
sy-repid TO ls_variant-report.
CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
EXPORTING
is_variant = ls_variant
IMPORTING
es_variant = ls_variant
EXCEPTIONS
not_found = 1
program_error = 2
OTHERS = 3.
MOVE ls_variant-variant TO p_dispo.
3)Indicar variante al mostrar ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
is_variant = ls_variant
*& Report zcnps075
*&
*&---------------------------------------------------------------------*
*& ALV COMPARA TX CJ20N CON TX PPOME
*&
*&---------------------------------------------------------------------*
REPORT zcnps075 NO STANDARD PAGE HEADING.
INCLUDE zcnps075_top.
INCLUDE zcnps075_f01.
************************************************************************
* Acciones previas a mostrar la pantalla *
************************************************************************
AT SELECTION-SCREEN.
PERFORM check_data_initial.
START-OF-SELECTION.
PERFORM get_data.
DESCRIBE TABLE gt_alv.
IF sy-tfill = 0.
EXIT.
ENDIF.
END-OF-SELECTION.
PERFORM alv_report USING gt_alv[].
*& Include Z_ALV_CJ20N_VS_PPOME_TOP
*&---------------------------------------------------------------------*
*Declaraciones estructuras
TYPES: BEGIN OF gs_proj,
posid TYPE prps-posid, "Elemento PEP
pbukr TYPE prps-pbukr, "Sociedad
pgsbr TYPE prps-pgsbr, "Division
prctr TYPE prps-prctr, "Centro beneficio
zzxubname1 TYPE prps-zzxubname1, "Jefe de Obra
denomin_JO_CJ TYPE string,
zzxubname2 TYPE prps-zzxubname2, "Administrativo de Obra
denomin_AO_CJ TYPE string,
jo_ppome TYPE hrp1000-uname, "Jefe Obra Ppome
denomin_JO_PP TYPE string,
ao_ppome TYPE hrp1000-uname, "Administrativo Obra Ppome
denomin_AO_PP TYPE string,
color(4) TYPE c, "Color
check,
END OF gs_proj.
*Otras declaraciones
DATA: gt_alv TYPE STANDARD TABLE OF gs_proj.
DATA: gv_ucomm LIKE sy-ucomm.
DATA: gv_name TYPE prps-zzxubname1.
*Type Pool donde viene definidas todas las estructuras y tablas
TYPE-POOLS: slis.
*tablas. Catalogo de campos
*Estructura de parámetros
DATA: lf_sp_group TYPE slis_t_sp_group_alv, " Manejar grupos de campos
lf_layout TYPE slis_layout_alv, " Manejar diseño de layout
it_top_header TYPE slis_t_listheader, " Manejar cabecera del rep
wa_top LIKE LINE OF it_top_header." Linea para cabecera
*Manejar catálogo de parámetros
DATA: gt_alv_git_fieldcat TYPE slis_t_fieldcat_alv.
DATA: wa_alv_filedcat LIKE LINE OF gt_alv_git_fieldcat.
TABLES: prps. "Genera wa del mismo nombre de la tabla.
*-----------------------------------------------------------------------
* >> PANTALLA DE SELECCION
*-----------------------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK frame1 WITH FRAME TITLE text-001.
SELECT-OPTIONS so_posid FOR prps-posid. "Elemento PEP
SELECT-OPTIONS so_soc FOR prps-pbukr. "Sociedad del proyecto
SELECT-OPTIONS so_div FOR prps-pgsbr. "División del proyecto
SELECT-OPTIONS so_cebe FOR prps-prctr. "Centro de beneficio
SELECTION-SCREEN END OF BLOCK frame1.
*& Include Z_ALV_CJ20N_VS_PPOME_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form check_data_initial
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM check_data_initial.
IF so_soc IS INITIAL AND
so_div IS INITIAL AND
so_cebe IS INITIAL AND
so_posid IS INITIAL.
MESSAGE text-002 TYPE 'I'.
ENDIF.
ENDFORM. "check_data_initial
*&---------------------------------------------------------------------*
*& Form check_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM get_data.
DATA: t_objid TYPE STANDARD TABLE OF hrp1000-objid.
DATA: lv_short TYPE gs_proj.
DATA: lv_type TYPE c.
FIELD-SYMBOLS <fs_alv> TYPE gs_proj.
DATA: lv_cebe TYPE gs_proj-prctr.
SELECT posid pbukr pgsbr prctr zzxubname1 zzxubname2
FROM prps
INTO CORRESPONDING FIELDS OF TABLE gt_alv
WHERE posid IN so_posid AND
pbukr IN so_soc AND
pgsbr IN so_div AND
prctr IN so_cebe AND
stufe = '1'."Nivel 1 jerarquía
IF sy-subrc NE 0.
MESSAGE 'No existen datos segun criterio seleccionado'(003) TYPE 'I'.
ENDIF.
*1.- Recorro la tabla de valores que he obtenido con los datos de la PS
LOOP AT gt_alv ASSIGNING <fs_alv>.
*Buscar Jefe Obra HRP1000-short = CN...
lv_type = 'J'.
PERFORM busca_datos USING <fs_alv> lv_type.
lv_cebe = <fs_alv>-prctr.
*Buscar Admin Obra HRP1000-short = A_CN...
CONCATENATE 'A_' <fs_alv>-prctr INTO <fs_alv>-prctr.
lv_type = 'A'.
PERFORM busca_datos USING <fs_alv> lv_type.
<fs_alv>-prctr = lv_cebe.
CLEAR lv_type.
ENDLOOP.
ENDFORM. "get_data
*&---------------------------------------------------------------------*
*& Form busca_datos
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM busca_datos USING fv_alv TYPE gs_proj
fv_type TYPE c.
DATA: lv_objid TYPE hrp1000-objid.
DATA: lv_sobid TYPE hrp1001-sobid.
DATA: lv_name TYPE string.
TYPES: BEGIN OF ls_hrp1001,
sobid TYPE hrp1001-sobid,
priox TYPE hrp1001-priox,
END OF ls_hrp1001.
DATA: it_aux TYPE STANDARD TABLE OF ls_hrp1001.
DATA: wa_aux LIKE LINE OF it_aux.
*Buscar Jefe Obra HRP1000-short = CN... o = A_CN...
*Busco en la HRP100 el objid
SELECT SINGLE objid FROM hrp1000
INTO lv_objid
WHERE short = fv_alv-prctr.
*Busco id objeto vinculado
*con campo particularidad de nelace = descendentes (B)
* y Vinculación entre objetos = pertenece (012)
SELECT SINGLE sobid FROM hrp1001 INTO lv_sobid
WHERE objid = lv_objid AND rsign = 'B'(004)
AND relat = '012'(005).
*con el id objeto vinculado busco el usuario
* SELECT SINGLE sobid FROM hrp1001 INTO gv_name
* WHERE objid = lv_sobid AND sclas = 'US'(006).
SELECT sobid priox FROM hrp1001 INTO TABLE it_aux
WHERE objid = lv_sobid AND sclas = 'US'(006)
AND begda <= sy-datum AND endda >= sy-datum.
*si existen dos lineas nos quedamos con la que tenga mayor prioridad.
DESCRIBE TABLE it_aux.
IF sy-tfill = 1.
READ TABLE it_aux INDEX 1 INTO wa_aux.
gv_name = wa_aux-sobid.
ELSEIF sy-tfill > 1.
READ TABLE it_aux WITH KEY priox = 'AA' INTO wa_aux.
IF sy-subrc EQ 0.
gv_name = wa_aux-sobid.
ELSE.
READ TABLE it_aux INDEX sy-tfill INTO wa_aux.
gv_name = wa_aux-sobid.
ENDIF.
ENDIF.
IF fv_type = 'J'(007).
fv_alv-jo_ppome = gv_name.
ENDIF.
IF fv_type = 'A'(008).
fv_alv-ao_ppome = gv_name.
ENDIF.
CLEAR gv_name.
*Ponemos color a las columnas, si el administrativo de la CJ20N es el mismo que el de la PPOME = verde sin rojo
*Igual para el jefe de obra
IF fv_alv-jo_ppome IS INITIAL OR fv_alv-ao_ppome IS INITIAL.
fv_alv-color = 'C600'(033). "rojo
ELSEIF fv_alv-zzxubname1 NE fv_alv-jo_ppome OR fv_alv-zzxubname2 NE fv_alv-ao_ppome.
fv_alv-color = 'C611'(009). "rojo
ELSE.
fv_alv-color = 'C511'(010). "verde
ENDIF.
PERFORM get_user USING fv_alv-jo_ppome CHANGING lv_name.
fv_alv-denomin_jo_pp = lv_name.
PERFORM get_user USING fv_alv-ao_ppome CHANGING lv_name.
fv_alv-denomin_ao_pp = lv_name.
PERFORM get_user USING fv_alv-zzxubname1 CHANGING lv_name.
fv_alv-denomin_jo_cj = lv_name.
PERFORM get_user USING fv_alv-zzxubname2 CHANGING lv_name.
fv_alv-denomin_ao_cj = lv_name.
ENDFORM. "busca_datos
*&---------------------------------------------------------------------*
*& Include Z_ALV_F01
*&---------------------------------------------------------------------*
*performs del ALV
FORM alv_report USING pp_itab LIKE gt_alv[].
* PERFORM elimina_reg USING gt_alv[].
PERFORM sp_group_build USING lf_sp_group[].
PERFORM alv_ini_fieldcat.
PERFORM layout_build USING lf_layout.
PERFORM alv_listado USING pp_itab[].
ENDFORM. "ALV REPORT
*FORM SP_GROUP_BUILD para crear los grupos de campos
FORM sp_group_build USING u_lf_sp_group TYPE slis_t_sp_group_alv.
DATA: ls_sp_group TYPE slis_sp_group_alv.
CLEAR ls_sp_group.
ls_sp_group-sp_group = 'A'.
ls_sp_group-text = text-010.
APPEND ls_sp_group TO u_lf_sp_group.
ENDFORM. "sp_group_build
*Form para crear el catalogo de campos con sus propiedades
FORM alv_ini_fieldcat.
*Elemento PEP
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'POSID'.
wa_alv_filedcat-key = ''.
wa_alv_filedcat-seltext_m = 'Elemento PEP'(011).
wa_alv_filedcat-seltext_l = 'Elemento PEP'(011).
wa_alv_filedcat-col_pos = 1.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Sociedad
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'PBUKR'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'Sociedad'(012).
wa_alv_filedcat-seltext_l = 'Sociedad'(012).
wa_alv_filedcat-col_pos = 2.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Division
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'PGSBR'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'Division'(013).
wa_alv_filedcat-seltext_l = 'Division'(013).
wa_alv_filedcat-col_pos = 3.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Centro beneficio
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'PRCTR'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'CEBE'(014).
wa_alv_filedcat-seltext_l = 'CEBE'(014).
wa_alv_filedcat-col_pos = 4.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Jefe Obra
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'ZZXUBNAME1'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'J.O. CJ20N'(015).
wa_alv_filedcat-seltext_l = 'J.O. CJ20N'(015).
wa_alv_filedcat-col_pos = 5.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Jefe Obra CJ20N denominación
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'DENOMIN_JO_CJ'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'J.O.Name CJ20N'(034).
wa_alv_filedcat-seltext_l = 'J.O.Name CJ20N'(034).
wa_alv_filedcat-col_pos = 6.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Centro beneficio
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'JO_PPOME'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'J.O. PPOME'(017).
wa_alv_filedcat-seltext_l = 'J.O. PPOME'(017).
wa_alv_filedcat-col_pos = 7.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Jefe Obra PPOME denominación
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'DENOMIN_JO_PP'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'J.O.Name PPOME'(035).
wa_alv_filedcat-seltext_l = 'J.O.Name PPOME'(035).
wa_alv_filedcat-col_pos = 8.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Administrativo Obra
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'ZZXUBNAME2'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'A.O.CJ20N'(016).
wa_alv_filedcat-seltext_l = 'A.O.CJ20N'(016).
wa_alv_filedcat-col_pos = 9.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Administrativo Obra CJ20N denominación
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'DENOMIN_AO_CJ'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'A.O.Name CJ20N'(036).
wa_alv_filedcat-seltext_l = 'A.O.Name CJ20N'(036).
wa_alv_filedcat-col_pos = 10.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*Centro beneficio
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'AO_PPOME'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'A.O. PPOME'(018).
wa_alv_filedcat-seltext_l = 'A.O. PPOME'(018).
wa_alv_filedcat-col_pos = 11.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
*AdministrativoObra PPOME denominación
CLEAR wa_alv_filedcat.
wa_alv_filedcat-fieldname = 'DENOMIN_AO_PP'.
wa_alv_filedcat-key = 'X'.
wa_alv_filedcat-seltext_m = 'A.O.Name PPOME'(037).
wa_alv_filedcat-seltext_l = 'A.O.Name PPOME'(037).
wa_alv_filedcat-col_pos = 12.
wa_alv_filedcat-sp_group = 'A'.
wa_alv_filedcat-outputlen = '10'.
APPEND wa_alv_filedcat TO gt_alv_git_fieldcat.
ENDFORM. "alv_ini_fieldcat
*form para diseñar el layout de salida del ALV.
FORM layout_build USING u_lf_layout TYPE slis_layout_alv.
u_lf_layout-box_fieldname = 'CHECK'. " Checkbox
u_lf_layout-zebra = 'X'.
u_lf_layout-colwidth_optimize = 'X'.
* u_lf_layout-get_selinfos = 'X'.
* u_lf_layout-f2code = 'BEAN'.
* u_lf_layout-confirmation_prompt = 'X'.
* u_lf_layout-key_hotspot ='X'.
*Para poner color a las columnas
u_lf_layout-info_fieldname = 'COLOR'.
ENDFORM. "layout_build
*form para invocar al ALV.
FORM alv_listado USING pp_itab LIKE gt_alv[].
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_top_of_page = 'TOP_OF_PAGE'
i_callback_program = sy-repid* i_callback_pf_status_set = 'PF_STATUS'
* i_callback_user_command = 'USER_COMMAND'
is_layout = lf_layout
it_fieldcat = gt_alv_git_fieldcat[]* it_special_groups = lf_sp_group
i_save = 'X'
TABLES
t_outtab = pp_itab
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. "alv_listado
*E1 FORM TOP_OF_PAGE nos permite configurar la cabecera del reporte
FORM top_of_page.
*ALV Header declarations
DATA: t_header TYPE slis_t_listheader,
wa_header TYPE slis_listheader.
*Title
CLEAR wa_header.
wa_header-typ = 'H'.
wa_header-info = 'Comparacion datos CJ20N con PPOME'(019).
APPEND wa_header TO t_header.
*Date
CLEAR wa_header.
wa_header-typ = 'S'.
wa_header-key = 'Date:'(032).
CONCATENATE sy-datum+6(2) '.'
sy-datum+4(2) '.'
sy-datum(4) INTO wa_header-info. "todays date
APPEND wa_header TO t_header.
* Records Selected
CLEAR wa_header.
wa_header-typ = 'S'.
IF so_posid-low IS NOT INITIAL AND so_posid-high IS INITIAL.
CONCATENATE 'Elem. PEP :'(020) so_posid-low
INTO wa_header-info.
ELSEIF so_posid-low IS NOT INITIAL AND so_posid-high IS NOT INITIAL.
wa_header-typ = 'S'.
CONCATENATE 'Elem. PEP desde:'(021) so_posid-low space 'Elem. PEP hasta:'(022) so_posid-high
INTO wa_header-info.
ENDIF.
APPEND wa_header TO t_header.
CLEAR wa_header.
wa_header-typ = 'S'.
IF so_soc-low IS NOT INITIAL AND so_soc-high IS INITIAL.
CONCATENATE 'Sociedad del proyecto:'(023) so_soc-low
INTO wa_header-info.
ELSEIF so_soc-low IS NOT INITIAL AND so_soc-high IS NOT INITIAL.
CONCATENATE 'Soc. proy. desde:'(024) so_soc-low 'Soc.proy. hasta:'(025) so_soc-high
INTO wa_header-info SEPARATED BY space.
ENDIF.
APPEND wa_header TO t_header.
CLEAR wa_header.
wa_header-typ = 'S'.
IF so_div-low IS NOT INITIAL AND so_div-high IS INITIAL.
CONCATENATE 'Div. del proyecto:'(026) so_div-low
INTO wa_header-info.
ELSEIF so_div-low IS NOT INITIAL AND so_div-high IS NOT INITIAL.
CONCATENATE 'Div. proy. desde:'(027) so_div-low space 'Div. proy. hasta:'(028) so_div-high
INTO wa_header-info.
ENDIF.
APPEND wa_header TO t_header.
CLEAR wa_header.
wa_header-typ = 'S'.
IF so_cebe-low IS NOT INITIAL AND so_cebe-high IS INITIAL.
CONCATENATE 'Centro de beneficio:'(029) so_cebe-low
INTO wa_header-info.
ELSEIF so_cebe-low IS NOT INITIAL AND so_cebe-high IS NOT INITIAL.
CONCATENATE 'CEBE desde:'(030) so_cebe-low space 'CEBE hasta:'(031) so_cebe-high
INTO wa_header-info.
ENDIF.
APPEND wa_header TO t_header.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = t_header.
* i_logo = 'Z_LOGO'.
ENDFORM. "top_of_page
*&---------------------------------------------------------------------*
*& Form GET_USER
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_user USING fv_user
CHANGING fv_name.
DATA: gw_address LIKE bapiaddr3,
gt_return LIKE TABLE OF bapiret2.
TYPES: BEGIN OF ls_users,
user TYPE prps-zzxubname2,
name_user TYPE string,
END OF ls_users.
DATA: lt_users TYPE HASHED TABLE OF ls_users WITH UNIQUE KEY user.
DATA: wa_user LIKE LINE OF lt_users.
*si me pasan un usuario vacio no busco nada
IF fv_user IS NOT INITIAL.
*Leo la tabla auxiliar de usuarios, si no existe el usuario, lo busco por BAPI, si existe lo leo.
READ TABLE lt_users INTO wa_user WITH KEY user = fv_user.
IF sy-subrc EQ 0. "Existe en el buffer
fv_name = wa_user-name_user.
ELSE. "No existe en el buffer
*obtenemos el nombre completo
CALL FUNCTION 'BAPI_USER_GET_DETAIL'
EXPORTING
username = fv_user
cache_results = 'X'
IMPORTING
address = gw_address
TABLES
return = gt_return.
CONCATENATE gw_address-firstname gw_address-lastname
INTO fv_name SEPARATED BY ' '.
wa_user-user = fv_user.
wa_user-name_user = fv_name.
fv_name = gw_address-fullname.
INSERT wa_user INTO TABLE lt_users.
CLEAR gw_address.
ENDIF.
ENDIF.
ENDFORM. " GET_USER
No hay comentarios:
Publicar un comentario