Archivo

Posts Tagged ‘ALV’

alvgrid->get_filtered_entries

Caso: se hizo un botón de seleccionar todos/deseleccionar todos, para marcar los checks de una tabla interna. Se desea que, cuando el usuario filtra ciertos registros, sólo se seleccionen los registros visibles y no toda la tabla interna.

Screenshot_1

Solución: Usamos alvgrid->get_filtered_entries para obtener la lista de registros que fueron filtrados (no visibles)

  METHOD handle_user_command.
 
    DATA: lv_cont            TYPE i,
          lv_tabix           TYPE sy-tabix.
 
	DATA: lt_filtered        TYPE lvc_t_fidx.
 
    CASE e_ucomm.
      WHEN 'ALL'.
        CALL METHOD gr_alvgrid->get_filtered_entries
          IMPORTING
            et_filtered_entries = lt_filtered.
 
        LOOP AT it_tabla INTO wa_tabla.
          lv_tabix = sy-tabix.
          READ TABLE lt_filtered WITH KEY table_line = lv_tabix TRANSPORTING NO FIELDS.
          IF sy-subrc NE 0.
            MOVE g_true TO wa_tabla-marc.
            MODIFY it_tabla FROM wa_tabla INDEX lv_tabix.
          ENDIF.
        ENDLOOP.
 
      WHEN 'NONE'.
        CALL METHOD gr_alvgrid->get_filtered_entries
          IMPORTING
            et_filtered_entries = lt_filtered.
 
        LOOP AT it_tabla INTO wa_tabla.
          lv_tabix = sy-tabix.
          READ TABLE lt_filtered WITH KEY table_line = lv_tabix TRANSPORTING NO FIELDS.
          IF sy-subrc NE 0.
            CLEAR  wa_tabla-marc.
            MODIFY it_tabla FROM wa_tabla INDEX lv_tabix.
          ENDIF.
        ENDLOOP.
 
    ENDCASE.
 
	CALL METHOD gr_alvgrid->refresh_table_display.
  ENDMETHOD.                           "handle_user_command

Solución:

Anuncios

Crear ALV con columnas dinámicas

Caso: se desea utilizar un ALV dinámico, es decir con columnas dinámicas. Encontré un ejemplo por Internet, dejo la fuente al pie del post, realmente me sirvió para lo que necesitaba.

Solución: El ejemplo permite indicar la cantidad de filas y columnas y luego genera un ALV con dicha información

REPORT  zprueba_alv_dinamico.
 
TYPE-POOLS: slis.
 
*& Título........: Test Alv Dinámico
*& Descripción...: Segun la cantidad de columnas incrementar el catálogo de campos del ALV
 
FIELD-SYMBOLS:
<gt_dyntable> TYPE STANDARD TABLE, "Nombre de la tabla interna dinámica
<gs_dyntable>, "Field symbol para crear un área de trabajo
<gv_fldval> TYPE ANY. "Field Symbol para asignar valores
 
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv, "Lo utilizaremos al momento de invocar al ALV
      gt_fcat     TYPE lvc_t_fcat."Lo utilizaremos al momento de crear la tabla dinámica
 
DATA: gv_colno(2)  TYPE n,  "Nro de columna
      gv_flname(5) TYPE c. "Nombre del campo del catálogo
 
PARAMETERS: pa_cols(5) TYPE c,  "Campo de Texto para ingresar el número de columnas
            pa_rows(5) TYPE c. "Campo de Texto para ingresar el número de filas
 
*----------------------------------------------------------------------*
*START-OF-SELECTION                                            *
*----------------------------------------------------------------------*
"Al Ejecutar el reporte se invocarán las siguientes rutinas
PERFORM fill_dynamic_catalog.  "Llena el catálogo de campos de la tabla dinámica
PERFORM crea_dynamic_itable. "Crea la tabla interna dinámica
PERFORM crea_dynamic_warea."Crear el área de trabajo para la tabla interna dinámica
PERFORM fill_itable. "Llena de valores la tabla interna que se visualizará en el ALV
PERFORM display_alv. "Visualiza el ALV
 
