Tema: Alv
Ver Mensaje Individual
  #1  
Viejo 17/12/07, 07:00:35
MariLu MariLu is offline
Junior Member
 
Fecha de Ingreso: jul 2006
Mensajes: 5
Alv

Buenas!
Tengo un problemilla con un ALV, Quiero hacer varios en la misma pantalla, recojo los datos de varias tablas en mi tabla interna, y este parece ser el problema porque si lo hago con una tabla del diccionario funciona pero con mi tabla interna me da un error que dice que 't_datos no vale como tipo de datos' He probado ya de todo y no sé como hacerlo.
El código es el siguiente:

type-pools: slis.

*----------------------------------------------------------------------*
* DECLARACION DE TABLAS *
*----------------------------------------------------------------------*
tables: pa0000, pa0002, pa0001.

*----------------------------------------------------------------------*
* VARIABLES *
*----------------------------------------------------------------------*
data: g_fieldcat type slis_t_fieldcat_alv,
g_sort type slis_t_sortinfo_alv with header line,
gt_print type slis_print_alv,
gs_layout type slis_layout_alv,
gt_events type slis_t_event,
g_program type sy-repid,
tab_name type string,
tabname type tabname,
w_tabix type string,
g_lines type string.

*----------------------------------------------------------------------*
* TYPES *
*----------------------------------------------------------------------*
types: begin of ti_datos,
pernr type pa0002-pernr,
nachn type pa0002-nachn,
bukrs type pa0001-bukrs.
types: end of ti_datos.


types: begin of alvdat,
tabname type tabname,
tdref type ref to data,
end of alvdat.


data t_alvdat type table of alvdat with non-unique key tabname.

data: descr_struct_ref type ref to cl_abap_structdescr,
dataref type ref to data,
wa_fcat type lvc_s_fcat,
it_fieldcatalog type lvc_t_fcat.

*data ti_datos TYPE TABLE OF REF TO datos.

data: begin of ti_cab occurs 0,
cab type abap_compdescr.
data: end of ti_cab.

*----------------------------------------------------------------------*
* TABLAS INTERNAS *
*----------------------------------------------------------------------*
data: t_datos type standard table of ti_datos with header line,
t_datos_header type standard table of ti_datos with header line,
t_datos_detail type standard table of ti_datos with header line.

*----------------------------------------------------------------------*
* FIELD-SYMBOLS *
*----------------------------------------------------------------------*
field-symbols: <line> type any,
<field> type any,
<component> type abap_compdescr,
<dyn_table> type standard table,
<fs> type any,
<dyn_wa>,
<table>.
*----------------------------------------------------------------------*
* MACROS *
*----------------------------------------------------------------------*
define limpiar_tabla.
clear &1.
refresh &1.
end-of-definition.

*----------------------------------------------------------------------*
* CRITERIOS DE SELECCIÓN *
*----------------------------------------------------------------------*
selection-screen begin of block b01 with frame title text-b01.
select-options s_pernr for pa0002-pernr .
selection-screen end of block b01.


*----------------------------------------------------------------------*
* PRINCIPAL
*----------------------------------------------------------------------*
start-of-selection.
perform rellenar_cab.
perform obtener_datos.
perform generar_alv.
perform generar_alv_list.

*---------------------------------------------------------------------*
* FORM OBTENER_DATOS *
*---------------------------------------------------------------------*
* Obtenemos los datos *
*---------------------------------------------------------------------*
form obtener_datos.

select pernr nachn
into table t_datos
from pa0002
where pernr in s_pernr.

if not t_datos[] is initial.
t_datos_header[] = t_datos[].
delete adjacent duplicates from t_datos_header
comparing pernr.
endif.


endform.

*&---------------------------------------------------------------------*
*& Form GENERAR_ALV *
*&---------------------------------------------------------------------*
* Creamos el ALV *
*----------------------------------------------------------------------*
form generar_alv.

if not t_datos_header[] is initial.
perform formatear_datos_alv using g_fieldcat[].
perform build_sort.
endif.

endform. "GENERAR_ALV

*&---------------------------------------------------------------------*
*& Form FORMATEAR_DATOS_ALV *
*&---------------------------------------------------------------------*
* Establecemos el catalogo de ALV. *
*----------------------------------------------------------------------*
form formatear_datos_alv using t_fieldcat type slis_t_fieldcat_alv.

