MUNDOSAP

Regresar   MUNDOSAP > DESARROLLO > Programación ABAP IV
Nombre de Usuario
Contraseña
Home Descargas Registrar FAQ Miembros Calendario Buscar Temas de Hoy Marcar Foros Como Leídos




 
Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Viejo 13/04/07, 08:43:23
pepe500 pepe500 is offline
Junior Member
 
Fecha de Ingreso: dic 2006
Mensajes: 17
Declarar tabla interna dinamicamente

Saludos, me gustaría saber si hay alguna manera de declararme una tabla interna cuya estructura solo sepa en tiempo de ejecución.

He probado esto:

DATA: BEGIN OF li_tabla OCCURS 0.
INCLUDE STRUCTURE <tbl>.
DATA: END OF li_tabla.

donde <tbl> tiene el nombre de una tabla, pero me da fallo de compilación.
Responder Con Cita
  #2  
Viejo 13/04/07, 09:15:01
ballan ballan is offline
Senior Member
 
Fecha de Ingreso: oct 2006
Mensajes: 671
Una manera de hacer es utilizando el metodo CREATE_DYNAMIC_TABLE de la clase CL_ALV_TABLE_CREATE, creo recordar que solo hay que rellenar el fieldcat con los campos que deseas y el te crea la tabla
Responder Con Cita
  #3  
Viejo 13/04/07, 11:29:02
pepe500 pepe500 is offline
Junior Member
 
Fecha de Ingreso: dic 2006
Mensajes: 17
Gracias ballan por contestar, pero la verdad es que de objetos en SAP no tengo idea. Si me pudieraís especificar más o si supiese de alguna otra forma ...

Un saludo.
Responder Con Cita
  #4  
Viejo 13/04/07, 14:42:53
ballan ballan is offline
Senior Member
 
Fecha de Ingreso: oct 2006
Mensajes: 671
Aqui te dejo un ejemplo, haz un poco de pruebas para adaptarlo a tus necesidades y si tienes alguna duda preguntalo aqui

un saludo

REPORT zprueba003.

DATA: t_fieldcat TYPE lvc_t_fcat,
t_fieldcat_wa TYPE LINE OF lvc_t_fcat.

DATA: tabla TYPE REF TO data.

START-OF-SELECTION.

t_fieldcat_wa-col_pos = '1'.
t_fieldcat_wa-fieldname = 'DOCUM'.
t_fieldcat_wa-ref_table = 'VBAK'.
t_fieldcat_wa-ref_field = 'VBELN'.
APPEND t_fieldcat_wa TO t_fieldcat.
CLEAR t_fieldcat_wa.

t_fieldcat_wa-col_pos = '2'.
t_fieldcat_wa-fieldname = 'POSIC'.
t_fieldcat_wa-ref_table = 'VBAP'.
t_fieldcat_wa-ref_field = 'POSNR'.
APPEND t_fieldcat_wa TO t_fieldcat.
CLEAR t_fieldcat_wa.

t_fieldcat_wa-col_pos = '3'.
t_fieldcat_wa-fieldname = 'STATU'.
t_fieldcat_wa-ref_table = 'VBUK'.
t_fieldcat_wa-ref_field = 'WBSTK'.
APPEND t_fieldcat_wa TO t_fieldcat.
CLEAR t_fieldcat_wa.


CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
* I_STYLE_TABLE =
it_fieldcatalog = t_fieldcat
* I_LENGTH_IN_BYTE =
IMPORTING
ep_table = tabla
* E_STYLE_FNAME =
* EXCEPTIONS
* GENERATE_SUBPOOL_DIR_FULL = 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.
Responder Con Cita
  #5  
Viejo 13/04/07, 15:08:00
Avatar de crounly
crounly crounly is offline
Senior Member
 
Fecha de Ingreso: nov 2006
Localización: Zaragoza, España
Mensajes: 227
Aqui va otro sin objetos, espero que te sirva


DATA: pv_tabla TYPE dd02l-tabname,
generic_table TYPE REF TO data,
generic_line TYPE REF TO data.

FIELD-SYMBOLS: <table> TYPE ANY TABLE,
<wa> TYPE ANY,
<field> TYPE ANY.

*& en pv_tabla almacenamos el nombre de la tabla del diccionario
pv_tabla = 'spfli'.

*& Referenciamos la estructura de la tabla
CREATE DATA generic_table TYPE STANDARD TABLE OF (pv_tabla).
ASSIGN generic_table->* TO <table>.

*& Referenciamos la cabecera de la tabla
CREATE DATA generic_line TYPE (pv_tabla).
ASSIGN generic_line->* TO <wa>.

*& Rellenamos la tabla interna creada dinamicamente
SELECT * INTO CORRESPONDING FIELDS OF TABLE <table> FROM (pv_tabla).

*& Recorremos la tabla creada dinamicamente
LOOP AT <table> INTO <wa>.
DO.

*& Como no conocemos los campos de la tabla hasta la ejecucion
*& assignamos a <field> un campo de la estructura en cada bucle
*& cuando sy-index supere el nº de campos de la estructura
*& sy-subrc = 4 con lo que sale del bucle
ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <field>.
IF sy-subrc <> 0.
EXIT.
ENDIF.
WRITE <field>.
ENDDO.
NEW-LINE.
ENDLOOP.
Responder Con Cita
  #6  
