martes, 16 de abril de 2013

ALV


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).

Lanzar evento modificación manual ALV
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.

ALV objetos - Acceder a los datos que se muestran en el ALV
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).
ALV Objetos - Actualizar datos del ALV
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).
ALV Objetos - Procesar PAI dynpro al ejecutar botón ALV
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.
ALV Objetos - Añadir botón nuevo
**********************************************************************************
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'.
ALV Objetos - Ocultar barra de herramientas
Se informa una campo de la variable de layout:
                    po_layout-no_toolbar  = 'X'.  
ALV Objetos - Redefinir botón stándard
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.
ALV - Proteger variantes
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.
ALV - Cambiar variantes mediante botones Z
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
.
ALV - Mostrar icono
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'.
ALV - recuperar catálogo de campos
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.
ALV - Catálogo
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
ALV - modificar valores ALV
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.

ALV - Actualizar datos
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'.
ALV - Mostrar celdas en colores
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
ALV - Trabajar con variantes de ALV
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
TYPESBEGIN 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
DATAgt_alv TYPE STANDARD TABLE OF gs_proj.
DATAgv_ucomm       LIKE sy-ucomm.
DATAgv_name TYPE prps-zzxubname1.
*Type Pool donde viene definidas todas las estructuras y tablas
TYPE-POOLSslis.
*tablas. Catalogo de campos
*Estructura de parámetros
  
DATAlf_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
  
DATAgt_alv_git_fieldcat TYPE slis_t_fieldcat_alv.
  
DATAwa_alv_filedcat LIKE LINE OF gt_alv_git_fieldcat.
TABLESprps"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.

  
DATAt_objid TYPE STANDARD TABLE OF hrp1000-objid.
  
DATAlv_short TYPE gs_proj.
  
DATAlv_type TYPE c.
  
FIELD-SYMBOLS <fs_alv> TYPE gs_proj.
  
DATAlv_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'(003TYPE '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.

  
DATAlv_objid TYPE hrp1000-objid.
  
DATAlv_sobid TYPE hrp1001-sobid.
  
DATAlv_name TYPE string.

  
TYPESBEGIN OF ls_hrp1001,

    sobid 
TYPE hrp1001-sobid,
    priox 
TYPE hrp1001-priox,
    
END OF ls_hrp1001.

  
DATAit_aux TYPE STANDARD TABLE OF ls_hrp1001.
  
DATAwa_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 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.

  
DATAls_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
  
DATAt_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(4INTO 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 :'(020so_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:'(021so_posid-low space 'Elem. PEP hasta:'(022so_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:'(023so_soc-low
    
INTO wa_header-info.
  
ELSEIF so_soc-low IS NOT INITIAL AND so_soc-high IS NOT INITIAL.
    
CONCATENATE 'Soc. proy. desde:'(024so_soc-low 'Soc.proy. hasta:'(025so_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:'(026so_div-low
    
INTO wa_header-info.
  
ELSEIF so_div-low IS NOT INITIAL AND so_div-high IS NOT INITIAL.
    
CONCATENATE 'Div. proy. desde:'(027so_div-low space 'Div. proy. hasta:'(028so_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:'(029so_cebe-low
    
INTO wa_header-info.
  
ELSEIF so_cebe-low  IS NOT INITIAL AND so_cebe-high IS NOT INITIAL.
    
CONCATENATE 'CEBE desde:'(030so_cebe-low space 'CEBE hasta:'(031so_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.

  
DATAgw_address LIKE bapiaddr3,
             gt_return 
LIKE TABLE OF bapiret2.

  
TYPESBEGIN OF ls_users,
    user      
TYPE prps-zzxubname2,
    name_user 
TYPE string,
    
END OF ls_users.

  
DATAlt_users TYPE HASHED TABLE OF ls_users WITH UNIQUE KEY user.
  
DATAwa_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