data: l_fieldcat type slis_fieldcat_alv.

clear: t_fieldcat.
refresh: t_fieldcat.

clear l_fieldcat.
l_fieldcat-tabname = 'T_DATOS'.
l_fieldcat-fieldname = 'PERNR'.
l_fieldcat-seltext_l = 'Nº personal'.
l_fieldcat-col_pos = 1.
l_fieldcat-outputlen = 8.
append l_fieldcat to t_fieldcat.

clear l_fieldcat.
l_fieldcat-tabname = 'T_DATOS'.
l_fieldcat-fieldname = 'NACHN'.
l_fieldcat-seltext_l = 'Nombre'.
l_fieldcat-col_pos = 2.
l_fieldcat-outputlen = 50.
append l_fieldcat to t_fieldcat.

endform. "FORMATEAR_DATOS_ALV

*&---------------------------------------------------------------------*
*& Form BUILD_SORT
*&---------------------------------------------------------------------*
* Crea el ordenamiento del reporte
*----------------------------------------------------------------------*
form build_sort.

clear g_sort.

g_sort-spos = 1.
g_sort-fieldname = 'PERNR'.
g_sort-up = 'X'.
append g_sort.

endform.

*---------------------------------------------------------------------*
* FORM CREAR_ALV_LIST *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
form generar_alv_list.

data l_alvdat type alvdat.

g_program = sy-repid.

call function 'REUSE_ALV_BLOCK_LIST_INIT'
exporting
i_callback_program = g_program.

loop at t_datos_header.
w_tabix = sy-tabix.
limpiar_tabla t_datos_detail.

loop at t_datos into t_datos_detail
where pernr eq t_datos_header-pernr.
append t_datos_detail.
endloop.

concatenate 'TABLE_' w_tabix into
tab_name.

***************En este perform es donde me da el error*************
perform create_table using 't_datos' tab_name.
**********************************************************
loop at t_datos_detail assigning <line>.
g_lines = <line>.
assign <dyn_wa> to <table>.
<table> = g_lines.
append <dyn_wa> to <dyn_table>.
endloop.

perform crear_alv_list tables <dyn_table>.

endloop.

call function 'REUSE_ALV_BLOCK_LIST_DISPLAY'
exporting
is_print = gt_print.

endform.

*---------------------------------------------------------------------*
* FORM CREAR_ALV_LIST *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
form crear_alv_list tables t_table structure t_datos_detail.
*LISTADO
call function 'REUSE_ALV_BLOCK_LIST_APPEND'
exporting
it_fieldcat = g_fieldcat
is_layout = gs_layout
i_tabname = 'T_DATOS'
it_events = gt_events
tables
t_outtab = t_table.

endform.

*---------------------------------------------------------------------*
* FORM CREATE_TABLE *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
form create_table using my_tab tab_name.


data l_alvdat type alvdat.


create data dataref type (my_tab).
assign dataref->* to <fs>.

descr_struct_ref ?= cl_abap_typedescr=>describe_by_data( <fs> ).

limpiar_tabla it_fieldcatalog.

loop at descr_struct_ref->components assigning <component>.
read table ti_cab with key cab = <component>-name.
if sy-subrc eq 0.
wa_fcat-fieldname = <component>-name.
wa_fcat-ref_table = my_tab.
wa_fcat-ref_field = <component>-name.
append wa_fcat to it_fieldcatalog.
endif.
endloop.

call method cl_alv_table_create=>create_dynamic_table
exporting
it_fieldcatalog = it_fieldcatalog
importing
ep_table = dataref
exceptions
others = 1.

assign dataref->* to <dyn_table>.

l_alvdat-tabname = tab_name.
create data l_alvdat-tdref like line of <dyn_table>.
assign l_alvdat-tdref->* to <dyn_wa>.

endform. "CREATE_TABLE
*&---------------------------------------------------------------------*
*& Form RELLENAR_CAB
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form rellenar_cab.
ti_cab-cab = 'PERNR'.
append ti_cab.
ti_cab-cab = 'NACHN'.
append ti_cab.
endform. " RELLENAR_CAB
__________________
Marilu
Responder Con Cita