Merhaba bu yazımda Loop kavramını ele alacağız.

Loop bir tablo üzerinde döngü oluşturup tüm verileri üzerinde dönmemizi sağlayan sistemdir.

LOOP AT [TABLO_İSMİ]

BEGIN

KODLAR;

ENDLOOP;

Burada üzerinden dönülecek tablo ismi ya da TMP tablo ismi ya da projede bulunan Grid ismi verilmelidir.

Grid ismi de aslında bir anlamda bir TMP tablodur.

TMP TABLO Nedir?

Projemiz üzerinde kod ile oluşturduğumuz tablolara TMP tabloları denir. Üzerinde işlemler yapılabilir.

OBJECT :

TABLE TMPPERSONEL,
TABLE EDUTEST;

Gördüğümüz gibi TMP tabloları tanımlanabilir.

Loop konumuza geri dönelim şimdi.

Tablo ismi verildikten sonra döngünün başladığını belirten ifade BEGIN kullanılır.

Daha sonra geriye yapılması gereken tüm işlerin kodları yazılır.

Burada döngü her döndüğünde ilgili satırdaki verileri seçer onlar üzerinde işlem yapar.

Her döngü ENDLOOP; ifadesi ile bitmelidir.

Bir önceki projemizden bir örnekle devam edelim.

Personel Yönetim Sistemi projemizde DELETE metodu içinde LOOP kullanmamız gerekecekti. Delete konusunu tekrardan ele alacağız. Şimdilik Loop konusuna odaklanalım.

LOOP AT PERSONELBILGISI 
BEGIN

	IF PERSONELBILGISI_SELECTED == 1 THEN
		BEGINTRAN;
		DELETE 
			FROM PERSONELBILGISI 
			WHERE PERSONELNO = PERSONELBILGISI_PERSONELNO 
				AND PHONENUMBER = PERSONELBILGISI_PHONENUMBER 
				AND MAIL = PERSONELBILGISI_MAIL;

		IF SYS_STATUS == 1 THEN
			ROLLBACKTRAN;
			MSG='Silme İşlemi Gerçekleştirilemedi';
			MESSAGE EDU I302 WITH MSG;
			RETURN;
		ENDIF;

		COMMITTRAN;
	ENDIF;

ENDLOOP;

LOOP AT diye başladık. Daha sonra Grid’in ismini verdik. Bu tablo üzerinde döneceksin bilgisi.

Daha sonra BEGIN ile başladı döngü.

Seçili satırları silme işlemi yapacağımızdan bir IF şartı ile gelen satırın seçili olup olmadığına baktık.

Burada bir durumdan bahsetmeliyim. Bir Grid üzerinde seçili bir satırın Action Flag değeri seçili durumu 1 olarak ayarlanır. Seçili olmayan tüm değelerin SELECTED Action Flag değeri 0 olarak set edilmiştir.

Seçili satırları sildik.

En sonunda tüm işlemleri gerçekleştirip ENDLOOP ile bitiriyoruz.

Sorgulama Anı

Şimdi şunu sorgulayalım. Loop bir tablo üzerinde dönüyor var olan tüm verileri üzerinde işlem yapıyor. GRİD üzerinde 50 000 kayıt olsa. Sadece tek satır veriyi seçip silmek istesek. Bu öğrendiğimiz yapıda 50 000 kayıt üzerinde dönecek ve sadece seçili olan tek satırı silecekti. Bu işlem inanılmaz bir performans kaybına neden olacaktır. çünkü 500 00 kaydı 500 000 yaparsak performans değerlerimiz daha da düşecektir.

Peki napacağız bunun bir çözümü yok mu?

Bunu çözmüşler. Loop yapısının 4 farklı kullanım şekli vardır.

  1. Yöntem ilk anlattığımız yöntemdi.

2. WHERE [Logical_Expression] Yapısı

LOOP AT [TABLE_NAME]  WHERE [Logical_Expression] 

BEGIN 

KODLAR;

ENDLOOP;

Buna hemen bir örnek oluşturalım. Az önceki tablomuzda sadece Personel No’su 10002, adı Ferhat olanlar üzerinde dönsün. Ve o kişi seçiliyse de silsin.

LOOP AT PERSONELBILGISI WHERE PERSONELBILGISI_PERSONELNO == 10002 && PERSONELBILGISI_PERSONELNAME == 'Ferhat'
BEGIN

	IF PERSONELBILGISI_SELECTED == 1 THEN
		BEGINTRAN;
		DELETE 
			FROM PERSONELBILGISI 
			WHERE PERSONELNO = PERSONELBILGISI_PERSONELNO 
				AND PHONENUMBER = PERSONELBILGISI_PHONENUMBER 
				AND MAIL = PERSONELBILGISI_MAIL;


		IF SYS_STATUS == 1 THEN
			ROLLBACKTRAN;
			MSG='Silme İşlemi Gerçekleştirilemedi';
			MESSAGE EDU I302 WITH MSG;
			RETURN;
		ENDIF;

		COMMITTRAN;
	ENDIF;

ENDLOOP;

