Dato perdido.

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • DCErick
    Moderator
    • mar
    • 1090

    #1

    Dato perdido.

    Hola a todos. tengo un problema con el siguiente segmento de código....

    Código:
     LOOP AT t_zekko.
        v_tabix = sy-tabix.
    
        SELECT belnr ebeln bewtp bwart
          FROM ekbe
          INTO CORRESPONDING FIELDS OF TABLE t_zekbe_del
          WHERE ebeln = t_zekko-ebeln
          GROUP BY belnr ebeln bewtp bwart
          ORDER BY belnr DESCENDING.
    
        IF t_zekbe_del[] IS INITIAL.
          DELETE t_zekko INDEX v_tabix.
          CLEAR t_zekbe_del.
        ELSE.
          LOOP AT t_zekbe_del.
            IF t_zekbe_del-bewtp = 'U' AND t_zekbe_del-bwart = '351'.
              MOVE : t_zekbe_del-belnr TO t_zekko-belnr.
            ELSE.
              CLEAR t_zekbe_del.
              DELETE t_zekko INDEX v_tabix.
            ENDIF.
            EXIT.
          ENDLOOP.
          CLEAR t_zekbe_del.
        ENDIF.
    
      ENDLOOP.
    Cuando yo lo ejecuto en modo debug.... la siguiente linea
    MOVE : t_zekbe_del-belnr TO t_zekko-belnr.

    Si hace lo que tiene que hacer pro cuando salgo de LOOP "LOOP AT t_zekko."

    El campo t_zekko-belnr por obra del espiritu santo sale sin nada, cuando en modo debug yo vi que si se le asignaron valores...

    Alguna idea.... Falta alguna instruccion para aceptar cambios o en que estoy mal...
    -------------------
    ¿Dudas para descargar manuales? Ver este tema -> Cómo descargar manuales de la sección "Descargas" ?
  • erp
    Junior Member
    • feb
    • 21

    #2
    Hola DCErick,

    Tu problema es que solo has modificado el registro de cabecera de la tabla interna t_zekko no el registro en si. Necesitas un append o un modify.

    De todas formas un consejo. Nunca borres ni añadas registros en una tabla interna sobre la que estas haciendo un loop. Usa una tabla auxiliar.

    Ej:


    Código:
     LOOP AT t_zekko.
     
        SELECT belnr ebeln bewtp bwart
          FROM ekbe
          INTO CORRESPONDING FIELDS OF TABLE t_zekbe_del
          WHERE ebeln = t_zekko-ebeln
          GROUP BY belnr ebeln bewtp bwart
          ORDER BY belnr DESCENDING.
     
        IF SY-SUBRC = 0 THEN.
          LOOP AT t_zekbe_del.
            IF t_zekbe_del-bewtp = 'U' AND t_zekbe_del-bwart = '351'.
              MOVE : t_zekbe_del-belnr TO t_zekko-belnr.
                .
                .   
              LLena los valores de una tabla auxiliar t_zekbe_aux con los valores del select y los de t_zekbe [B]y luego añade el registro con APPEND[/B]
                .
              APPEND t_zekbe_aux.
                .
                .
     
            ENDIF.
          ENDLOOP.
          CLEAR t_zekbe_del.
        ENDIF.
     
      ENDLOOP.
    Un saludo
    Editado por última vez por tracer; 13/05/2006, 18:14:50.
    El consultor anteriormente conocido como dump

    Comentario

    • DCErick
      Moderator
      • mar
      • 1090

      #3
      Hola ya mas o menos te entendi y yo lo habia logrado así...

      Código:
        LOOP AT t_zekko.
          v_tabix = sy-tabix.
      
      ****Esta consulta se usa tamb. para ver si un 351 ya fue cancelado con un 352.
      ****Se supone que los movimientos 101 no se cancelan.
      ****Checar como es el proceso de cancelado
      
          SELECT belnr ebeln bewtp bwart
            FROM ekbe
            INTO CORRESPONDING FIELDS OF TABLE t_zekbe_del
            WHERE ebeln = t_zekko-ebeln
            GROUP BY belnr ebeln bewtp bwart
            ORDER BY belnr DESCENDING.
      
          IF t_zekbe_del[] IS INITIAL.
            DELETE t_zekko INDEX v_tabix.
            CLEAR t_zekbe_del.
          ELSE.
            LOOP AT t_zekbe_del.
              IF t_zekbe_del-bewtp = 'U' AND t_zekbe_del-bwart = '351'.
                MOVE:  t_zekbe_del-belnr TO t_zekko_-belnr,
                       t_zekko-ebeln TO t_zekko_-ebeln,
                       t_zekko-aedat TO t_zekko_-aedat,
                       t_zekko-reswk TO t_zekko_-reswk,
                       t_zekko-ekgrp TO t_zekko_-ekgrp,
                       t_zekko-bedat TO t_zekko_-bedat.
                APPEND: t_zekko_.
              ELSE.
                DELETE t_zekko INDEX v_tabix.
              ENDIF.
              EXIT.
            ENDLOOP.
          ENDIF.
      
        ENDLOOP.
      
        CLEAR t_zekko[].
        t_zekko[] = t_zekko_[].
      Pero ya con tu consejo, creo que podré simplificar eso del delete en loop. gracias amigo, creo que al final de cuentas no ando tan perdido jeje....
      -------------------
      ¿Dudas para descargar manuales? Ver este tema -> Cómo descargar manuales de la sección "Descargas" ?

      Comentario

      • DCErick
        Moderator
        • mar
        • 1090

        #4
        Listo ya salio con menos codigo....

        Código:
          LOOP AT t_zekko.
            SELECT belnr ebeln bewtp bwart
              FROM ekbe
              INTO CORRESPONDING FIELDS OF TABLE t_zekbe_del
              WHERE ebeln = t_zekko-ebeln
              GROUP BY belnr ebeln bewtp bwart
              ORDER BY belnr DESCENDING.
        
            IF sy-subrc = 0.
              READ TABLE t_zekbe_del.
              IF t_zekbe_del-bewtp = 'U' AND t_zekbe_del-bwart = '351'.
                MOVE-CORRESPONDING t_zekko TO t_zekko_.
                MOVE:  t_zekbe_del-belnr TO t_zekko_-belnr.
                APPEND: t_zekko_.
              ENDIF.
            ENDIF.
        
            CLEAR t_zekbe_del.
            REFRESH t_zekbe_del.
          ENDLOOP.
        Gracias erp por tus consejos....
        -------------------
        ¿Dudas para descargar manuales? Ver este tema -> Cómo descargar manuales de la sección "Descargas" ?

        Comentario

        Trabajando...