2012-05-29 16 views
6

Estoy tratando de encontrar la forma de leer una tabla interna que se debe crear dinámicamente. Creé el siguiente informe que llena una tabla interna dinámica con datos. En la última línea, estoy tratando de leerlo con una clave (mandt por ejemplo). El problema es que recibo el error, "el tipo especificado no tiene estructura y, por lo tanto, no hay ningún componente llamado MANDT".Lectura de itab con la especificación de clave dinámica

He depurado y puedo ver que se ha completado con éxito y que la estructura de la tabla (nombres de campo) es correcta. El problema se presenta cuando trato de leer la tabla en un área de trabajo. Tal vez estoy haciendo esto mal, pero parece que algo debería ser posible todo, y tengo la sensación de que me estoy perdiendo algo pequeño.

La razón por la que estoy probando esto es porque he encontrado selecciones idénticas en un programa y quiero almacenar los registros en la memoria y leerlos desde allí para evitar los accesos a la base de datos. Esto es fácil de implementar, sin embargo, no lo he hecho cuando la tabla, la cláusula where y la cláusula into de la instrucción OPEN SQL que estoy tratando de optimizar son dinámicas.

Saludos.

DATA: t681_rep TYPE TABLE OF t681 , wa_681 LIKE LINE OF t681_rep, 
     tabref TYPE REF TO data , waref TYPE REF TO data. 

FIELD-SYMBOLS: <any_tab> TYPE ANY TABLE, 
       <any_wa> TYPE ANY, 
       <var1> TYPE ANY. 
"fill t681_rep 
SELECT * 
    FROM t681 
    INTO TABLE t681_rep 
    UP TO 1 ROWS WHERE kotab = 'A002'. 

READ TABLE t681_rep INTO wa_681 WITH KEY kotab = 'A002'. 
IF sy-subrc = 0. 

    "if A002 is found create a table of that type and fill it 
    CREATE DATA tabref TYPE TABLE OF (wa_681-kotab). 
    ASSIGN tabref->* TO <any_tab>. 
    SELECT * UP TO 10 ROWS 
    FROM (wa_681-kotab) 
    INTO TABLE <any_tab>. 

ENDIF. 

CREATE DATA waref TYPE a002. 
ASSIGN waref->* TO <any_wa>. 

READ TABLE <any_tab> ASSIGNING <any_wa> WITH KEY mandt = '800'. <- problem area 
IF sy-subrc = 0. 
    "do stuff with <any_wa>... 
ENDIF. 

Respuesta

1

yo sepa, tiene que hacerlo el 'camino más largo':

FIELD-SYMBOLS: <any_field> TYPE any.  
LOOP AT <any_tab> ASSIGNING <any_wa>. 
    ASSIGN COMPONENT 'MANDT' OF STRUCTURE <any_wa> TO <any_field>. 
    IF <any_field> <> 800. 
    CONTINUE. 
    ENDIF. 
    " do stuff with <any_wa> - you will have to assign <any_field> again to access fields. 
ENDLOOP. 
3

sólo tiene que poner el nombre del campo entre paréntesis.

data: field type string. 
field = 'MANDT'. 
READ TABLE <any_tab> ASSIGNING <any_wa> WITH KEY (field) = '800'. 
IF sy-subrc = 0. 
    "do stuff with <any_wa>... 
ENDIF. 
+0

Hola Brian, gracias por su respuesta. Eso funciona, pero estoy buscando una solución completamente dinámica. En pseudocódigo algo así como: –

+0

Parece que falta algo de ese comentario ... –

2

Estás tratando de ganarle a una base de datos en eficiencia, es una batalla perdida.

Simplemente vaya a SE11, seleccione su tabla, vaya a la configuración técnica y cambie la configuración técnica (buffering & tipo de almacenamiento en búfer), no necesita una clave de modificación de objeto para esto. También puede asegurarse de que la categoría de tamaño sea correcta.

1

Puede usar RTTS para obtener las claves de la tabla.

data table_name type string. 
table_name = 'A002'. 

" Dynamically create the table type 
data the_table type ref to data. 
create data the_table type table of (table_name). 

" Use RTTS to get table keys 
data typedescription type ref to cl_abap_tabledescr. 
typedescription ?= cl_abap_tabledescr=>describe_by_data_ref(the_table). 
data keys type abap_table_keydescr_tab. 
keys = typedescription->get_keys(). 
0
REPORT y_test_dynamic_table. 
DATA: table_name TYPE string, 
typedescription TYPE REF TO cl_abap_tabledescr, 
keys TYPE abap_keydescr_tab, 
ls_key TYPE abap_keyname. 

table_name = 'ZYFRM_STG'. 

" Dynamically create the table type 
DATA the_table TYPE REF TO data. 
CREATE DATA the_table TYPE TABLE OF (table_name). 

" Use RTTS to get table keys 

typedescription ?= cl_abap_tabledescr=>describe_by_data_ref(the_table). 

keys = typedescription->KEY. 

loop at keys INTO ls_key. 
*** 
ENDLOOP. 
Cuestiones relacionadas