ORKESTRA

ORKESTRA

  orkestra orkestra.com.tr
  Sohbet   İndirme Merkezi

Sözlük Nedir ve Nasıl Kullanılır?

Sözlük Kullanımı



Orkestrada kullanabileceğiniz sözlük, aynı geçek bir sözlük gibi çalışır. Tek fark gerçek bir sözlüğe kıyasla sadece 1 adet bilgiyi sağlamasıdır. Bir bilgiyi içerisinde barındırır ve istediğimiz anda bu bilgiyi önümüze getirir. 

Sözlük içerisinde Anahtar - değer ilişkisi vardır. Sözlüğe bir anahtar atıyoruz ve sonrasında istediğimiz değeri verebiliyoruz. integer, String, BigDecimal, Object farketmeksizin her türden bilgiyi değer olarak sözlüğe ekleyebiliriz fakat Anahtar herzaman String yani Metin olmalıdır. 

Ör.

Object sozluk = getDictioanry(0);

Kodu ile bir sözlüğü tanımlıyoruz. Tanımladığımız sözlük içinde hiç bir bilgi olmadan gelmektedir. Sözlüğün içerisinde bilgi koymak istiyorsak;

sozluk.put(arg0,arg1);

komutu kullanılır. Buradaki arg0 = String, arg1 = Object dir. Bu durumda kodu şöyle düşünmeliyiz;

sozluk.put(Anahtar,Deger);

Standart sözlük kullanımı dışında, eğer bir verinin değerini sorgulamıyorsak ve sadece anahtarının koyulup koyulmadığını sorguluyorsak putKey(arg0) komutunu kullanabiliriz. 

sozluk.putKey(Anahtar);

Ör. Oluşturduğumuz rapor içerisindeki bir olayın bir kereden fazla çalışmasını istemiyoruz diyelim. Herhangi bir metin olacak şekilde bir anahtar uyduruyoruz ve satırların referansı bizim anahtarımız olsun diye planlıyoruz. Sonra;

sozluk.put(anahtar,anahtar);

Yazıyoruz. Bu kodlamayı yaptığımızda, sözlüğümüze satır referanslarını eklemiş oluyoruz. 

Sonrasında;

sozluk.hasKey(arg0);

komutu ile anahtarı almış mı yoksa almamış mı diye sorguluyoruz. Eğer put(arg0,arg1) komutu yerine;

sozluk.putKey(anahtar);

Komutunu kullanırsak, sözlüğü hasKey(arg0); komutu ile tekrar kontrol etmemiz gerekmeyecekti. Çünkü putKey komutu sayesinde anahtarın kesinlikle ilgili sözlüğe koyulduğundan emin olup tekrar sözlüğe anahtar aldın mı diye sorma gereksinimi duymuyoruz. 

 Sözlük kullanımında dikkat edilmesi gereken en önemli nokta, sözlüğün içine her tipte (integer,String,Object,BigDecimal,vb.) değer atanabilmesine karşın, bilgiyi sözlükten geri isterken hangi tipte kullanmak istiyorsak o tipte çağırmamız gerekmektedir. Örneğin integer olarak bir değer atadığımız bilgiyi BigDecimal olarak çağırmayı istiyorsak, çağırırken getBigDecimal komutu ile çağırmalıyız. Aksi halde bilgi gelmeyecektir. Özet olarak Sözlüğe bilgi atarken ne tipte yaptığımızın önemi olmamasına karşına çağırırken bize hangi tip lazımsa o tipte çağırmamız gerekmektedir.

Ör.

Object sozluk = getDictionary(0);

Açıklaması: 0 numaralı sözlüğün adını sozluk yap ve kullanıma hazır hale getir. 

sozluk.put("sayı",100);

 Açıklaması: Sözlüğün içerisinde sayı metini ile tanımlanmış, integer değerinde 100 sayısını koy. 

sözlüğün içerisinde "sozluk" tanımı ile String olan "sayı" metinini anahtar(arg0) olarak tanımlamış olduk.Burada 100 olarak girilmiş değer bir integer’dır.  

sozluk.getBigDecimal("sayı");

yazarsak buradaki “sayı” anahtarı bize, karşılık olarak integerden BigDecimal cinsine döndürülmüş 100 büyük ondalık sayısını verecektir. ( rapor ön izleme yaptığımızda).

Bazen raporu çalıştırdığımızda kullandığımız sözlükleri sıfırlamamız gerekebilir. 

Örneğin raporda oluşturmuş olduğumuz bir gruptaki fatura sayısını bulacağız ve grubu aylara göre grupladık diyelim. Her ay içerisinde geçen bir sürü satır var. O satırlarda yer alan fatura sayısını alacağımızı düşünelim. Fatura numaralarını put(arg0,arg1) komutu ile sözlüğe gönderdik. Her grupta 12 adet fatura olduğunu varsayarsak, sözlüğü sıfırlamadığımız taktirde ocak ayı bitmesine ramen faturaları saymaya devam edecek ve şubat ayına 0. faturadan değil 12. faturadan saymaya başlayacaktır. 