*&---------------------------------------------------------------------*
*& Form FILL_DYNAMIC_CATALOG
*&---------------------------------------------------------------------*
*"Llena el catálogo de campos de la tabla dinámica
*----------------------------------------------------------------------*
FORM fill_dynamic_catalog.
  DATA: ls_fcat TYPE lvc_s_fcat. "área de trabajo local para el catálogo de campos
 
  "La primera columna
  ls_fcat-fieldname = 'DESCRIPCION'.
  ls_fcat-datatype = 'CHAR'.
  ls_fcat-intlen = 15.
  APPEND ls_fcat TO gt_fcat.
 
  "Segun el número de columnas ingresado por el usuario en pantalla.
  DO pa_cols TIMES.
    CLEAR ls_fcat.
    MOVE sy-index TO gv_colno.
    CONCATENATE 'COL' gv_colno INTO ls_fcat-fieldname.
    ls_fcat-datatype = 'CHAR'.
    ls_fcat-intlen = 10.
    APPEND ls_fcat TO gt_fcat.
  ENDDO.
ENDFORM. " FILL_DYNAMIC_CATALOG
 
*&-----------------------------------------------------------------------*
*& Form CREA_DYNAMIC_ITABLE
*&-----------------------------------------------------------------------*
*"Crea la tabla interna dinámica y asignamos a un field-symbol
*&-----------------------------------------------------------------------*
FORM crea_dynamic_itable .
  "Referencia de un Objeto
  DATA lo_newtable TYPE REF TO data. "Para la tabla interna dinámica
 
  "Invocamos al método 'create_dynamic_table' de la clase cl_alv_table_create
  "Como es una clase estática accedemos directamente desde la clase al método.
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = gt_fcat
    IMPORTING
      ep_table        = lo_newtable.
 
  ASSIGN lo_newtable->* TO <gt_dyntable>.
ENDFORM. " CREA_DYNAMIC_ITABLE
 
*&----------------------------------------------------------------------------------------------------*
*& Form CREA_DYNAMIC_WAREA
*&----------------------------------------------------------------------------------------------------*
*"Crear el área de trabajo para la tabla interna dinámica y asignamos a un field-symbol
*&----------------------------------------------------------------------------------------------------*
FORM crea_dynamic_warea.
  "Referencia de un Objeto
  DATA lo_newline TYPE REF TO data. "Para el área de trabajo de la tabla interna dinámica.
 
  CREATE DATA lo_newline LIKE LINE OF <gt_dyntable>.
  ASSIGN lo_newline->* TO <gs_dyntable>.
ENDFORM. " CREA_DYNAMIC_WAREA
 
*&-----------------------------------------------------------------------*
*& Form FILL_ITABLE
*&-----------------------------------------------------------------------*
*"Llena de valores la tabla interna que se visualizará en el ALV
*&-----------------------------------------------------------------------*
FORM fill_itable.
 
  DATA: lv_index_row(3) TYPE c,  "Nro de fila que se esta tratando
        lv_index_col(3) TYPE c,  "Nro de columna que se esta tratando
        lv_fldval(10)   TYPE c.  "Valor que será asignado en dicha celda de la fila y columna
 
  DO pa_rows TIMES. "Recorremos tantas filas se haya ingresado por pantalla
    lv_index_row = sy-index.
 
*<gv_fldval> apuntará a la columna DESCRIPCION y por cada fila asignará su valor correspondiente
*Por ejemplo si se tratase de un ALV dinámico que muestra las características de un vehículo sería bueno
*que antes se haya definido primero una tabla interna que contega los nombres de cada característica por *ejemplo: COLOR, MODELO, AÑO DE FABRICACIÓN
*etc. de tal manera que aquí lo que se haría es
*hacer un read table a dicha tabla interna y según la fila que se este analizando leeríamos el texto.
 
    ASSIGN COMPONENT 'DESCRIPCION' OF STRUCTURE <gs_dyntable> TO <gv_fldval>.
    CONCATENATE 'FILA-' lv_index_row INTO lv_fldval.
    CONDENSE lv_fldval NO-GAPS. "NO-GAPS es para eliminar los espacios en blanco entre carácter
    <gv_fldval> = lv_fldval.
 
    DO pa_cols TIMES. "Por cada fila recorremos tantas columnas se haya ingresado por pantalla
      lv_index_col = sy-index.
 
      MOVE lv_index_col TO gv_colno.
      CONCATENATE 'COL' gv_colno INTO gv_flname.
      "<gv_fldval> apuntará a la columna COL01, COL02, COL03 y así sucesivamente según la columna que      "se este analizando y ahí se almacenará el nuevo valor correspondiente.
      ASSIGN COMPONENT gv_flname OF STRUCTURE <gs_dyntable> TO <gv_fldval>.
 
      CONCATENATE 'VALOR' lv_index_row '-' lv_index_col INTO lv_fldval.
      CONDENSE lv_fldval NO-GAPS."NO-GAPS es para eliminar los espacios en blanco entre carácter
      <gv_fldval> = lv_fldval.
 
    ENDDO. "Cierra el Do del recorrido de Columnas por la fila en análisis
 
    APPEND <gs_dyntable> TO <gt_dyntable>."Añadimos la línea d valores a nuestra tabla interna dinámica
 
  ENDDO."Cierra el Do del recorrido de Filas
 
ENDFORM. " FILL_ITABLE
 
*&---------------------------------------------------------------------*
*& Form DISPLAY_ALV
*&---------------------------------------------------------------------*
*"Visualiza el ALV
*----------------------------------------------------------------------*
FORM display_alv.
 
  PERFORM fill_catalog_alv.
 
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      it_fieldcat = gt_fieldcat
    TABLES
      t_outtab    = <gt_dyntable>.
 
ENDFORM. " DISPLAY_ALV
 
*&---------------------------------------------------------------------*
*& Form FILL_CATALOG_ALV
*&---------------------------------------------------------------------*
*LLena el catálogo de campos del ALV a visualizar en Pantalla
*----------------------------------------------------------------------*
FORM fill_catalog_alv .
  DATA: ls_fieldcat TYPE slis_fieldcat_alv.
 
  ls_fieldcat-fieldname = 'DESCRIPCION'.
  ls_fieldcat-seltext_l = 'Nro de Fila'.
  ls_fieldcat-outputlen = '15'.
  APPEND ls_fieldcat TO gt_fieldcat.
 
  DO pa_cols TIMES.
    CLEAR ls_fieldcat.
    MOVE sy-index TO gv_colno.
    CONCATENATE 'COL' gv_colno INTO gv_flname.
    ls_fieldcat-fieldname = gv_flname.
    ls_fieldcat-seltext_s = gv_flname.
    ls_fieldcat-outputlen = '10'.
    APPEND ls_fieldcat TO gt_fieldcat.
  ENDDO.
 
ENDFORM. " FILL_CATALOG_ALV

Links:
http://aalcantaraq.blogspot.com/2014/02/alv-dinamico-explicado-paso-paso.html
http://abaputiles.blogspot.com/2009/05/crear-un-alv-con-columnas-dinamicas.html

Categorías:ABAP/4 Etiquetas: ,

Color en columna de ALV

Caso: Se desea ponerle color a una columna de un ALV.

Solución: Para pintar una columna, podemos utilizar, en el fieldcat del ALV el campo EMPHASIZE, por ejemplo:

lw_fieldcat-emphasize = ‘C500’.

En el siguiente programa podemos listar las distintas posibilidades de color que hay.

REPORT  zprueba_color_alv.
 
TYPE-POOLS: slis.
 