Viejo 16/04/07, 07:22:15
pepe500 pepe500 is offline
Junior Member
 
Fecha de Ingreso: dic 2006
Mensajes: 17
Hola crounly, en la respuesta que me has dado me da fallo de compilación en la línea:

CREATE DATA generic_table TYPE STANDARD TABLE OF (pv_tabla).

He probado de esta manera:

DATA: generic_table TYPE STANDARD TABLE OF (pv_tabla).

pero me dice que el tipo (pv_tabla) es desconocido.

Por otro lado, en esa tabla querría guardar el resultado de una select. Me dejará hacer un into table a una de estas tablas genéricas?

Úlima edición por pepe500 fecha: 16/04/07 a las 07:46:35.
Responder Con Cita
  #7  
Viejo 17/04/07, 06:40:15
Avatar de crounly
crounly crounly is offline
Senior Member
 
Fecha de Ingreso: nov 2006
Localización: Zaragoza, España
Mensajes: 227
pv_tabla contiene el nombre de la tabla a la que quieres atacar, pero que hasta que ejecutes el programa no lo sabras. Si no contiene nada o no existe la tabla que contiene, dara ese error.

Si as manejado punteros en C, esto es parecido pero aqui se llaman FIELD-SYMBOLS.
En el ejemplo hay 3 punteros:

<table> TYPE ANY TABLE, "Para apuntar a una tabla
<wa> TYPE ANY, "Para apuntar a la wa de la tabla
<field> TYPE ANY. "Para apuntar a un campo de la tabla

La idea es que cuando el programa se ejecute y por las acciones del usuario si que sepamos a que tabla atacar <table> apuntara a esa tabla
CREATE DATA generic_table TYPE STANDARD TABLE OF (pv_tabla).
ASSIGN generic_table->* TO <table>.

Y <wa> a la wa o cabecera de esa tabla:
CREATE DATA generic_line TYPE (pv_tabla).
ASSIGN generic_line->* TO <wa>.

Si lo que queremos es introducir datos en una tabla:

pv_tabla = 'ztutabladesconocida'.

CREATE DATA generic_table TYPE STANDARD TABLE OF (pv_tabla).
ASSIGN generic_table->* TO <table>.

CREATE DATA generic_line TYPE (pv_tabla).
ASSIGN generic_line->* TO <wa>.

Select SINGLE * INTO <wa> FROM spfli
WHERE carrid EQ p_carrid.

INSERT <table> FROM <wa>

Si entiendes bien lo de los FIELD-SYMBOLS como punteros lo demas es facil.

Suerte
Responder Con Cita
  #8  
Viejo 17/04/07, 14:37:14
pepe500 pepe500 is offline
Junior Member
 
Fecha de Ingreso: dic 2006
Mensajes: 17
Hola, yo lo que pretendo no es meter los datos en la cabecera de la tabla, si no poder declararme una tabla interna con la misma estructura que la tabla que solo sabre en tiempo de ejecución, y en dicha tabla interna (que no se como declararla) meter los datos con el select into.
Responder Con Cita
  #9  
Viejo 17/04/07, 15:08:30
Avatar de crounly
crounly crounly is offline
Senior Member
 
Fecha de Ingreso: nov 2006
Localización: Zaragoza, España
Mensajes: 227
Entonces igual mas facil...

cuando ya sepas que tabla es

pv_tabla = 'SPFLI'.

la asignas al FIELD-SYMBOL.

CREATE DATA generic_table TYPE STANDARD TABLE OF (pv_tabla).
ASSIGN generic_table->* TO <table>.

y la declaras:

DATA: BEGIN OF ZNUEVATABLA OCCURS 0
INCLUDE STRUCTURE <tabla>,
END OF ZNUEVATABLA.

Esto seria lo mismo que:

DATA: BEGIN OF ZNUEVATABLA OCCURS 0
INCLUDE STRUCTURE spfli,
END OF ZNUEVATABLA.

podrias ordenarlo todo dentro de una subrutina y pasarle en nombre de la tabla de la que vas a copiar la structura y asi la llamas cuando quieras.

suerte
Responder Con Cita
  #10  
Viejo 17/04/07, 15:28:56
pepe500 pepe500 is offline
Junior Member
 
Fecha de Ingreso: dic 2006
Mensajes: 17
La instrucción,

CREATE DATA generic_table ...

sigue dando error.

Por otro lado tampoco me daja declarar una tabla interna haciendo un include structure a un field symbol, también me da error.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Reglas de Mensajes
no puedes crear nuevos temas
no puedes responder temas
no puedes adjuntar archivos
no puedes editar tus mensajes

El código vB está On
Las caritas están On
Código [IMG] está On
Código HTML está Off
Saltar a Foro


Husos Horarios son GMT. La hora en este momento es 08:05:36.


www.mundosap.com 2006 - Spain
software crm, crm on demand, software call center, crm act, crm solutions, crm gratis, crm web