SAP ABAP For All Entries Nasıl KullanılırOkuma süresi 4 dakika

Merhabalar,

Bu yazımızda SAP ABAP modülünde kullanılan For All Entries kuralının nasıl kullanılacağını veya kullanılması gerektiğini anlatacağım.

Öncelikle SAP ABAP modülünde, For All Entries nedir, neden kullanılır bunu anlatayım.

For All Entries, JOIN yapamıyacağımız tablolar için kullanılır. Örneğin BSEG(FI Belge Kalemi Tablosu) bir cluster tablo yapısına sahip olduğundan dolayı bu tabloya JOIN işlemi gerçekleştirilemez. Bundan dolayı bu tablo ile ilgili bir işlem yapılacağında bu tabloya For All Entries kuralı ile bağlanılır.

For All Entries, kuralı uygulanırken, okunacak verilerden bir anahtar tablo oluşturulur. Daha sonra bu anahtar tablodaki tüm kayıtlar için SELECT komutu tek adımda çalıştırılır.

For All Entries kullanımında dikkat edilmesi gereken nokta ise, eğer anahtar tablonuz boş ise tüm kayıtlar okunur. Bu nedenle For All Entries yazmadan önce mutlaka anahtar tablonun boş olup olmadığını kontrol etmemiz gerekir.

Şimdi örnek bir uygulama yaparak, ilgili For All Entries kuralını nasıl uygulayacağımızı gösterelim.

Örneğimizde; Satınalma siparişine istinaden yaratılmış olan mal girişleri ve faturaları okuyacak bir sorgu oluşturalım.

Kullanacağımız tablolar aşağıdakilerdir;

  • EKBE : Satınalma Belge Akışı tablosu
  • MKPF : Malzeme Belgesi Başlık Tablosu
  • MSEG : Malzeme Belgesi Kalem Tablosu
  • RBKP : MM Fatura Belgeleri Başlık Tablosu
  • RSEG : MM Fatura Belgeleri Kalem Tablosu

EKBE tablosunda yer alan bir kaydın mal giriş belgesi mi yoksa fatura giriş belgesi mi olduğunu VGABE(İşlem Türü) alanında yer alan değere göre anlaşılır. EKBE-VGABE alanında 1 değeri var ise bu kayıt bir mal girişi kaydıdır. EKBE-VGABE alanında 2 değeri var ise bu kayıt bir fatura girişi kaydıdır. 

Mal Girişi (EKBE-VGABE = 1) ise detaylar MKPF ve MSEG tablolarından okunur.

Fatura Girişi (EKBE-VGABE = 2) ise detaylar RBKP ve RSEG tablolarından okunur.

Yukarıda detaylarını verdiğim gibi aslında gideceğimiz tabloları EKBE-VGABE alan değerine göre farklılık göstermektedir. Bu gibi durumlarda önce EKBE tablosu okunur ve internal bir tabloya dataları alınır. Daha sonra bu tablo döngüye sokularak her satırdaki VGABE alanının değerine göre iki farklı SELECT yazılır. Bu durumda her satır için database bağlantısı yapıp veri okumaya çalıştığımızdan dolayı işlem çok üzün sürebilir ve performans sorunu çıkarabilir.

Şimdi yukarıdaki durumun algoritmasını yazacak olur isek, kullanıcıdan  aldığımız tarih bilgisini (S_BUDAT) EKBE_BUDAT alanına eşitleyerek algoritmamızı oluşturalım.

SELECT * FROM EKBE INTO TABLE GT_EKBE
		WHERE BUDAT IN S_BUDAT.
LOOP AT GT_EKBE.
	IF GT_EKBE_VGABE EQ '1'. "Malzeme Belgesi"
		SELECT * FROM MSEG
	ELSEIF GT_EKBE_VGABE EQ '2'.
		SELECT * FROM RSEG
	ENDIF.
ENDLOOP.	

