Archivo
Tipos de Popup en SAP – Parte 4 – POPUP ALV GRID
Caso: Encontré un POPUP para visualizar en ALV GRID la información de una tabla interna, adjunto link directo de la fuente ya que fue probado y quedó funcionando.
Fuente: https://blogs.sap.com/2014/05/07/very-simple-alv-in-pop-up-window/
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:
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
- image0012
- image0022
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
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í: