İki tablo arasında farklılıkları bulma algoritması
İki tablo arasındaki farkı bulmak için kullanılacak algoritma
İlk tablodaki tüm satırlar için;
ikinci tabloda kayıt var mı kontrolü,
varsa fark var mı? Fark varsa güncellemedir, Fark yoksa değişiklik olmamıştır. bu kontrolden sonra eleme var.
yoksa yeni kayıttır.
İkinci tabloda elenmeden kalan kayıtlar silinmiş demektir.
Kod:
types: begin of ty_cache ,
vkorg type vkorg ,
vtweg type vtweg ,
spart type spart ,
kunnr type kunnr ,
matnr type matnr ,
maktx type maktx,
brgew type brgew,
gewei type gewei,
end of ty_cache.
types: tty_cache type sorted table of ty_cache with unique key vkorg vtweg spart kunnr matnr.
constants c_proc_insert type c value `I`.
constants c_proc_update type c value `U`.
constants c_proc_delete type c value `D`.
constants c_proc_none type c value `N`.
form f_get_diff using prt_previus type tty_cache
prt_last type tty_cache
changing cht_diff type tty_cache.
data: lt_previus type tty_cache.
data: lt_last type tty_cache.
data: ls_last type ty_cache,
ls_previus type ty_cache ,
ls_diff type ty_cache ,
lv_subrc type sy-subrc.
data: lv_xndx_last type int4.
data: lv_xndx_previus type int4.
lt_previus[] = prt_previus[].
lt_last[] = prt_last[].
refresh cht_diff.
loop at lt_last into ls_last.
lv_xndx_last = sy-tabix.
clear ls_diff.
clear lv_xndx_previus.
read table lt_previus into ls_previus
with table key vkorg = ls_last-vkorg
vtweg = ls_last-vtweg
spart = ls_last-spart
kunnr = ls_last-kunnr
matnr = ls_last-matnr.
lv_subrc = sy-subrc.
lv_xndx_previus = sy-tabix.
ls_diff = ls_last.
case lv_subrc.
when 0. "Kayıt bulundu, Update veya None
if ls_previus = ls_last.
ls_diff-procc = c_proc_none.
else.
ls_diff-procc = c_proc_update.
endif.
delete lt_previus index lv_xndx_previus."burası çokomelli when others."Kayıt Bulunamadı Insert
ls_diff-procc = c_proc_insert.
endcase.
insert ls_diff into table cht_diff.
endloop.
loop at lt_previus into ls_previus."Elemeden kalanlar silinmiş demektir
lv_xndx_previus = sy-tabix.
ls_diff = ls_previus.
ls_diff-procc = c_proc_delete.
insert ls_diff into table cht_diff.
endloop.
*c_proc_insert
*c_proc_update
*c_proc_delete
*c_proc_none
endform. "f_get_diff