MUNDOSAP

MUNDOSAP (foro/index.php)
-   Programación ABAP IV (foro/forumdisplay.php?f=4)
-   -   Modificar registro de una tabla interna (foro/showthread.php?t=35533)

johava 08/03/10 18:42:46

Modificar registro de una tabla interna
 
Hola a todos, tengo la siguiente duda sobre como modificar un regsitro de una tabla interna:

la tabla interna es

data: begin of t_resimp occurs 0,
KEYCTO(6),
TEXTCTO(50),
IMPUESTO like ZPSCD_VLRSATRIB-VALOR,
RESTAIMP like ZPSCD_VLRSATRIB-VALOR,
INDCTO(1),
end of t_resimp.


luego tengo un rutina que lee la tabla, si el registro no existe lo adiciona, en caso contrario lo modifica


*---------------------------------------------------------------------*
* Calcula valores a mostrar en resumen
*---------------------------------------------------------------------*
FORM CALCULA-VALORES.
READ TABLE t_resimp WITH KEY KEYCTO = TOPERA.
IF sy-subrc = 0.
if SUMRES = '+'.
WVALOR = t_resimp-IMPUESTO + t_detimp-VALOR.
t_resimp-IMPUESTO = WVALOR.
MODIFY t_resimp TRANSPORTING IMPUESTO WHERE KEYCTO = TOPERA.

else.
WVALOR = t_resimp-RESTAIMP + t_detimp-VALOR.
t_resimp-RESTAIMP = WVALOR.
MODIFY t_resimp TRANSPORTING RESTAIMP WHERE KEYCTO = TOPERA.
endif.

else.
t_resimp-KEYCTO = TOPERA.
t_resimp-TEXTCTO = DOPERA.
t_resimp-INDCTO = SUMRES.
CLEAR t_resimp-IMPUESTO.
CLEAR t_resimp-RESTAIMP.

if SUMRES = '+'.
t_resimp-IMPUESTO = t_detimp-VALOR.
else.
t_resimp-RESTAIMP = t_detimp-VALOR.
endif.
APPEND t_resimp.
endif.
ENDFORM.


el tema es que la modificacion no me funciona ¿que puede ser? ¿ alguien sabe un metodo mejor?

gracias por la ayuda

drmezzetta 08/03/10 18:53:37

Prueba sacarle el WHERE al comando MODIFY.

saludos.

johava 08/03/10 19:14:26

modificar tabla interna
 


Hola drmezzetta, hice lo que propusiste pero igual no funciona, es mas saca error en la instruccion MODIFY

Err.tmpo.ejec. TABLE_ILLEGAL_STATEMENT

al parece el modify tiene queir asociado a un index

Gracias por responder, y sigo buscando la solución

Neo_25 09/03/10 09:03:18

Utilizas tabla con cabecera,
es obligatorio?

Esto es un ejemplo de tabla sin cabecera.

* Tipo línea para crear estructuras
TYPES: BEGIN OF ty_tyl_resimp,
keycto TYPE char6,
textcto TYPE char50,
impuesto TYPE char50, "LIKE ZPSCD_VLRSATRIB-VALOR,
restaimp TYPE char50, "LIKE ZPSCD_VLRSATRIB-VALOR,
indcto TYPE char1,
END OF ty_tyl_resimp.
* Tipo línea para crear tablas
TYPES: ty_tab_resimp TYPE STANDARD TABLE OF ty_tyl_resimp.

* Tabla
DATA: t_resimp TYPE ty_tab_resimp.
* Estructura
DATA: w_resimp TYPE ty_tyl_resimp.
* Field-Symbols
FIELD-SYMBOLS: <fs_resimp> TYPE ty_tyl_resimp.

CLEAR: w_resimp.
w_resimp-keycto = '111111'.
w_resimp-textcto = 'uno'.
APPEND w_resimp TO t_resimp.

READ TABLE t_resimp ASSIGNING <fs_resimp> WITH KEY keycto = '111111'.
IF sy-subrc = 0.
<fs_resimp>-textcto = 'dos'.
ENDIF.

