PDA

Ver la Versión Completa : Problemas con MODIFY


Daniela Gutierrez
23/11/07, 11:59:21
Hola Chicos,
aqui les tengo una consulta de objeto, fijence en un programa estoy creando una tabla interna dinamica, eso esta fino, pero dicha tabla como es dinamica el field-symbol lo declare type any table, y yo estoy manipulando los registros de esta tabla y necesito modificar algunos campos en ella. Qué pasa? cuando le aplico el modify a <l_table> no me lo permite por ser ANY TABLE y el modify no se permite para estos tipo de datos ni para las hashed. Se los pongo abajo:

FIELD-SYMBOLS: <l_table> TYPE ANY TABLE,

<l_line> TYPE ANY,



MOVE-CORRESPONDING <l_line> TO <l_table>.

MODIFY <l_table>.

Error sintaxis: You cannot use explicit or implicit index operations on tables with types "HASHED TABLE" or "ANY TABLE". "<L_TABLE>" has the type "ANY TABLE".
It is possible that before "<L_TABLE>".

Mi pregunta es: qué podre hacer para lograr esto?:confused:

Ignatius
23/11/07, 12:51:24
Daniela,

Hiciste un ASSIGN?

Fijate en el esta página que hay un ejemplo:

Cargar Tabla dinámica

Daniela Gutierrez
23/11/07, 12:58:51
Si, toda mi tabla dinamica y work area corre perfectamente, lo que pasa es que no te copie todo el codigo, te lo pongo abajo, el problema esta es cuando quiero modificar mi tabla transparente de mi work area, fijate:

REPORT z5_convert_tabla.

TYPE-POOLS: slis.

TABLES: dd03p.

DATA: it_fcat TYPE slis_t_fieldcat_alv,
is_fcat LIKE LINE OF it_fcat,
nametab TYPE slis_tabname.

DATA: it_fieldcat TYPE lvc_t_fcat,
is_fieldcat LIKE LINE OF it_fieldcat.

DATA: new_table TYPE REF TO data.
DATA: new_line TYPE REF TO data.

FIELD-SYMBOLS: <l_table> TYPE ANY TABLE,
<l_line> TYPE ANY,
<monto> TYPE ANY,
<campo> TYPE ANY,
<l_field> TYPE ANY.

*//Pantallas.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS: p_tabla TYPE tabname16.
SELECT-OPTIONS: s_campos FOR dd03p-fieldname NO INTERVALS.
SELECTION-SCREEN END OF BLOCK b1.

*// Catalogo
nametab = p_tabla.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = nametab
CHANGING
ct_fieldcat = it_fcat[].

LOOP AT it_fcat INTO is_fcat WHERE NOT reptext_ddic IS INITIAL.
MOVE-CORRESPONDING is_fcat TO is_fieldcat.
is_fieldcat-fieldname = is_fcat-fieldname.
is_fieldcat-ref_field = is_fcat-fieldname.
is_fieldcat-ref_table = is_fcat-ref_tabname.
APPEND is_fieldcat TO it_fieldcat.
ENDLOOP.

break dgutierrez.

*// Crear tabla interna dinámica.
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = it_fieldcat
IMPORTING
ep_table = new_table.


*// Crear area de trabajo de la estrcutura de la misma tabla.
ASSIGN new_table->* TO <l_table>.
CREATE DATA new_line LIKE LINE OF <l_table>.
ASSIGN new_line->* TO <l_line>.



*//Busqueda de datos a convertir.
SELECT * FROM (p_tabla)
INTO CORRESPONDING FIELDS OF TABLE <l_table>.
break dgutierrez.
break atravascio.

DATA: var(100),
cal(15) TYPE c.


*//Conversión de datos.
LOOP AT <l_table> INTO <l_line>.
LOOP AT s_campos.
ASSIGN COMPONENT s_campos-low OF STRUCTURE <l_line> TO <l_field>.
<l_field> = <l_field> / 1000.
:confused:MODIFY (nametab) from <l_field>. :confused:
ENDLOOP.
ENDLOOP.

