Archivo
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.
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:
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í: