Ana içeriğe geç
Kayıtlar arası fonksiyonları kullanma: Peek, Previous ve Exists

BU SAYFADA

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(), zaten yüklenmiş veya dahili bellekte var olan bir satır için bir tabloda bir alanın değerini bulur. Satır numarası belirtilebilir (tabloda olduğu gibi).

Syntax:  

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.

Syntax:  

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.

Syntax:  

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.

Aşağıdakileri yapın:

  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 Sheet2);

  1. 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 Sheet2);

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

  1. Kodunuzun sonuna şunu ekleyin:
  2. [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 Sheet2);
    
    [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];

  1. Verileri yükle'ye tıklayın.
  2. 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
    Table following use of Peek and Previous in script.

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.

Aşağıdakileri yapın:

  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;

  1. Verileri yükle'ye tıklayın.
  2. 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
    Table following use of Exists in script.

    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.

  3. Yeni bir sayfa oluşturun ve sayfaya bir ad verin.
  4. Yeni sayfayı açın ve Düzenle'ye tıklayın.
  5. Sayfaya AgeBucket boyutuna sahip bir standart tablo ekleyin ve görselleştirmeye Yaş Grupları adını verin.
  6. 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.
  7. 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
    Sheet with groupings by age.

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)