Ana içeriğe geç

Kayıtlar arası fonksiyonları kullanma: Peek, Previous ve Exists

Bu fonksiyonlar, geçerli kaydın değerlendirilmesi için verilerin daha önceden yüklenmiş kayıtlarından bir değere ihtiyaç duyulduğunda kullanılır.

Dersin bu bölümünde, Peek(), Previous() ve Exists() fonksiyonlarını inceleyeceğiz.

Peek()

Peek(), bir tablodaki bir alanın zaten yüklenmiş bir satırının değerini döndürür. Satır numarası belirtilebilir (tabloda olduğu gibi). Satır numarası belirtilmezse, daha önce yüklenmiş son kayıt kullanılır.

Söz Dizimi:  

Peek(fieldname [ , row [ , tablename ] ] )

Satır, bir tamsayı olmalıdır. 0 ilk kaydı ve 1 ikinci kaydı gösterir ve bu böyle devam eder. Negatif sayılar tablonun sonundan itibaren sırayı belirtir. -1 değeri, okunan son kaydı gösterir.

Herhangi bir satır belirtilmemişse, -1 kabul edilir.

Tablename sonunda iki nokta üst üste olmayan tablo etiketidir. tablename belirtilmezse geçerli tablo olduğu varsayılır. LOAD deyimi dışında kullanılırsa veya başka bir tabloya referansta bulunursa tablename dahil edilmelidir.

Previous()

Previous(), where cümlesi nedeniyle atılmamış önceki bir giriş kaydındaki verileri kullanarak expr ifadesinin değerini bulur. Bir iç tablonun ilk kaydında, bu fonksiyon NULL sonucunu döndürür.

Söz Dizimi:  

Previous(expression)

Previous() fonksiyonu daha gerideki kayıtlara erişmek için iç içe geçirilebilir. Veriler, ilişkilendirilmiş veritabanında saklanmasa bile doğrudan giriş kaynağından alınır ve böylece Qlik Sense uygulamasına yüklenmemiş alanlara bile referansta bulunmayı mümkün kılar.

Exists()

Exists(), veri kod dosyasında alana daha önce belirli bir alan değerinin yüklenip yüklenmediğini belirler. Fonksiyon TRUE ya da FALSE sonucunu döndürdüğünden, bir LOAD deyiminin veya bir IF deyiminin where cümlesinde kullanılabilir.

Söz Dizimi:  

Exists(field [, expression ] )

Alan, kod tarafından yüklenen verilerde bulunmalıdır. Expression, belirtilen alanda aranacak alan değeri olarak değerlendiren bir ifadedir. Bu atlandığı takdirde, geçerli kaydın belirtilen alandaki değeri alınır.

Peek() ve Previous() kullanma

En basit biçimleriyle, Peek() ve Previous() bir tablo içindeki belirli değerleri tanımlamak için kullanılır. Bu alıştırmada yükleyeceğiniz Employees tablosundaki örnek verileri aşağıda bulabilirsiniz.

Employees tablosundaki örnek veriler
Tarih İşe Alma İşten Çıkarma
1/1/2011 6 0
2/1/2011 4 2
3/1/2011 6 1
4/1/2011 5 2

Şu anda bu, yalnızca ay, işe alma ve işten çıkarmalara yönelik verileri toplar, bu nedenle toplam çalışanlardaki aylık farkı görmek amacıyla Peek() ve Previous() fonksiyonlarını kullanarak Employee Count ve Employee Var için alanları ekleyeceğiz.

  1. Gelişmiş Kodlama Eğitimi uygulamasını açın.
  2. Veri yükleme düzenleyicisi'ne yeni bir kod bölümü ekleyin.
  3. Employees bölümünü çağırın.
  4. Sağ menüdeki DataFiles altında Veri seç'e tıklayın.

  5. Karşıya yükleyin ve ardından Employees.xlsx öğesini seçin.
  6. Bilgi notuField names altında, veri yüklerken tablo alanlarının adlarını dahil etmek için Embedded field names öğesinin seçildiğinden emin olun.
  7. Veri seçme kaynağı: penceresinde Kod yerleştir'e tıklayın.
  8. Kodunuz şöyle görünmelidir:

    LOAD "Date", Hired, Terminated FROM [lib://DataFiles/Employees.xlsx] (ooxml, embedded labels, table is Sheet1);

  9. Kodu şöyle görünecek şekilde değiştirin:

    [Employees Init]: LOAD     rowno() as Row,     Date(Date) as Date,     Hired,     Terminated,     If(rowno()=1, Hired-Terminated,  peek([Employee Count], -1)+(Hired-Terminated)) as [Employee Count] FROM [lib://DataFiles/Employees.xlsx]		 (ooxml, embedded labels, table is Sheet1);

  10. Excel sayfasının Date alanındaki tarihler AA/GG/YYYY biçimindedir. Tarihlerin sistem değişkenleri biçimi kullanılarak doğru şekilde yorumlanması için Date alanına Date işlevi uygulanmıştır.

    Peek() fonksiyonu, belirli bir alan için yüklenmiş herhangi bir değeri tanımlamanızı sağlar. İfadede ilk olarak rowno() öğesinin 1 değerine eşit olup olmadığına bakarız. 1'e eşitse Employee Count mevcut olmayacaktır, bu nedenle alanı Hired eksi Terminated ile doldururuz.

    rowno() 1'den büyükse önceki ayın Employee Count değerine bakar ve o ayın Hired değeri eksi Terminated çalışanlar sonucuna ilgili sayıyı ekleriz.

    Peek() fonksiyonunda da (-1) kullandığımıza dikkat edin. Bu, Qlik Sense uygulamasına geçerli kaydın üzerindeki kayda bakmasını söyler. (-1) belirtilmezse, Qlik Sense önceki kayda bakmak istediğinizi varsayar.

  11. Kodunuzun sonuna şunu ekleyin:
  12. [Employee Count]: LOAD 	Row, 	Date, 	Hired, 	Terminated, 	[Employee Count], 	If(rowno()=1,0,[Employee Count]-Previous([Employee Count])) as [Employee Var] Resident [Employees Init] Order By Row asc; Drop Table [Employees Init];

    Previous() fonksiyonu, belirli bir alan için yüklenmiş son değeri tanımlamanızı sağlar. Bu ifadede ilk olarak rowno() öğesinin 1 değerine eşit olup olmadığına bakarız. 1'e eşitse önceki ayın Employee Count değeri için hiçbir kayıt olmadığından Employee Var olmayacağını biliriz. Bu nedenle, bu değer için 0 gireriz.

    rowno() 1'den büyükse, Employee Var olacağını biliriz, bu nedenle geçen ayın Employee Count değerine bakar ve Employee Var alanında değeri oluşturmak için bu sayıyı o ayın Employee Count değerinden çıkarırız.

    Kodunuz şöyle görünmelidir:

    [Employees Init]: LOAD     rowno() as Row,     Date(Date) as Date,     Hired,     Terminated,     If(rowno()=1, Hired-Terminated,  peek([Employee Count], -1)+(Hired-Terminated)) as [Employee Count] FROM [lib://DataFiles/Employees.xlsx] (ooxml, embedded labels, table is Sheet1);  [Employee Count]: LOAD     Row,     Date,     Hired,     Terminated,     [Employee Count],     If(rowno()=1,0,[Employee Count]-Previous([Employee Count])) as [Employee Var] Resident [Employees Init] Order By Row asc;	 Drop Table [Employees Init];

  13. Verileri yükle'ye tıklayın.
  14. Uygulamaya genel bakışta yeni bir sayfada, tablonun sütunları olarak Date, Hired, Terminated, Employee Count ve Employee Var kullanarak yeni bir tablo oluşturun. Sonuçta elde edilen tablo şöyle görünmelidir:

    Kodda Peek ve Previous kullanımı sonrasındaki tablo

    Kodda Peek ve Previous kullanımını izleyen tablo.

Peek() ve Previous(), bir tablo içindeki tanımlı satırları hedeflemenizi sağlar. İki fonksiyon arasındaki en büyük fark, Peek() fonksiyonunun kullanıcının daha önce koda yüklenmemiş bir alana bakmasını sağlar, Previous() fonksiyonu ise yalnızca daha önce yüklenen bir alana bakabilir. Previous(), LOAD deyiminin girdisi üzerinden, Peek() ise LOAD deyiminin çıktısı üzerinden işler. (RecNo() ile RowNo() arasındaki farkla aynıdır.) Bu, Where cümleniz varsa iki fonksiyonun farklı şekilde hareket edeceği anlamına gelir.

Bu nedenle Previous() fonksiyonu, kullanıcının önceki değerle geçerli değerin karşılaştırmasını görmesi gerektiğinde daha uygun olur. Örnekte, aydan aya çalışan farkını hesapladık.

Peek() fonksiyonu, tabloya daha önce yüklenmemiş bir alanı hedeflediğinizde veya belirli bir satırı hedeflemeniz gerektiğinde daha uygun olur. Bu, önceki ayın Employee Count değerine bakarak ve o ay işe alınan ve işten çıkarılan çalışanlar arasındaki farkı ekleyerek Employee Count değerini hesapladığımız örnekte gösterilmiştir. Employee Count alanının orijinal dosyadaki bir alan olmadığını unutmayın

Bilgi notuPeek() ve Previous() öğelerinin ne zaman kullanılacağı hakkında daha fazla bilgi almak için Qlik Community bölümündeki blog gönderisine göz atın: Peek() vs Previous() – When to Use Each. Davranışlar QlikView bağlamında açıklanmıştır. Fakat kullanılan mantık, Qlik Sense için de geçerlidir.

Exists() kullanma

Exists() fonksiyonu, çoğu zaman veri modeline zaten ilgili veriler yüklenmişse koddaki Where cümlesiyle birlikte kullanılır.

Aşağıdaki örnekte, dizelere sayısal değerleri atamak için Dual() fonksiyonunu da kullanırız.

  1. Yeni bir uygulama oluşturun ve ona bir ad verin.
  2. Veri yükleme düzenleyicisi'ne yeni bir kod bölümü ekleyin.
  3. People bölümünü çağırın.
  4. Aşağıdaki kodu girin:
  5. //Add dummy people data PeopleTemp: LOAD * INLINE [ PersonID, Person 1, Jane 2, Joe 3, Shawn 4, Sue 5, Frank 6, Mike 7, Gloria 8, Mary 9, Steven, 10, Bill ];   //Add dummy age data AgeTemp: LOAD * INLINE [ PersonID, Age 1, 23 2, 45 3, 43 4, 30 5, 40 6, 32 7, 45 8, 54 9, 10, 61 11, 21 12, 39 ];   //LOAD new table with people People: NoConcatenate LOAD     PersonID,     Person Resident PeopleTemp;   Drop Table PeopleTemp;   //Add age and age bucket fields to the People table Left Join (People) LOAD     PersonID,     Age, 	If(IsNull(Age) or Age='', Dual('No age', 5), 	 If(Age<25, Dual('Under 25', 1), 	  If(Age>=25 and Age <35, Dual('25-34', 2), 	   If(Age>=35 and Age<50, Dual('35-49' , 3), 	    If(Age>=50, Dual('50 or over', 4) 	     ))))) as AgeBucket Resident AgeTemp Where Exists(PersonID);   DROP Table AgeTemp;

  6. Verileri yükle'ye tıklayın.
  7. Kodda, Age ve AgeBucket alanları yalnızca PersonID veri modeline zaten yüklenmişse yüklenir.

    AgeTemp tablosunda PersonID 11 ve 12 için listelenen yaşlar olduğuna, ancak bu kimlikler veri modelinde (People tablosunda) yüklenmediği için Where Exists(PersonID) cümlesi tarafından hariç tutulduklarına dikkat edin. Bu cümle, şu şekilde de yazılabilir: Where Exists(PersonID, PersonID).

    Kodun çıktısı şu şekilde görünmelidir:

    Kodda Exists kullanımı sonrasındaki tablo

    Kodda Exists kullanımını izleyen tablo.

    AgeTemp tablosundaki PersonID'lerin hiçbiri veri modeline yüklenmezse, Age ve AgeBucket alanları People tablosuyla birleştirilmez. Exists() fonksiyonunun kullanılması, veri modelinde artık kayıtların/verilerin, yani herhangi bir kişiyle ilişkilendirilmemiş Age ve AgeBucket alanlarının olmasını önler.

  8. Yeni bir sayfa oluşturun ve sayfaya bir ad verin.
  9. Yeni sayfayı açın ve Sayfayı düzenle'ye tıklayın.
  10. Sayfaya AgeBucket boyutuna sahip bir standart tablo ekleyin ve görselleştirmeye Yaş Grupları adını verin.
  11. AgeBucket boyutu ve Count([AgeBucket]) hesaplamasıyla sayfaya sütun grafik ekleyin. Görselleştirmeye Number of people in each age group adını verin.
  12. Tablonun ve sütun grafiğin özelliklerini isteğinize göre düzenleyin ve ardından Bitti seçeneğine tıklayın.

    Sayfanız şöyle görünür:

    Yaşa göre gruplandırmaya sahip sayfa

    Yaşa göre gruplandırmaya sahip sayfa.

Dual() fonksiyonu, dizeye sayısal bir değer atamak gerektiğinde kodda veya grafik ifadesinde faydalı olur.

Yukarıdaki kodda yaşları yükleyen bir uygulamanız vardır ve gerçek yaşlara karşılık yaş demetlerini temel alan görselleştirmeler oluşturmak için bu yaşları demetlere ayırmaya karar verirsiniz. 25 yaşında altındaki kişiler, 25 ve 35 yaş arası kişiler, vb. yaş grupları için bir demet olur. Dual() fonksiyonu kullanılarak, yaş demetlerine daha sonra liste kutusunda veya grafikte yaş demetlerini sıralamak için kullanılabilecek sayısal bir değer atanabilir. Bu nedenle, uygulama sayfasında olduğu gibi sıralama "Yaş yok"u listenin sonuna alır.

Bilgi notuExists() ve Dual() hakkında daha fazla bilgi almak için Qlik Community bölümündeki blog gönderisine göz atın: Dual & Exists – Useful Functions (Dual & Exists – Faydalı Fonksiyonlar)