#1
|
|||
|
|||
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 |
#2
|
|||
|
|||
Prueba sacarle el WHERE al comando MODIFY.
saludos. |
#3
|
|||
|
|||
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 |
#4
|
|||
|
|||
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. |
#5
|
|||
|
|||
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 |
#6
|
|||
|
|||
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? |
#7
|
|||
|
|||
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 |
#8
|
|||
|
|||
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 |
Herramientas | Buscar en Tema |
Desplegado | |
|
|