* Tabla interna de prueba (se agrega el campo CELLCOLORS.
TYPES: BEGIN OF tty_salida,
        cod_color             TYPE char4,
        cellcolors            TYPE lvc_t_scol,
      END OF   tty_salida.
 
TYPES: ty_salida   TYPE STANDARD TABLE OF tty_salida.
 
DATA:  t_salida       TYPE ty_salida,
       wa_salida      TYPE LINE OF ty_salida,
       i_fieldcat     TYPE slis_t_fieldcat_alv,
       r_layout       TYPE slis_layout_alv,
       lv_color       TYPE numc1,
       lv_intensidad  TYPE numc2,
       lv_contador    TYPE numc3,
       lv_i           TYPE c,
       lv_j           TYPE c,
       lv_k           TYPE c.
 
INITIALIZATION.
* Agrego los códigos de color
  lv_color      = '1'.
  WHILE ( lv_color <= 7 ).
    lv_intensidad = '00'.
    WHILE ( lv_intensidad < 20 ).
      CONCATENATE 'C' lv_color lv_intensidad INTO wa_salida-cod_color.
      APPEND wa_salida TO t_salida.
      ADD 1 TO lv_intensidad.
 
    ENDWHILE.
    ADD 1 TO lv_color.
  ENDWHILE.
 
* CARGO FIELDCAT.
  REFRESH i_fieldcat.
  PERFORM f_init_fieldcat     TABLES i_fieldcat.
 
* LAYOUT, AGREGO COLORES DEPENDIENDO DE LA CELDA
  CLEAR r_layout.
  PERFORM f_init_layout       CHANGING r_layout.
 
* ALV GRID
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program      = sy-repid
      i_callback_user_command = 'F_USER_COMMAND_01'
      is_layout               = r_layout
      it_fieldcat             = i_fieldcat[]
    TABLES
      t_outtab                = t_salida
    EXCEPTIONS
      program_error           = 1
      OTHERS                  = 2.
  IF sy-subrc <> 0.
    EXIT.
  ENDIF.
 
*&---------------------------------------------------------------------*
*&      Form  f_init_fieldcat
*&---------------------------------------------------------------------*
FORM f_init_fieldcat  TABLES ptc_fieldcat TYPE slis_t_fieldcat_alv.
 
  DATA: r_fieldcat  TYPE slis_fieldcat_alv,
        l_pos       TYPE i VALUE 0.
 
  CLEAR r_fieldcat.
  l_pos = l_pos + 1.
  r_fieldcat-col_pos       = l_pos.
  r_fieldcat-fieldname     = 'COD_COLOR'.
  r_fieldcat-tabname       = 'T_SALIDA'.
  r_fieldcat-seltext_l     = 'Material'.
  APPEND r_fieldcat TO ptc_fieldcat.
 
ENDFORM.                    " f_init_fieldcat
 
*&---------------------------------------------------------------------*
*&      Form  f_init_layout
*&---------------------------------------------------------------------*
FORM f_init_layout  CHANGING playout TYPE slis_layout_alv.
* Variables
  DATA l_color               TYPE lvc_s_scol.
 
 
* Field-Symbols
  FIELD-SYMBOLS <fs_report>  LIKE LINE OF t_salida.
 
* ASIGNAMOS EL CAMPO CELLCOLORS AL LAYOUT
  playout-coltab_fieldname  = 'CELLCOLORS'.
 
  UNASSIGN <fs_report>.
 
  LOOP AT t_salida ASSIGNING <fs_report>.
    lv_i = <fs_report>-cod_color+1(1).
    lv_j = <fs_report>-cod_color+2(1).
    lv_k = <fs_report>-cod_color+3(1).
 
    l_color-fname     = 'COD_COLOR' .
    l_color-color-col = lv_i. "COLOR
    l_color-color-int = lv_j. "INTENSIDAD
    l_color-color-inv = lv_k. "INVERSO
    APPEND l_color TO <fs_report>-cellcolors.
 
  ENDLOOP.
ENDFORM.                    " f_init_layout
 

 

Mostrar tabla interna en un POPUP ALV

Caso: se busca mostrar en un POPUP un ALV, para visualizar datos de una tabla interna (en mi caso, era el resultado de la ejecución de una BAPI que hace más de un asiento contable).

TYPES BEGIN OF t_asientos.
TYPES belnr TYPE belnr_d.
TYPES bukrs TYPE bukrs.
TYPES gjahr TYPE gjahr.
TYPES belnr_anul TYPE belnr_d.
TYPES bukrs_anul TYPE bukrs.
TYPES gjahr_anul TYPE gjahr.
TYPES END OF t_asientos.

DATA: gt_asientos   TYPE TABLE OF t_asientos,

      lt_fcat       TYPE slis_t_fieldcat_alv.

 

PERFORM crear_catalogo_popup TABLES lt_fcat.

 

CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
EXPORTING
i_callback_program    = sy-repid
it_fieldcat           = lt_fcat
I_CALLBACK_USER_COMMAND = 
‘USER_COMMAND_POPUP’
i_screen_start_column = 
30
i_screen_start_line   = 
7
i_screen_end_column   = 
100
i_screen_end_line     = 
20
TABLES
t_outtab              = gt_asientos
EXCEPTIONS
program_error         = 
1
OTHERS                = 2.

 

 

*&———————————————————————*
*&      Form  CREAR_CATALOGO
*&———————————————————————*
*       Crea el catálogo de campos para el ALV POPUP
*———————————————————————-*
FORM crear_catalogo_popup TABLES pt_fieldcat TYPE slis_t_fieldcat_alv.

DATA: ls_fieldcat TYPE slis_fieldcat_alv.

REFRESH pt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 
‘BELNR’.
ls_fieldcat-tabname   = 
‘GT_ASIENTOS’.
ls_fieldcat-seltext_m = 
‘Doc.Provisión’.
ls_fieldcat-
hotspot   = ‘X’.
APPEND ls_fieldcat TO pt_fieldcat.

CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 
‘GJAHR’.
ls_fieldcat-tabname   = 
‘GT_ASIENTOS’.
ls_fieldcat-seltext_m = 
‘Período’.
APPEND ls_fieldcat TO pt_fieldcat.

CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 
‘BELNR_ANUL’.
ls_fieldcat-tabname   = 
‘GT_ASIENTOS’.
ls_fieldcat-seltext_m = 
‘Doc.Anulación’.
ls_fieldcat-
hotspot   = ‘X’.
APPEND ls_fieldcat TO pt_fieldcat.

CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 
‘GJAHR_ANUL’.
ls_fieldcat-tabname   = 
‘GT_ASIENTOS’.
ls_fieldcat-seltext_m = 
‘Período’.
APPEND ls_fieldcat TO pt_fieldcat.

ENDFORM.                    “crear_catalogo_popup

 

*&———————————————————————*
*&      Form  user_command
*&———————————————————————*
*       User command del popup
*———————————————————————-*
FORM user_command_popup USING r_ucomm LIKE sy-ucomm
rs_selfield 
TYPE slis_selfield.

DATA: lw_asientos TYPE t_asientos.
CASE rs_selfield-fieldname.
WHEN ‘BELNR’.
READ TABLE gt_asientos INTO lw_asientos WITH KEY belnr = rs_selfield-value.
SET PARAMETER ID ‘BLN’ FIELD lw_asientos-belnr.
SET PARAMETER ID ‘BUK’ FIELD lw_asientos-bukrs.
SET PARAMETER ID ‘GJR’ FIELD lw_asientos-gjahr.
CALL TRANSACTION ‘FB03’ AND SKIP FIRST SCREEN.

WHEN ‘BELNR_ANUL’.
READ TABLE gt_asientos INTO lw_asientos WITH KEY belnr_anul = rs_selfield-value.

SET PARAMETER ID ‘BLN’ FIELD lw_asientos-belnr_anul.
SET PARAMETER ID ‘BUK’ FIELD lw_asientos-bukrs_anul.
SET PARAMETER ID ‘GJR’ FIELD lw_asientos-gjahr_anul.
CALL TRANSACTION ‘FB03’ AND SKIP FIRST SCREEN.

WHEN OTHERS.
ENDCASE.

ENDFORM.                    “user_command

El resultado es algo así:

alv