Modificar registro de una tabla interna

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • johava
    Member
    • abr
    • 79

    #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
  • drmezzetta
    Junior Member
    • jun
    • 16

    #2
    Prueba sacarle el WHERE al comando MODIFY.

    saludos.

    Comentario

    • johava
      Member
      • abr
      • 79

      #3
      modificar tabla interna

      Originalmente publicado por drmezzetta
      Prueba sacarle el WHERE al comando MODIFY.

      saludos.

      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

      Comentario

      • Neo_25
        Member
        • jun
        • 51

        #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.

        Comentario

        • Neo_25
          Member
          • jun
          • 51

          #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

          Comentario

          • johava
            Member
            • abr
            • 79

            #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?

            Comentario

            • hrosas
              Member
              • jun
              • 31

              #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

              Comentario

              • Neo_25
                Member
                • jun
                • 51

                #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

                Comentario

                Trabajando...