Bu durumda Rapor Olayları bölümünden Grup başlamadan önce alanına girip;

getDictionary(0).clear;

 komutunu giriyoruz. ( buradaki sıfır sayısı yerine kullandığımız sözlüğün sayısı gelecektir)

Grup Başlamadan Önce alanında bu işlemi yapmadan önce sözlük anahtarı almış mı diye kontrol etmek sağlıklı olacaktır.  yazacağımız betiğin başına;

if(groupName =="x") ...

şeklinde bir kontrol betiği yazarak bulunduğumuz ve çalıştığımız grubu teyit etmek önceliklidir.

Not: Burada "x" ile belitilmiş olan yere oluşturduğumuz grup ismi gelmelidir. 

 

Bunlardan harici olarak;

buildPairString(arg0,arg1)

Komutu anahtar değerlere eşittir eşittir diyerek çalışır.

Her bir anahtarın karşısına eşittir işareti koyarak değerini koyar. Ör: adet = 20, koli = 5, palet =3 gibi değerleri anahtarın karşına koymaktadır.

buildKeyString(arg0,arg1)

Komutu sadece sözlükteki anahtarları verir. 

buildValueString(arg0,arg1)

Komutu sadece sözlükteki değerleri verir. 

Örneğin Fatura satırları nesnesinden başlattığımız bir raporumuz olsun.Faturaların ve Fatura Satırlarının referanslarını ayrı ayrı sözlüklere koymak istediğimizde;

String satir_anahtar = ""+$F{reference};
String fatura_anahtar = ""+$F{voucher.reference};
if(!getDictionary(0).hasKey(fatura_anahtar)){
getDictionary(0).putKey(fatura_anahtar);
}
if(!getDictionary(1).hasKey(satir_anahtar)){
getDictionary(1).putKey(satir_anahtar);
}

Şeklinde yazarız. 

Kodun açıklaması ise şu şekilde olacaktır. 

String satir_anahtar = ""+$F{reference};
String fatura_anahtar = ""+$F{voucher.reference};

Bölümünü yazdığımızda, "satir_anahtar" ve "fatura_anahtar" olarak iki adet anahtar tanımlıyoruz. "satir_anahtar"'ın değeri Satırın referansı yani $F{reference} iken, "fatura_anahtar"'ın değeri Fatura Referansı yani $F{voucher.reference} olarak getirilecektir. 

Sonrasında;

if(!getDictionary(0).hasKey(fatura_anahtar)){
getDictionary(0).putKey(fatura_anahtar); 
}

Kodu ile "Eğer sıfır numaralı sözlüğe, "fatura_anahtar" isimli anahtar değeri verilmediyse, sıfırıncı sözlüğü al ve içine "fatura_anahtar" isimli anahtarın değerini yerleştir." demiş oluyoruz. 

Not: Bir işlemin başına ünlem işareti geldiğinde, o olayın negatif algılanması gerektiğini hatırlayalım.

Sözlük referanslarımızı tanımladık. Devamında yapmak istediğimiz ise, bir fatura içindeki satırlardaki ürünlerin adetlerini satır bazında değilde hepsini tek bir satırda virgüllerle ayırarak göstermek. 

Örneğin 2 satırlı bir faturamız var. Birinci satırda 2 adet ürün ve ikinci satırında 5 adet ürün olsun. Bu adetleri (2 adet, 5 adet) şeklinde göstermek istiyoruz. 

String satir_anahtar = ""+$F{reference};
String fatura_anahtar = ""+$F{voucher.reference};
if(!getDictionary(0).hasKey(fatura_anahtar)){
getDictionary(0).putKey(fatura_anahtar);
// HeR FATURA ICIN 1 DEFA CALISACAK
//miktarlar
getDictionary(2).clear(); 
}
if(!getDictionary(1).hasKey(satir_anahtar)){
getDictionary(1).putKey(satir_anahtar);
// HeR SATIS ICIN 1 DEFA CALISACAK
String miktarStr = MathUtil.format($F{quantity},"#,##0.##")+" "+$F{unit.code};
getDictionary(2).put(satir_anahtar,miktarStr );
}

 Şimdi gelin yeni eklediğimiz 3 satırlık kodu inceleyelim. 

getDictionary(2).clear(); 

Öncelikle clear komutu ile sözlüğümüzün içindeki verileri temizliyoruz. Bunun sebebi ; Başlangıçta zaten sözlüğümüz boş bir halde geliyor fakat gruplu bir rapor içerisinde bu işlemi uygulayacağımız için ve senaryomuzdaki grup Fatura bazında bir grup olduğu için, her fatura satırlarındaki Miktar verilerini topladıktan sonra sözlüğü sıfırlayalım ki sonraki faturaya gittiğinde eski verileri üstüne ekleyerek devam etmesin. Bu ilk komutumuz ile sözlüğümüzü sıfırladıktan sonra içine satırlarda bulunan Miktar değerini ekleyeceğiz. 

