İ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:


typesbegin 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.

 
typestty_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.
  datalt_previus type tty_cache.
  datalt_last type tty_cache.

  datals_last     type ty_cache,
        ls_previus  type ty_cache ,
        ls_diff  type ty_cache ,
        lv_subrc    type sy-subrc.

  datalv_xndx_last type int4.
  datalv_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