READ TABLE t_resimp ASSIGNING <fs_resimp> WITH KEY keycto = '111111'.
IF sy-subrc = 0.
<fs_resimp>-textcto = 'tres'.
ENDIF.

Neo_25 09/03/10 09:04:46

Lo tuyo kedaría:

no lo puedo probar porque hay cosas q no tengo.

* Tipo línea para crear estructuras
TYPES: BEGIN OF ty_tyl_resimp,
keycto TYPE char6,
textcto TYPE char50,
impuesto LIKE ZPSCD_VLRSATRIB-VALOR,
restaimp LIKE ZPSCD_VLRSATRIB-VALOR,
indcto TYPE char1,
END OF ty_tyl_resimp.
* Tipo línea para crear tablas
TYPES: ty_tab_resimp TYPE STANDARD TABLE OF ty_tyl_resimp.

* Tabla
DATA: t_resimp TYPE ty_tab_resimp.
* Estructura
DATA: w_resimp TYPE ty_tyl_resimp.
* Field-Symbols
FIELD-SYMBOLS: <fs_resimp> TYPE ty_tyl_resimp.

*---------------------------------------------------------------------*
* Calcula valores a mostrar en resumen
*---------------------------------------------------------------------*
FORM calcula-valores.
READ TABLE t_resimp ASSIGNING <fs_resimp> WITH KEY keycto = topera.
IF sy-subrc = 0.
IF sumres = '+'.
wvalor = t_resimp-impuesto + t_detimp-valor.
<fs_resimp>-impuesto = wvalor.
* Ya no hace falta el modify
* porque el field-symbol lo modifuca solo
* MODIFY t_resimp TRANSPORTING IMPUESTO WHERE KEYCTO = TOPERA.

ELSE.
wvalor = t_resimp-restaimp + t_detimp-valor.
<fs_resimp>-restaimp = wvalor.
* MODIFY t_resimp TRANSPORTING RESTAIMP WHERE KEYCTO = TOPERA.
ENDIF.

ELSE.
<fs_resimp>-keycto = topera.
<fs_resimp>-textcto = dopera.
<fs_resimp>-indcto = sumres.
CLEAR <fs_resimp>-impuesto.
CLEAR <fs_resimp>-restaimp.

IF sumres = '+'.
<fs_resimp>-impuesto = t_detimp-valor.
ELSE.
<fs_resimp>-restaimp = t_detimp-valor.
ENDIF.
APPEND <fs_resimp> TO t_resimp.
ENDIF.
ENDFORM. "CALCULA-VALORES

johava 09/03/10 20:08:25

modificar tabla interna
 
Garcais por responder NEO,

lo solucione asi:
READ TABLE t_resimp WITH KEY KEYCTO = TOPERA.
IF sy-subrc = 0.
if SUMRES = '+'.
WVALOR = t_resimp-IMPUESTO + t_detimp-VALOR.
t_resimp-IMPUESTO = WVALOR.
else.
WVALOR = t_resimp-RESTAIMP + t_detimp-VALOR.
t_resimp-RESTAIMP = WVALOR.
endif.
modify t_resimp INDEX sy-tabix.
else.
xxxx
endif.



Tambien aplique tu solución y funciona bien, cual de las 2 es mas eficiente?

hrosas 09/03/10 22:36:24

segun tengo entendido es el with key mas eficiente de hecho si declaras en tu tabla algun campo key sera mas eficiente

para las modificaciones por importancia y eficiencia son:
index "sy-tabix"
with table key (cuando tiene nuestra tabla interna una llave)
with key (ponemos los campos)

Saludos espero te sirva

Neo_25 10/03/10 09:29:05

Nosotros hacemos todas las tablas sin cabecera, nos obligan.

Así que cuando keremos hacer lo q tu kieres, lo hacemos como te dije y así no usamos el modify. Y tampoco usamos una estructura.
El field-symbol apunta a una dirección y es más rápido.

Si te funcionaron las dos cosas, la q te sea más cómoda o rápida


Husos Horarios son GMT. La hora en este momento es 07:15:35.

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