Şöyle bir şey de olabilirdi. Seçili satırları herhangi bir kritere tabi tutmadan silinecek deseydik onun için şöyle bir şart yazabilirdik.

LOOP AT PERSONELBILGISI WHERE PERSONELBILGISI_SELECTED
BEGIN

	/* IF PERSONELBILGISI_SELECTED == 1 THEN */
	
		BEGINTRAN;
		DELETE 
			FROM PERSONELBILGISI 
			WHERE PERSONELNO = PERSONELBILGISI_PERSONELNO 
				AND PHONENUMBER = PERSONELBILGISI_PHONENUMBER 
				AND MAIL = PERSONELBILGISI_MAIL;


		IF SYS_STATUS == 1 THEN
			ROLLBACKTRAN;
			MSG='Silme İşlemi Gerçekleştirilemedi';
			MESSAGE EDU I302 WITH MSG;
			RETURN;
		ENDIF;

		COMMITTRAN;
		
	/* ENDIF;*/

ENDLOOP;

Yukarıdaki sistemde sadece seçili olan veriler üzerinde dönecektir. Artık aşağıda silme işleminden önce bir kere daha seçili satırları kontrol etmeye gerek yoktur o yüzden onları açıklama satırı haline getirdik.

3.   CRITERIA COLUMNS & VALUES

Şu anda anlatacağımız yapı şimdiye kadar anlattığımız 2 yapıdan çok daha performanslı bir yapı. Hem de %2500 daha performanslı.

LOOP AT tablename CRITERIA COLUMNS column1, column2, ... VALUES valuesymbol1, valuesymbol2, ... 
BEGIN 

KODLAR; 

ENDLOOP;
LOOP AT PERSONELBILGISI CRITERIA COLUMNS PERSONELNO,PERSONELNAME VALUES 10002,'Ferhat'
BEGIN

	 IF PERSONELBILGISI_SELECTED == 1 THEN 
	
		BEGINTRAN;
		DELETE 
			FROM PERSONELBILGISI 
			WHERE PERSONELNO = PERSONELBILGISI_PERSONELNO 
				AND PHONENUMBER = PERSONELBILGISI_PHONENUMBER 
				AND MAIL = PERSONELBILGISI_MAIL;


		IF SYS_STATUS == 1 THEN
			ROLLBACKTRAN;
			MSG='Silme İşlemi Gerçekleştirilemedi';
			MESSAGE EDU I302 WITH MSG;
			RETURN;
		ENDIF;

		COMMITTRAN;
		
	ENDIF;

ENDLOOP;

Not: Kolon ismi yazılırken tablo ismi ile beraber yazılmamalıdır. PERSONELBILGISI_PERSONELNO  bu kullanım hatalıdır.

Şimdi sizlere çok çok büyük bir performans canavarından bahsedeceğim.

BUILDHASHINDEX INDEXNAME COLUMNS USERNAME,CREATEDBY ON TMPTABLE;

LOOP AT [TABLOİSMİ] CRITERIA INDEXED INDEX indexsymbolname VALUES valuesymbol1, valuesymbol2,...

BUILDHASHINDEX ile tabloya ait INDEXLER dinamik olarak oluşturulur. O yüzden tablo üzerinde  yapılan değişikliklerin tekrar tanınabilmesi için bu şekilde dinamik olarak oluşturulmalıdır.

BUILDHASHINDEX INDEXNAME COLUMNS PERSONELNO,PHONENUMBER,MAIL ON PERSONELBILGISI;

LOOP AT PERSONELBILGISI CRITERIA INDEXED INDEX INDEXNAME VALUES 10002,'0 554 111 11 12', 'fbilginer@industryolog.com'
BEGIN

	 IF PERSONELBILGISI_SELECTED == 1 THEN 
	
		BEGINTRAN;
		DELETE 
			FROM PERSONELBILGISI 
			WHERE PERSONELNO = PERSONELBILGISI_PERSONELNO 
				AND PHONENUMBER = PERSONELBILGISI_PHONENUMBER 
				AND MAIL = PERSONELBILGISI_MAIL;


		IF SYS_STATUS == 1 THEN
			ROLLBACKTRAN;
			MSG='Silme İşlemi Gerçekleştirilemedi';
			MESSAGE EDU I302 WITH MSG;
			RETURN;
		ENDIF;

		COMMITTRAN;
		
	ENDIF;

ENDLOOP;

Bu yapı diğer tüm yapılardan %35 000 kat daha performanslıdır.

Loop kavramı bu şekildeydi.

Bir sonraki yazımda görüşmek üzere.


Murat Bilginer
21 Şubat 1992'de doğdum. Endüstri Mühendisi olarak lisansımı 2016 yılında tamamladım. Industryolog Akademi - NGenius oluşumlarının kurucusuyum. Şu anda kendi şirketim Brainy Tech ile Web ve Mobil Geliştirme, AWS, Google Cloud Platform Sistemleri için DevOps, Big Data Analiz ve Görselleştirme hizmetleri sunmakta ve Online Eğitimler vermekteyiz.