SAP Abap Parallel Cursor

sap

Merhaba bu yazımızda SAP Abap parallel cursor yapısını inceleyeceğiz. Yazımıza başlamadan önce bir hatırlatma olarak daha önceki SAP yazılarımıza buradan ulaşabilirsiniz.

Giriş

Gelelim konumuza. Abap ta sıklıkla başlık ve kalem verilerini döngülerde iç içe kullanmaktayız. Normalde geliştiriciler sıklıkla döngü içerisinde döngü(loop içinde loop) kullanmaktadır. Programda az veriyle işlem yapılacaksa bu durum çok fazla sorun teşkil etmez. Ama milyonları bulan verilerle işlemler yapıyorsun bu kodlama, programımız için zaman açısından çok kötü sonuçlar doğurur. Bugün genel olarak yazdığımız döngü kullanımı yerine parallel cursor mantığında kodumuzda bazı yerlere ufak eklemeler yaparak ne kadar performans artışı yakalayabileceğimizi görelim.

Parallel Cursor Mantığı

Peki nedir bunun mantığı diye sorduğunuzu duyar gibiyim. İlk olarak başlık ve kalem verilerimizi küçükten büyüğe sıralıyoruz(Sort). Yine başlık verilerimizi yine normal döngü ile tek tek dönmekteyiz. Daha sonra başlık verisindeki key alanlar ile kalem verisine gidiyoruz(Read). Burada binary search ve transporting no fields kullanalım hızımız daha da artsın. Buradan dönen sy-tabix değerini alıyoruz.

Verimiz sıralı olduğu için kalem verilerinde bu indis değeri ve sonraki değerler o anki başlık verilerimize aittir. Daha sonra döngü ile kalem verilerimizi dönüyoruz. Ama burada from kullanarak Read ile bulduğumuz indis değerini yazıyoruz. Gereksiz yere önceki başlık verilerinin kalem verilerini dönmek zorunda kalmıyoruz. Son olarak döngü içerisinde if ile başlık verisindeki key alanlar ile kalem verisindeki key alanları karşılaştırıyoruz. Herhangi bir uyuşmazlık olduğu zaman döngüden çıkıyoruz.

Örnek Program

Örnek programımızın sonuçları ve kodları aşağıdaki gibidir. Programımız 10000 başlık verisi ile test edilmiştir.

parallel cursor

REPORT zmop_deneme.

DATA: it_ekko TYPE TABLE OF ekko,
      it_ekpo TYPE TABLE OF ekpo.

DATA: lv_baslangic TYPE timestampl,
      lv_bitis     TYPE timestampl,
      lv_fark      TYPE timestampl.
DATA: lv_tabix TYPE i.

FIELD-SYMBOLS:  LIKE LINE OF it_ekko,
                LIKE LINE OF it_ekpo.

SELECT * FROM ekko
  INTO TABLE it_ekko
  UP TO 10000 ROWS.

SELECT * FROM ekpo
  INTO TABLE it_ekpo
  FOR ALL ENTRIES IN it_ekko
  WHERE ebeln = it_ekko-ebeln.

GET TIME STAMP FIELD lv_baslangic.

LOOP AT it_ekko ASSIGNING .
  LOOP AT it_ekpo ASSIGNING 
                  WHERE ebeln = -ebeln.
  ENDLOOP.
ENDLOOP.

GET TIME STAMP FIELD lv_bitis.

lv_fark = lv_bitis - lv_baslangic.
WRITE: /(50) 'Loop ile geçen süre:', lv_fark.

CLEAR: lv_baslangic, lv_bitis, lv_fark.
GET TIME STAMP FIELD lv_baslangic.

SORT: it_ekko BY ebeln,
      it_ekpo BY ebeln.
LOOP AT it_ekko ASSIGNING .
  READ TABLE it_ekpo TRANSPORTING NO FIELDS
                     WITH KEY ebeln = -ebeln
                     BINARY SEARCH.
  lv_tabix = sy-tabix.
  LOOP AT it_ekpo FROM lv_tabix ASSIGNING  .
    IF -ebeln <> -ebeln.
      EXIT.
    ENDIF.
  ENDLOOP.
ENDLOOP.

GET TIME STAMP FIELD lv_bitis.

lv_fark = lv_bitis - lv_baslangic.
WRITE: /(50) 'Parallel Cursor ile geçen süre:', lv_fark.

E-bültene Abone Ol Merak etmeyin. Spam yapmayacağız.

Yazar

Merhaba, Kocaeli Üniversitesi Bilişim Sistemleri Mühendisliği Bölümü'nden 2019 yılında mezun oldum. Daha sonra Sap sektöründe çalışma hayatına başladım. Burada elimden geldiğince tecrübelerimi sizinle paylaşacağım.

İlgili Yazılar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Hızlı yorum için giriş yapın.

Başka Yazı Yok

Kayıt Ol

Zaten üye misiniz? Giriş Yap

Giriş Yap

Henüz üyeliğiniz yok mu? Kayıt Ol