MUNDOSAP

MUNDOSAP (foro/index.php)
-   Programación ABAP IV (foro/forumdisplay.php?f=4)
-   -   Declarar tabla interna dinamicamente (foro/showthread.php?t=4869)

pepe500 13/04/07 08:43:23

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.

ballan 13/04/07 09:15:01

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

pepe500 13/04/07 11:29:02

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.

ballan 13/04/07 14:42:53

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.

crounly 13/04/07 15:08:00

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.

pepe500 16/04/07 07:22:15

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?

crounly 17/04/07 06:40:15

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

pepe500 17/04/07 14:37:14

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.

crounly 17/04/07 15:08:30

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

pepe500 17/04/07 15:28:56

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.


Husos Horarios son GMT. La hora en este momento es 08:40:38.

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