PDA

Ver la Versión Completa : Reuse_alv_grid_display


mysmb2
19/02/09, 12:58:23
Hola!, alguien sabe si la funcion REUSE_ALV_GRID_DISPLAY tiene un limite en cuanto a cantidad de campos a mostrar o cantidad de caracteres.

Muchas Gracias.

DavidXD_XD
22/02/09, 21:04:38
Hola ... me dio curiosidad la pregunta e hice un pequeño programa que crea una tabla interna en forma dinamica dependiendo de un parametro en pantalla que sera el numero de columnas del ALV, en un comienzo solo le di hasta un maximo de 99 columnas y salio el ALV, luego le di un maximo de 999 columnas y tbm salio :eek: , ahora solo deberas modificar el parametro de entrada con 4 caracteres y probar con 9999 columnas, creo q las columnas del ALV es ilimitado y ademas no creo q exista un reporte con mas de 999 columnas (seria perdida de tiempo), pero ahi va el codigo, espero te pueda ayudar

*&---------------------------------------------------------------------*
*& Report ZPRUEBA_2
*&---------------------------------------------------------------------*
*& Autor : David Carballido Cordova
*& Fecha : 22/02/2009
*& Descripción : Crear una tabla interna dinámica y mostrar en ALV
*& Programa : ZPRUEBA_2
*&---------------------------------------------------------------------*
REPORT ZPRUEBA_2.

TYPE-POOLS: abap, col, slis.
* Tablas dinámicas
FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
<dyn_wa>,
<fs>.

* Variables Globales
DATA: gt_dyn TYPE REF TO DATA,
gw_dyn TYPE REF TO DATA.

PARAMETERS: p_col(3) TYPE c OBLIGATORY.
*&---------------------------------------------------------------------*
* S T A R T - O F - S E L E C T I O N
*&---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM build_dynamic_table.
PERFORM get_data.
PERFORM build_alv.

*&---------------------------------------------------------------------*
*& Form build_dynamic_table
*&---------------------------------------------------------------------*
* Construyendo tabla interna dinamica
*----------------------------------------------------------------------*
FORM build_dynamic_table.

DATA: lr_datadescr TYPE REF TO cl_abap_datadescr,
lr_structdescr TYPE REF TO cl_abap_structdescr,
ls_component TYPE abap_componentdescr,
lt_component TYPE abap_component_tab.

DATA: l_descr TYPE char50,
l_indx(3) TYPE n,
l_char5(5) TYPE c.

* Columna 1
lr_datadescr ?= cl_abap_datadescr=>describe_by_data( l_descr ).
ls_component-name = 'COLUMNA'.
ls_component-type = lr_datadescr.
APPEND ls_component TO lt_component.
* Columnas Dinamicas
DO p_col TIMES.
l_indx = sy-index.
CONDENSE l_indx NO-GAPS.
lr_datadescr ?= cl_abap_datadescr=>describe_by_data( l_char5 ).
CONCATENATE 'COL' l_indx INTO ls_component-name.
ls_component-type = lr_datadescr.
APPEND ls_component TO lt_component.
ENDDO.
* Creando la tabla interna
TRY.
lr_structdescr = cl_abap_structdescr=>create( p_components = lt_component ).
CATCH cx_sy_struct_creation.
WRITE: / 'Excepcion:', 'CX_SY_STRUCT_CREATION'.
ENDTRY.
CREATE DATA gw_dyn TYPE HANDLE lr_structdescr.
ASSIGN gw_dyn->* TO <dyn_wa>.
CREATE DATA gt_dyn LIKE STANDARD TABLE OF <dyn_wa>.
ASSIGN gt_dyn->* TO <dyn_table>.

ENDFORM. " build_dynamic_table

*&---------------------------------------------------------------------*
*& Form get_data
*&---------------------------------------------------------------------*
* Armando data para la tabla interna
*----------------------------------------------------------------------*
FORM get_data.

DATA: l_cadena(15),
l_cont(3) TYPE n.

FIELD-SYMBOLS <fs>.

