MUNDOSAP

MUNDOSAP (foro/index.php)
-   Programación ABAP IV (foro/forumdisplay.php?f=4)
-   -   Tabla Interna Dinamica (foro/showthread.php?t=2965)

luisgb 12/12/06 15:50:28

Tabla Interna Dinamica
 
Amig@s necesito saber como puedo declarar... y me refiero a dinamica en el hecho que el numero de campos es variable
Gracias

Luis G.

SPlNeTe 13/12/06 13:21:15

Haber si te vale esto.

DATA: PV_TABLA TYPE DD02L-TABNAME,
GENERIC_TABLE_WA TYPE REF TO DATA.
FIELD-SYMBOLS: <WA> TYPE ANY,
<FIELD>.

CREATE DATA GENERIC_TABLE_WA TYPE (PV_TABLA).
ASSIGN GENERIC_TABLE_WA->* TO <WA>.

....
ASSIGN COMPONENT LV_COMPONENT OF STRUCTURE <WA> TO <FIELD>.
MODIFY (PV_TABLA) FROM <WA>.
....

Si tienes alguna duda sobre el codigo pregunta.

Saludos.

crounly 13/12/06 14:37:42

Una duda...

Este codigo serviria si ya existiese la tabla en el diccionario, no?

Por Ejemplo, digamos que necesito una tabla interna con la estructura de una tabla del diccionario, pero no se que tabla sera hasta que se ejecute el programa

Seria algo asi:
DATA: PV_TABLA TYPE DD02L-TABNAME,
GENERIC_TABLE_WA TYPE REF TO DATA.
FIELD-SYMBOLS: <WA> TYPE ANY,
<FIELD>.

DATA: MI_TABLA TYPE STANDARD TABLE OF MARA
WITH HEADER LINE.

PV_TABLA = 'MI_TABLA'.
CREATE DATA GENERIC_TABLE_WA TYPE (PV_TABLA).
ASSIGN GENERIC_TABLE_WA->* TO <WA>.

o serviria para crear cualquier tabla interna sin que exista en el diccionario?

SPlNeTe 13/12/06 14:49:55

crounly tu ejemplo estaria bien salvo por esto:

CREATE DATA GENERIC_TABLE_WA TYPE (PV_TABLA).
que seria
CREATE DATA GENERIC_TABLE_WA LIKE (PV_TABLA).

Este ejemplo sirve para crear una tabla interna de forma dinamica con la estructura de cualquier tabla del diccionario de datos o de otra tabla interna, solo conociendo el nombre de la tabla.

Saludos.

crounly 13/12/06 15:01:50

okas, gracias SPINeTe :)

Lo que me gustaria probar seria lo contrario, mas o menos... crear una tabla interna en tiempo de ejecucion que no tenga reflejo en el diccionario o que coja tipos de campos de tablas del diccionario diferentes.

Estaba pensando en un programa de prueba que por ejemplo te deje seleccionar un numero de tablas del diccionario y dentro de cada tabla algunos campos de la misma para despues crear una tabla interna que aglutine los campos seleccionados.

SPlNeTe 13/12/06 15:49:11

La unica solucion que veo a eso que comentas es crear codigo dinamico.

DATA: CODE TYPE TABLE OF RSSOURCE-LINE,
LINEA LIKE RSSOURCE-LINE.

DATA: VARIABLE(10). "ESTA VARIABLE LLEVA EL NOMBRE DE LA TABLA.

VARIABLE = 'ZAPR'.

CLEAR LINEA.
CONCATENATE 'TABLES: ' VARIABLE INTO LINEA SEPARATED BY SPACE.
CONCATENATE LINEA '.' INTO LINEA.
APPEND LINEA TO CODE.

CLEAR LINEA.
CONCATENATE 'DATA TI_' VARIABLE INTO LINEA.
CONCATENATE LINEA 'LIKE' VARIABLE INTO LINEA SEPARATED BY SPACE.
CONCATENATE LINEA 'OCCURS 0 WITH HEADER LINE.' INTO LINEA SEPARATED BY
SPACE..
APPEND LINEA TO CODE.

INSERT REPORT 'ZREPORTDINAMICHR' FROM CODE.

Este es un ejemplo que puso un compañero en otro hilo.

Espero que te "ilumine".

Saludos.

crounly 14/12/06 11:17:56

La linea

CREATE DATA GENERIC_TABLE_WA LIKE (PV_TABLA).

da un fallo de sintaxis, y con el TYPE, lo que crea dinamicamente es un campo estructurado, no una tabla interna que es el objetivo.

Rebuscando en la ayuda de SAP encontre que hay una opcion para CREATE DATA que se utiliza para variables referenciadas a tablas

Al final necesitamos 2 variables referenciadas y dos field-symbols, 1 variable sera la tabla y otra la cabecera.

Despues de secuencia 'Prueba y Error" ha quedado el siguiente codigo:

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.

pv_tabla = 'spfli'.

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 * INTO CORRESPONDING FIELDS OF TABLE <table> FROM (pv_tabla).

LOOP AT <table> INTO <wa>.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <field>.
IF sy-subrc <> 0.
EXIT.
ENDIF.
WRITE <field>.
ENDDO.
NEW-LINE.
ENDLOOP.

si cambias spfli por mara o otra tabla del diccionario creara una tabla interna identica y mostrara su contenido por pantalla.

Gracias por el codigo SPINete, mas o menos veo la luz, probara a ver que sale.

vstarke 28/02/12 16:15:51

el código correcto para tabla interna dinámica es el siguiente....

IMPORTANTE: EL NOMBRE DE LA TABLA INTERNA DEBERÁ ESTAR CON CORCHETE -> []... LO QUE HICE FUE HACER UNA RUTINA QUE RECIBE EL NOMBRE DE LA TABLA INTERNA.

FIELD-SYMBOLS: <FS_TABLE> TYPE ANY TABLE,
<FS_WA> TYPE ANY,
<FS_FIELD> TYPE ANY.

P_TABLE = P_NAMETAB.

ASSIGN (P_TABLE) TO <FS_TABLE>.

LOOP AT <FS_TABLE> ASSIGNING <FS_WA>.
.
.
.
.


Husos Horarios son GMT. La hora en este momento es 15:29:46.

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