Archivo

Posts Tagged ‘REUSE_ALV_GRID_DISPLAY’

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

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