Datos de una tabla interna que no estan en otra

Estimados todos, nuevamente acudo a ustedes para pedirles una orientación, como podría identificar los datos de una tabla interna, que no se encuentran en otra tabla interna?, había pensado en recorrer ambas con un LOOP, en cuanto uno de los registros no se encuentre en la otra marcar el registro de la primera con una ‘X’ en el campo Ex, algo así:

LOOP ti_data ASSIGNING <wa_data1>. LOOP ti_data2 ASSIGNING <wa_data2> WHERE bukrs EQ <wa_data1>-bukrs AND belnr EQ <wa_data1>-belnr AND gjahr EQ <wa_data1>-gjahr. <wa_data1>-Ex = 'X'. EXIT. ENDLOOP. ENDLOOP. UNASSIGN: <wa_data1>,<wa_data2>. DELETE FROM ti_data1 WHERE Ex EQ 'X'.

El código anterior funciona, como verán luego de identificar que datos de una tabla están presentes en la otra, éstos deben eliminarse.
Pero me gustaría puedan orientarme, si es la mejor manera o de que otra forma podría hacerse, estoy seguro que en términos de rendimiento no es lo mejor, por eso acudo a la comunidad.

Saludos @rsegovia

Una opción seria.

SORT ti_data2 BY bukrs belnr gjahr.
LOOP ti_data ASSIGNING <wa_data1>.
READ TABLE ti_data2 WITH KEY bukrs = < wa_data1 >-bukrs
belnr = <wa_data1>-belnr
gjahr = <wa_data1>-gjahr
TRANSPORTING NO FIELDS BINARY SEARCH.
IF sy-subrc = 0.
<wa_data1>-ex = ‘X’.
ENDIF.
ENDLOOP.
UNASSIGN: <wa_data1>,<wa_data2>.
DELETE FROM ti_data1 WHERE ex EQ ‘X’.

ó

SORT ti_data BY bukrs belnr gjahr.
SORT ti_data2 BY bukrs belnr gjahr.
LOOP ti_data ASSIGNING <wa_data1>.
READ TABLE ti_data2 WITH KEY bukrs = <wa_data1>-bukrs
belnr = <wa_data1>-belnr
gjahr = <wa_data1>-gjahr TRANSPORTING NO FIELDS BINARY SEARCH.
IF sy-subrc = 0.
DELETE ti_data WHERE bukrs EQ <wa_data1>-bukrs
AND belnr EQ <wa_data1>-belnr
AND gjahr EQ <wa_data1>-gjahr.
ENDIF.
ENDLOOP.

1 me gusta

Yo voy mas con la opcion de @rsegovia y como lo estas haciendo con field symbol deberia ser un poco mas rapido. Yo tambien apuntaria a hacer el primer recorrido a la tabla con menos registros.

La otra opcion, funcionaria si y solo si el registro es unico en cada tabla pero si hay registros que se repiten con read solo vas a conseguir una coincidencias nada mas…si se repite una vez, pues la aplicaria !!

y ahora que me acuerdo…si en tu tabla B tienes identificados cuales son los los registros duplicados o que se repiten puedes eliminarlos con el DELETE ADJACENT DUPLICATES FROM si aplica el caso claro !! y ahi pues ya harias el loop un poco mas rapidos al quitar los registros duplicados y ahi el read si lo pudieses aplicar con tranquilidad

1 me gusta

Gracias @David147 probaré tus sugerencias y comentaré los resultados.
@canuto perfecto, no considerado el reducir la cantidad de registros antes del LOOP, me parece que ambas soluciones combinadas podrías mejorar el rendimiento. realizadas las pruebas les comento.

@David147 he probado tu sugerencia

combinado con lo propuesto [quote=“canuto, post:3, topic:8241”]
si en tu tabla B tienes identificados cuales son los los registros duplicados o que se repiten puedes eliminarlos con el DELETE ADJACENT DUPLICATES FROM
[/quote]

y ha funcionado de maravilla, la diferencia de tiempo no es muy significativa, pero sabemos que unos cuantos segundos a la larga suma mucho.

Gracias a ambos por su apoyo.

2 Me gusta

Este tema se cerró automáticamente 7 días después del último post. No se permiten nuevas respuestas.