Esto me da un error en tiempo de ejecución (dump) : SAPSQL_WA_TOO_SMALL

Ignatius
23/11/07, 13:32:56
Daniela,

Probé tu programa y me tira otro dump. Probablemente sea por la tabla y el campo con el que lo estoy ejecutando: como falla el ASSIGN, en la instrucción siguiente me tira un DUMP. Con qué tipo de campo lo estás probando vos?

Igualmente, lo que noto es que vos a <l_field> le estás asignando s_campos-low y después intentás hacer el MODIFY con ese mismo field-symbol... y como ese field-symbol tiene asignado un campo que no es del mismo tipo que la estructura de la tabla está tirando el dump. Fijate que el dump dice que el Work Area de la estructura es muy chico.

Cuando hacés el modify, usá una estructura del tipo de la tabla, y a esa estructura copiale el valor que querés cargar.

Espero que te sirva...

Daniela Gutierrez
23/11/07, 13:43:34
Tienes razon, fue que te lo copie mal. aqui esta cambiado.
*//Conversión de datos.
LOOP AT <l_table> INTO <l_line>.
LOOP AT s_campos.
ASSIGN COMPONENT s_campos-low OF STRUCTURE <l_line> TO <l_field>.
<l_field> = <l_field> / 1000.
MODIFY (nametab) from <l_line>.
ENDLOOP.
ENDLOOP.
Pero de igual manera me sigue dando el mismo dump: SAPSQL_WA_TOO_SMALL
Lo estoy probando con :
Nombre tabla: BSEG.
Campo : DMBTR.
Si, terrible mi prueba utilizando la BSEG jejej, pero este solo lo voy a utilizar con tablas Z.
:)

Ignatius
23/11/07, 14:15:30
Acabo de ver lo que está pasando...

Dentro del código hacés el siguiente loop:
LOOP AT it_fcat INTO is_fcat WHERE NOT reptext_ddic IS INITIAL.
MOVE-CORRESPONDING is_fcat TO is_fieldcat.
is_fieldcat-fieldname = is_fcat-fieldname.
is_fieldcat-ref_field = is_fcat-fieldname.
is_fieldcat-ref_table = is_fcat-ref_tabname.
APPEND is_fieldcat TO it_fieldcat.
ENDLOOP.

Y en base a eso creás it_fieldcat. El problema es que en ese loop no estás tomando todos los campos porque los que tienen el campo reptext_ddic vacío no entran. Entonces, la estructura te queda incompleta y por eso da ese dump cuando intentás hacer el modify. Si le sacás esa condición al loop no te va a tirar más el dump.

Decime si te sirvió!

Daniela Gutierrez
23/11/07, 16:28:25
Pues te cuento, tque tienes mucha razón, no lo habia visto y tenia 2 días en esto. jejejej, muchas gracias!!! :o

Ignatius
23/11/07, 17:03:20
Me alegro que se haya solucionado el problema!

Saludos :)

Magdalena7
13/04/11, 13:38:13
Buen día abapers, quisiera hacerles una consulta a ver si alguien me puede ayudar. Me pasaron un requerimiento en el cual lo que me piden es que al ejecutar la transacción va01 se ingrese un importe, pero en caso de que el usuario le de click al boton back y lo modifique a dicho importe, se pueda tener acceso a ambos. Tanto el importe viejo, como el nuevo.
Dichos valores quieren poder verlos en el momento de hacer click en el botón save.
Estuve analizando un poco, y si bien tengo acceso a las exits que se ejecutan en el momento de modificar dicho valor y de guardar, no me sirve porque la misma llama a una subscreen con lo cual se pierde los valores globales.

No se si entiende, si a alguien se le ocurre como mantener esos valores globalmente se los agradezco mucho.

Aguardo sugerencias,

saludos