Ayuda con registros duplicados

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • stormshadow
    Senior Member
    • jun
    • 117

    #1

    Ayuda con registros duplicados

    Hola gente, pues traigo esta leve duda, yo estaba creando un programa para extraer registros duplicados de una tabla, bien pues un bro de aquí me alivianó y me dió una solución, estubo bien pero tardaba en sacar todos los registros, ahora me ayudaron a crear este que voy a mostrar acontinuación, pero me falta algo, bien explico, este programa extrae todos los registros duplicados del campo bstnk, que es la clave del pedido, ok pues hay otra tabla la cual contiene un campo que dice el motivo por el que se rechazó ese pedido, pues yo lo que quiero es que si por ejemplo un pedido se repite ocho veces y uno de esos tiene motivo de rechazo, excluirlo y ahora mostrar solo 7 registros repetidos, no sé si me de a entender...

    Eh pensado en crearlo con un loop pero no me sale pero bueno espero su ayuda, gracias!


    ************************************************** **********************
    * TABLAS
    ************************************************** **********************
    TABLES: vbak,
    vbap.
    ************************************************** **********************
    * ESTRUCTURAS
    ************************************************** **********************
    DATA: BEGIN OF t_pedidos OCCURS 0,
    vbeln LIKE vbak-vbeln, "REFERENCIA
    bstnk LIKE vbak-bstnk, "CLAVE PEDIDO
    ernam LIKE vbak-ernam, "NOMBRE
    audat LIKE vbak-audat, "FECHA
    abgru LIKE vbap-abgru, "MOTIVO RECHAZO
    END OF t_pedidos.

    DATA: BEGIN OF t_clavesAux OCCURS 0,
    bstnk LIKE vbak-bstnk, "CLAVE PEDIDO
    Numreg TYPE i,
    END OF t_clavesAux.

    Data: t_claves LIKE STANDARD TABLE OF ZTSD_PEDUP,
    wa_claves LIKE LINE OF t_claves.

    START-OF-SELECTION.

    DELETE FROM ZTSD_PEDUP.

    IF sy-subrc EQ 0.

    SELECT
    vbak~bstnk "CLAVE DEL PEDIDO
    count( * ) As Numreg
    FROM vbak
    INTO TABLE t_clavesAux
    WHERE vbak~bstnk NE ''
    Group BY bstnk
    HAVING count( * ) GT 1.

    LOOP AT t_clavesAux INTO wa_aux.

    wa_claves-bstnk = wa_aux-bstnk.
    wa_claves-NumReg = wa_aux-NumReg.

    APPEND wa_claves TO t_claves.

    ENDLOOP.

    INSERT ZTSD_PEDUP FROM TABLE t_claves.

    SELECT DISTINCT vbeln bstnk ernam audat
    FROM vbak
    INTO TABLE t_pedidos
    WHERE bstnk IN ( SELECT bstnk FROM ZTSD_PEDUP ).


    ENDIF.
    Editado por última vez por stormshadow; 18/06/2008, 16:11:45.
    "Si quieres resultados distintos, no hagas siempre lo mismo" .... Einstein
  • stormshadow
    Senior Member
    • jun
    • 117

    #2
    Hola gente, soy yo de nuevo, pues bien, e resuelto mi problema, y ahora ya conseguí lo que quería, pero ahora, hay otro leve requerimiento, ya eh sacado los registros duplicados, si alguno de ellos tiene un motivo de rechazo ya lo excluí pero ahora les voy a explicar lo que sigue:
    Como ponía anteriormente, si hay un registro que se repite 8 veces y uno tiene motivo de rechazo tenía que excluirlo, pues lo e hecho, pero ahora si por ejemplo, un registro está repetido dos veces y uno de estos dos tiene motivo de rechazo pues mi programa lo va a excluir y me va a quedar solo uno, y ese me lo va a mostrar, lo cual no tiene porque! porque ya va a ser solo un registro y el cual ya no va a estar duplicado...
    Lo que yo tengo que hacer es que en ese tipo de casos ya no me lo muestre, no sé si me expliqué, bueno ojalá me puedan ayudar, eh pensado en hacer esto con un contador, pero pues espero sus respuestas, gracias!!
    Eh aquí mi código:

    REPORT ZSD_PEDIDOSDUPLICADOS.


    TABLES: vbak,
    vbap.

    DATA: BEGIN OF t_pedidos OCCURS 0,
    vbeln LIKE vbak-vbeln, "REFERENCIA
    bstnk LIKE vbak-bstnk, "CLAVE PEDIDO
    ernan LIKE vbak-ernam, "NOMBRE
    audat LIKE vbak-audat, "FECHA
    refer LIKE vbap-vbeln,
    abgru LIKE vbap-abgru,
    END OF t_pedidos.

    DATA: BEGIN OF t_clavesAux OCCURS 0,
    bstnk LIKE vbak-bstnk, "CLAVE PEDIDO
    Numreg TYPE i,
    END OF t_clavesAux.

    DATA: BEGIN OF t_motaux OCCURS 0,
    vbeln LIKE vbap-vbeln, "REFERENCIA
    abgru LIKE vbap-abgru,
    END OF t_motaux.

    Data wa_aux LIKE LINE OF t_clavesAux.

    Data: t_claves LIKE STANDARD TABLE OF ZTSD_PEDUP,
    wa_claves LIKE LINE OF t_claves.



    START-OF-SELECTION.


    DELETE FROM ZTSD_PEDUP.

    IF sy-subrc EQ 0.

    SELECT
    vbak~bstnk "CLAVE DEL PEDIDO
    count( * ) As Numreg
    FROM vbak
    INTO TABLE t_clavesAux
    WHERE vbak~bstnk NE ''
    Group BY bstnk
    HAVING count( * ) GT 1.

    LOOP AT t_clavesAux INTO wa_aux.

    wa_claves-bstnk = wa_aux-bstnk.
    wa_claves-NumReg = wa_aux-NumReg.

    APPEND wa_claves TO t_claves.

    ENDLOOP.

    INSERT ZTSD_PEDUP FROM TABLE t_claves.

    SELECT DISTINCT vbeln bstnk ernam audat
    FROM vbak
    INTO TABLE t_pedidos
    WHERE bstnk IN ( SELECT bstnk FROM ZTSD_PEDUP ).

    SORT t_pedidos BY bstnk.


    LOOP AT t_pedidos.

    SELECT DISTINCT vbeln abgru
    FROM vbap
    APPENDING TABLE t_motaux
    WHERE vbeln EQ t_pedidos-vbeln
    AND abgru NE ''.

    IF sy-subrc EQ 0.

    DELETE t_pedidos.

    ENDIF.

    ENDLOOP.

    ENDIF.


    LOOP AT t_pedidos.
    WRITE:/ t_pedidos-vbeln,
    t_pedidos-bstnk,
    t_pedidos-ernan,
    t_pedidos-audat,
    t_pedidos-refer,
    t_pedidos-abgru.
    ENDLOOP.


    LOOP AT t_motaux.
    WRITE:/ t_motaux-vbeln,
    t_motaux-abgru.
    ENDLOOP.
    "Si quieres resultados distintos, no hagas siempre lo mismo" .... Einstein

    Comentario

    • ludmila22
      Junior Member
      • may
      • 24

      #3
      analicemos un poco:

      el registro que debe mostrar debe ser distinto de rechazado y además debe tener un duplicado por lo menos.
      Y hacer un write sólo cuando estas condiciones son ciertas

      Entonces tenemos un loop a la tabla en cuestión

      un if para que cuando se cumplan las condiciones enumeradas más arriba se haga un then write el record que corresponda. Ya sea haciendo un write de cada campo del registro o solo de uno.

      Espero haber echado algo de luz.

      Comentario

      • stormshadow
        Senior Member
        • jun
        • 117

        #4
        Ey que tal, gracias por tú respuesta, de hecho si m ayudaste, solo que tengo un leve problemita de sintaxis, mira esto fué lo que hize:

        LOOP AT t_pedidos.
        SELECT DISTINCT vbeln
        FROM vbap
        APPENDING TABLE t_motaux
        WHERE vbeln EQ t_pedidos-vbeln.
        IF t_motaux-vbeln GT 1.
        LOOP AT t_pedidos.
        WRITE:/ t_pedidos-vbeln,
        t_pedidos-bstnk,
        t_pedidos-ernan,
        t_pedidos-audat,
        t_pedidos-refer,
        t_pedidos-abgru.
        ENDLOOP.

        ENDIF.

        ENDLOOP.


        Pero no me imprime nada podrían ayudarme??

        --------
        Pongo el código completo:

        START-OF-SELECTION.


        DELETE FROM ZTSD_PEDUP.

        IF sy-subrc EQ 0.

        SELECT
        vbak~bstnk "CLAVE DEL PEDIDO
        count( * ) As Numreg
        FROM vbak
        INTO TABLE t_clavesAux
        WHERE vbak~bstnk NE ''
        Group BY bstnk
        HAVING count( * ) GT 1.

        LOOP AT t_clavesAux INTO wa_aux.

        wa_claves-bstnk = wa_aux-bstnk.
        wa_claves-NumReg = wa_aux-NumReg.

        APPEND wa_claves TO t_claves.

        ENDLOOP.

        INSERT ZTSD_PEDUP FROM TABLE t_claves.

        SELECT DISTINCT vbeln bstnk ernam audat
        FROM vbak
        INTO TABLE t_pedidos
        WHERE bstnk IN ( SELECT bstnk FROM ZTSD_PEDUP ).

        SORT t_pedidos BY bstnk.


        LOOP AT t_pedidos.

        SELECT DISTINCT vbeln abgru
        FROM vbap
        APPENDING TABLE t_motaux
        WHERE vbeln EQ t_pedidos-vbeln
        AND abgru NE ''.

        IF sy-subrc EQ 0.

        DELETE t_pedidos.

        ENDIF.

        ENDLOOP.


        LOOP AT t_pedidos.
        SELECT DISTINCT vbeln
        FROM vbap
        APPENDING TABLE t_motaux
        WHERE vbeln EQ t_pedidos-vbeln.
        IF t_motaux-vbeln GT 1.
        LOOP AT t_pedidos.
        WRITE:/ t_pedidos-vbeln,
        t_pedidos-bstnk,
        t_pedidos-ernan,
        t_pedidos-audat,
        t_pedidos-refer,
        t_pedidos-abgru.
        ENDLOOP.

        ENDIF.

        ENDLOOP.



        ENDIF.
        Editado por última vez por stormshadow; 23/06/2008, 15:52:37.
        "Si quieres resultados distintos, no hagas siempre lo mismo" .... Einstein

        Comentario

        • stormshadow
          Senior Member
          • jun
          • 117

          #5
          Bien, soy yo una vez más jeje dirán a como friega este cuate, ps yo pregunto de ratito solo me contesto, bueno otra vez tengo un dilema, ya resolví todo el programa justo como lo quería, pero ahora hay un problemita, lo calo en DEV con el mandante 250 y me muestra registros, pero cuando lo calo en QAS mandante 400 no me muestra nada! más que una línea que pinté para dividir los registros, miren este es el código:

          START-OF-SELECTION.


          DELETE FROM ZTSD_PEDUP.

          IF sy-subrc EQ 0.

          SELECT
          vbak~bstnk "CLAVE DEL PEDIDO
          count( * ) As Numreg
          FROM vbak
          INTO TABLE t_clavesAux
          WHERE vbak~bstnk NE ''
          Group BY bstnk
          HAVING count( * ) GT 1.

          LOOP AT t_clavesAux INTO wa_aux.

          wa_claves-bstnk = wa_aux-bstnk.
          wa_claves-NumReg = wa_aux-NumReg.

          APPEND wa_claves TO t_claves.

          ENDLOOP.

          INSERT ZTSD_PEDUP FROM TABLE t_claves.

          SELECT DISTINCT vbeln bstnk ernam audat
          FROM vbak
          INTO TABLE t_pedidos
          WHERE bstnk IN ( SELECT bstnk FROM ZTSD_PEDUP ).

          SORT t_pedidos BY bstnk.


          LOOP AT t_pedidos.

          SELECT DISTINCT vbeln abgru
          FROM vbap
          APPENDING TABLE t_motaux
          WHERE vbeln EQ t_pedidos-vbeln
          AND abgru NE ''.

          IF sy-subrc EQ 0.

          DELETE t_pedidos.

          ENDIF.

          ENDLOOP.

          SORT t_pedidos BY bstnk.

          w_index = 0.
          w_contador = 0.
          CLEAR w_bstnk.

          LOOP AT t_pedidos.
          WRITE:/ t_pedidos-vbeln,
          t_pedidos-bstnk,
          t_pedidos-ernan,
          t_pedidos-audat,
          t_pedidos-refer,
          t_pedidos-abgru.
          ENDLOOP.



          LOOP AT t_pedidos.

          w_index = sy-tabix.

          IF w_bstnk NE t_pedidos-bstnk.

          IF w_contador EQ 1.

          w_index = w_index - 1.

          DELETE t_pedidos Index w_index.

          ENDIF.

          w_bstnk = t_pedidos-bstnk.

          w_contador = 1.

          continue.

          ENDIF.

          w_contador = w_contador + 1.


          *
          * WRITE:/ t_pedidos-vbeln,
          * t_pedidos-bstnk,
          * t_pedidos-ernan,
          * t_pedidos-audat,
          * t_pedidos-refer,
          * t_pedidos-abgru.

          ENDLOOP.


          ENDIF.

          WRITE:/ '---------------------'.
          LOOP AT t_pedidos.
          WRITE:/ t_pedidos-vbeln,
          t_pedidos-bstnk,
          t_pedidos-ernan,
          t_pedidos-audat,
          t_pedidos-refer,
          t_pedidos-abgru.
          ENDLOOP.


          Alguién sabe porque sucede eso???
          "Si quieres resultados distintos, no hagas siempre lo mismo" .... Einstein

          Comentario

          • danny
            Member
            • mar
            • 36

            #6
            Holas
            los datos en QAS Y DEV son los mismos? pasaste el desarrollo a QAS?..

            Saludos;

            Comentario

            Trabajando...