Şimdi ise FOR ALL ENTRIES kullanımını gösterelim. FOR ALL ENTRIES kullanımında satır sayısı olarak kod uzayacaktır ancak performans olarak veri sorgusu ve gösterimi çok hızlı olacaktır. Yukarıdaki SELECT içerisinde “n” defa veri tabanına erişim olabilirken aşağıdaki kodda en fazla 3 defa veritabanına erişim olabilir.

SELECT * FROM EKBE INTO TABLE GT_EKBE
		WHERE BUDAT IN S_BUDAT.

*For All Entries için kullanılacak tablo yapısı

DATA : BEGIN OF S_KEY,
	GJAHR	LIKE	EKBE-GJAHR,
	BELNR	LIKE	EKBE-BELNR,
	BUZEI	LIKE	RSEG-BUZEI,
       END OF S_KEY,
       GT_KEY1	LIKE TABLE OF S_KEY WITH HEAD LINE,
       GT_KEY2	LIKE TABLE OF S_KEY WITH HEAD LINE.

*Anahtar Tablolar Dolduruluyor
LOOP AT GT_EKBE.
	IF GT_EKBE_VGABE EQ '1'. "Mal Girişi"
		MOVE-CORRESPONDING GT_EKBE TO GT_KEY1.
		COLLECT GT_KEY1.
	ELSEIF GT_EKBE_VGABE EQ '2'. "Fatura Girişi"
		MOVE-CORRESPONDING GT_EKBE TO GT_KEY2.
		COLLECT GT_KEY2. 
	ENDIF.
ENDLOOP.

*Anahtar Tablo Boş mu diye kontrol ediyoruz.
IF GT_KEY1[] IS NOT INITIAL.

*Tüm Mal Girişleri tek bir seferde okunur
SELECT * INTO TABLE GT_MSEG FROM MSEG
	FOR ALL ENTRIES IN GT_KEY1
	WHERE GJAHR EQ GT_KEY1-GJAHR AND
	MBLNR EQ GT_KEY1-MBLNR AND 
	ZEILE EQ GT_KEY1-BUZEI(4).
ENDIF.


*Anahtar Tablo Boş mu diye kontrol ediyoruz.
IF GT_KEY2[] IS NOT INITIAL.

*Tüm Fatura Girişleri tek bir seferde okunur
SELECT * INTO TABLE GT_RSEG FROM RSEG
	FOR ALL ENTRIES IN GT_KEY2
	WHERE GJAHR EQ GT_KEY2-GJAHR AND
	BELNR EQ GT_KEY2-BELNR AND 
	BUZEI EQ GT_KEY2-BUZEI.
ENDIF.

Bu yazı sapuzman.com sitesine aittir. Kaynak gösterilmeden başka bir mecrada yayınlanamaz.

Bu Yazıyı Beğendiniz mi?
I agree to have my personal information transfered to MailChimp ( more information )
Sizde 3.000 kişinin üzerinde bulunan abonelerimiz arasına katılın. Abone olarak yeni eklenen içeriklerimizden anında haberdar olursunuz
E-Mail adresiniz sapuzman.com dışında 3 tekil veya tüzel kişilikler ile paylaşılmayacaktır
Umut Demirci hakkında 148 makale
1986 yılında Kocaeli'nin Darıca ilçesinde dünyaya geldim. Bahçeşehir Üniversitesi, Matematik ve Bilgisayar Bilimleri bölümünü başarılı bir şekilde tamamladım. Üniversite yıllarında çeşitli sosyal sorumluluk projeleri ve bilişim projeleri içerisinde görev aldım. Üniversiteyi tamamladıktan hemen sonra 2010 yılında başladığım ERP sektöründe, SAP PMO (Proje Yönetim Ofisi) Takım Lideri olarak çalışmaya devam etmekteyim. Daha detaylı bilgi için Hakkımda menüsünü kullanabilirsiniz.

Kimler Neler Demiş?

avatar
  Subscribe  
Bildir