DO 10 TIMES.
CLEAR <dyn_wa>.
l_cont = sy-index.
CONCATENATE 'COLUMNA' l_cont INTO <dyn_wa>.
CONDENSE <dyn_wa> NO-GAPS.
DO p_col TIMES.
CLEAR: l_cadena.
l_cont = sy-index.
CONCATENATE '<dyn_wa>-COL' l_cont INTO l_cadena.
ASSIGN (l_cadena) TO <fs>.
<fs> = sy-index.
ENDDO.
APPEND <dyn_wa> TO <dyn_table>.
ENDDO.

ENDFORM. " get_data

*&---------------------------------------------------------------------*
*& Form build_alv
*&---------------------------------------------------------------------*
* Construyendo ALV
*----------------------------------------------------------------------*
FORM build_alv.

DATA: lt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.

DATA: l_cadena(6) TYPE c,
l_cont(3) TYPE n.

* Creando catalogo
CLEAR lt_fieldcat.
lt_fieldcat-fieldname = 'COLUMNA'.
lt_fieldcat-tabname = '<DYN_TABLE>'.
lt_fieldcat-key = 'X'.
lt_fieldcat-seltext_l = 'Columna'.
APPEND lt_fieldcat.

DO p_col TIMES.
CLEAR lt_fieldcat.
l_cont = sy-index.
CONCATENATE 'COL' l_cont INTO l_cadena.
lt_fieldcat-fieldname = l_cadena.
lt_fieldcat-tabname = '<DYN_TABLE>'.
lt_fieldcat-seltext_l = l_cadena.
APPEND lt_fieldcat.
ENDDO.

* Desplegando ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = 'ZPRUEBA_2'
IT_FIELDCAT = lt_fieldcat[]
TABLES
T_OUTTAB = <dyn_table>
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. " build_alv

ekim68
16/10/12, 20:27:16
Soporta 1000 columnas según probe con el programa antes mencionado.

Saludos.

Mauricio Hidalgo
16/10/12, 21:13:23
Haciendole los ajustes que corresponda al programa, la verdad que el programa proporcionado no veo que tenga límites en cuanto a cuantas columnas pueda crear dinámicamente, llegué a 10000 columnas. Me parece que sólo estarás restringido a la memoria reservada para tablas internas dentro de tu instalación.

Saludos

Eduard Castro
31/05/13, 17:39:16
Hola,

Saben si para ejecuciones en fondo presenta el mismo comportamiento?. Tengo un inconveniente cuando uso la funcion REUSE_ALV_GRID_DISPLAY en fondo, puesto que me está suprimiendo las últimas columnas del reporte. Son tres columnas, cada una con un ancho CHAR 1.

Esto no ocurre cuando la ejecuto en modo dialogo.

Gracias por su colaboración.

Eduard Castro

vanesamacri
31/05/13, 18:21:53
Hola,

Saben si para ejecuciones en fondo presenta el mismo comportamiento?. Tengo un inconveniente cuando uso la funcion REUSE_ALV_GRID_DISPLAY en fondo, puesto que me está suprimiendo las últimas columnas del reporte. Son tres columnas, cada una con un ancho CHAR 1.

Esto no ocurre cuando la ejecuto en modo dialogo.

Gracias por su colaboración.

Eduard Castro
Buenas tardes.

Al ejecutar en proceso batch (de fondo) es posible determinar la longitud de salida de la impresión (se determina a la hora de crear el job). Probablemente, lo que está ocurriendo en tu caso es que la longitud de impresión es inferior a la longitud real ocupada por el alv, motivo por el cual se truncan las últimas columnas.

Eduard Castro
12/06/13, 00:01:31
Buenas tardes.

Al ejecutar en proceso batch (de fondo) es posible determinar la longitud de salida de la impresión (se determina a la hora de crear el job). Probablemente, lo que está ocurriendo en tu caso es que la longitud de impresión es inferior a la longitud real ocupada por el alv, motivo por el cual se truncan las últimas columnas.

Hola, gracias por tu ayuda, no sabia que es posible realizar esta opción. Por favor, indícame como puedo ajustar el área de impresión del JOB.

De antemano gracias por tu colaboración.

Eduard Castro