String miktarStr = MathUtil.format($F{quantity},"#,##0.##")+" "+$F{unit.code};
getDictionary(2).put(satir_anahtar,miktarStr );

İlk satırda görüntülendiği gibi, yeni bir String ile yeni bir değer tanımladık. Yeni anahtarımızın ismi miktarStr (Satır Miktar kısaltması)  değeri olarak ise MathUtil Faydalı Yardımcı Fonksiyonu ile "miktar birim" şeklinde gösterim yapması için formatladık. ($F{quantity} = miktar $F{unit.code} = birim)

Sonrasında başlangıçta temizlemiş olduğumuz iki numaralı sözlüğümüzün içine "put" komutu ile (anahtar,değer) satir_anahtar anahtarı ve miktarStr değerini ekledik. 

Miktar ve birimleride kullanabileceğimiz hale getirdikten sonra şimdi sırada Fatura içerisinde bulunan satırlardaki ürünlerin aynı şekilde virgüllerle ayrılmış halde gösterilmesini isteyeceğiz. 

String satir_anahtar = ""+$F{reference};
String fatura_anahtar = ""+$F{voucher.reference};
if(!getDictionary(0).hasKey(fatura_anahtar)){
getDictionary(0).putKey(fatura_anahtar);
// HeR FATURA ICIN 1 DEFA CALISACAK
//miktarlar
getDictionary(2).clear();
//urun aciklamalari
getDictionary(3).clear();
}
if(!getDictionary(1).hasKey(satir_anahtar)){
getDictionary(1).putKey(satir_anahtar);
// HeR SATIS ICIN 1 DEFA CALISACAK
String miktarStr = MathUtil.format($F{quantity},"#,##0.##")+" "+$F{unit.code};
getDictionary(2).put(satir_anahtar,miktarStr );
getDictionary(3).put($F{itemStock.code},$F{itemStock.code}+" / "+$F{itemStock.description});
}

 Kodumuza şimdi 2 satır daha ekledik. 

Eklenen satırlarımızdan ilki yine az önceki gibi öncelikle kullanacağı sözlüğü temizleyen bir kod olan getDictionary(3).clear(); oluyor. Miktarlarda olan aynı sebeplerden ürün kodu ve açıklamalarının verilerini de sözlük içerisinde sıfırlamamız doğru veri almak için gerekli olacak. (Bu raporumuz gruplu bir rapor olduğu için sıfırlamamız gerekiyor. Eğer düz bie döküm raporu olsaydı sıfırlamak gerekmeyebilirdi.)

getDictionary(3).put($F{itemStock.code},$F{itemStock.code}+" / "+$F{itemStock.description});

kodu ile temizlemiş olduğumuz üç numaralı sözlüğümüze anahtar ve değer eklenmesini istiyoruz. Fakat miktarlardan farklı olarak burada anahtar kısmı için yeni bir değer tanımlamadık. Bunun sebebi, fatura satırlarında birden fazla satırda aynı ürün olabilir. Aynı isimde ürünler geldiğinde ayrı ayrı yazmasını istemiyoruz dolayısıyla sözlüğün bu veileri toplarken aynı ürünleri tek bir satırda göstermesini bu şekilde sağlıyoruz. Şimdi bu sözlük verilerimizi raporda kullanabiliriz. 

Şekil 51

[ Şekil 51 ]de görüldüğü gibi yeni bir kullanıcı değişkeni tanımlıyoruz ve Adını Miktar yapıyoruz. Miktarların verisini tuttuğumuz sözlüğümüz ikinci sözlüğümüzdü bu sebeple ikinci sözlükteki veriyi ekranda görüntülenen kod yardımıyla çağırıyoruz.

 

return getDictionary(2).buildValueString(", ",false);

Parantez içerisindeki alanın ilk bölümü verilerin nasıl bir ayıraç ile ayrılacağını belitirken ikinci bölüm sıralama yapıp yapmak istemediğimizi sormaktadır. Biz virgülle ayırmasını ve sonrasında bir karakter boşluk bırakmasını(", ") istedikten sonra yeni bir sıralama yapmasını istemediğimizden false(yanlış) yazıyoruz. 

Şekil 52

Değişken tanımları alanından yeni bir değişken tanımı daha açıyoruz ve bu sefer Ürünlerin kodlarını getireceğimiz değişkeni ayarlıyoruz. 

[ Şekil 52 ] de görüldüğü üzere aynı şekilde kodumuzu yazıyoruz fakat bu sefer üçüncü sözlüğün gelmesini istiyoruz çünkü yaptığımız ayarlamalarda ürün kodu ve açıklamalarını üçüncü sözlüğe eklemiştik. 

Şekil 53

Raporumuzu ön izleme yaptığımızda, [ Şekil 53 ] de görüldüğü üzere fatura üzerindeki veriler aynı satırda fakat yanlarında vilgülle ile ayrılmış halde geliyor.