PDA

Ver la Versión Completa : Ayuda con registros duplicados


stormshadow
18/06/08, 15:30:09
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.

stormshadow
20/06/08, 19:00:26
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.

ludmila22
20/06/08, 19:51:50
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.

stormshadow
23/06/08, 15:41:36
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.

stormshadow
23/06/08, 19:03:55
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???

danny
25/06/08, 15:31:52
Holas
los datos en QAS Y DEV son los mismos? pasaste el desarrollo a QAS?..

Saludos;