8 Ocak 2017 Pazar

iReport - Jasper Report ikilisi ile Raporlama

   S.a. Arkadaşlar,
   Bu gün Jasper Raporlama ile Pdf rapor almaya bakacağız. Biz burada Jasper Repor nedir ? iReport designer nasıl indirilir kurulur onlardan bahsetmeyeceğiz. Ama bunun yapıldığı 2 site önerebilirim. Bunlar başlangıçtaki kısımlarda işinizi görecektir diye düşünüyorum. Hem de java ile bağlantısı da anlatılmış. Ben bir kaç püf noktaya değinip oradan hazırladığım rapor üzerinden devam edeceğim.
Bu sitelerden biri bu. Buradaki anlatımın videosu da var. Video'nun altına da  bir kaç yorum eklemiştim. Burada tekrar etmek gerekirse rapor'un başlangıç dili grovy onu java yapmak gerek. Tabi Java'yı kullanacaksanız. Burada problemler çıkabiliyor. 2.problem ise iDesinger ile ilgili. Java 7 kullanmanız gerekebilir. Ben zip halini indirip direkt idesinger içine eklemiştim. İsterseniz Java 7'yi direkt de kullanabilirsiniz. Bu 8'den vazgeçmek istemeyenler için bir öneriydi. Jasper Report'un 6.x.x sürmünü kullanmaya özen gösterin. 5.x.x ve öncesi sürümlerinde hatalar çıkabiliyor. Mesela ireport için bulunan equals vb diğer metotları kullanırken hatalar alabilirsiniz. Bunu da göz önünde bulundurmakta fayda var. Şuan için aklıma gelenler bunlar. Olursa eklemeler yaparım. Diğer site ise bu. Burada çok güzel resimli anlatım mevcut. Başlangıç için yeterince işinizi göreceğini düşünüyorum. Eğer hiç bir problemle karşılaşmadıysanız artık önümüze bakabiliriz.
     Şimdi artık raporlama kısmına geçebiliriz. Öncelikle şunu söylemekte fayda var. Ben bu raporun arka plandaki kodlarını java tabanlı başka bir platformda yazdığım için, java kodları mevcut değil. Siz query yerine kendi verilerinizi çekip onları kullanmanız gerekecektir. O yüzden burada dikkatli olmakta fayda var. Raporun önemli yerlerini anlatıp ekran görüntüleriyle zenginleştirmeye çalışacağız. Zaten raporun tamamını github üzerinden çekip kendiniz istediğiniz şekilde istifade edebileceksiniz. Burada ise bazı püf noktalara değineceğiz. Öncelikle aşağıdaki resmi incelememizde fayda var.
Resim-1

Styles- Tablomuzun veya diğer öğelerimizin şekilsel işlevleri bulunur.
Parameters- Burada parametrelerimizi tanımlayabiliriz. iReport içinde değer alabilirler.
Fields- Burada alanlarımızı belirtiyoruz. F${x}olarak tanımlanır. 
Variables- Değişkenlerimizi tanımladığımız kısımdır. V${x} ile tanımlanır.
Scriptes- Raporlarımızın olduğu kısımdır.
Dataset- Bizim asıl olarak üzerinde duracağımız yerdir. Tablo için verilerimizi burada saklıyoruz.
Title- Başlık kısmını oluşturur.
Page Header- Her sayfada raporun üst kısmında bulunacak olan kısımdır.
Detail- Her sayfada değişkenlik gösterecek olan kısımdır.
Footer- Her sayfada raporun alt kısmında bulunacak olan kısımdır.
Last Page Footer- Sadece son sayfada bulunacak olan alt kısımdır.
Summary- Özet kısmıdır.

     Şimdi ise tabloumuzun tasarım kısmını verip onu açıklayalım.
Resim-2


   Şirket Bilgileri diye başlayan kısım "header" kısmıdır ve her sayfanın en üstünde bulunacaktır. İçindeki değer parametre olarak atanmıştır. Zaten  P${} olalrak tanımlanmışlardır. Bunları field olarak da tanımlayabiliriz. Fakat field olarak tanımladığımız vakit o field ile aynı isimde değişkenimiz olmalı arka tarafta (java veya hangi ile yazıyorsanız), fakat parametrede böyle bir zorunululuk yoktur.

   <parameter name="companycode" class="java.lang.String"/> olarak da tanımlanır. 
   <field name="companycode" class="java.lang.String"/> field için de tanımlama böyledir.

 Alt kısım new java.util.Date() diye başlayan kısım ise "footer" kısmıdır. Ve bu da her sayfanın altında  gözükecek olan kısımdır. Burada günün tarihi oluşturan kişi ve kaç sayfadan kaçınıncısının görüntülendiğim bölümdür. Burası da özelleştirebilir tabi ki. Sağ altta gördüğünüz gibi variable kullanılmış. Bunlar hazır olan değişkenlerdendir ve $V{} ile tanımlanmışlardır.

  <textField>
<reportElement x="435" y="0" width="80" height="20"/>
<textElement textAlignment="Right"/>
<textFieldExpression><![CDATA["Page "+$V{PAGE_NUMBER}+" of"]] </textFieldExpression>
    </textField>
<textField evaluationTime="Report">
<reportElement x="515" y="0" width="40" height="20" />
<textFieldExpression><![CDATA[" " + $V{PAGE_NUMBER}]]></textFieldExpression>
  </textField>
<textField pattern="dd/MM/yyyy">
<reportElement x="28" y="0" width="100" height="20"/>
<textFieldExpression><![CDATA[new java.util.Date()]]></textFieldExpression>
 </textField>

    Şimdi de "detail" kısmına geldik. Burası da her sayfada değişkenlik gösterecek olan kısım demiştik. Mesela burada verilerimiz var. Sayfa sayısı arttıkça alt ve üst kısımlarımız aynı olmasına rağmen içindeki verileirmizi değişmesi gerekecektir doğal olarak. Burası orası :). Tabi tablo kısmımızın dolabilmesi için de "dataset" kısmının doldurulması gerekir. Dataset içinde de rapor görüntülenmesi gerekli olan parametre ve alanlar tanımlanır. Burada dikkat edilmesi gereken yer ise dataset içindeki elemanlar sadece tablo için kullanılır. Genel kullanım için tanımlananlar da tablo için kullanılmaz. Şimdi tablo tasarım sayfasına geçelim.

Resim-3

  Sağ alt kısmında tablo kısmı için farklı bir ekran tasarımı mevcuttur. Sol taraftaki "detail" kısmını açtğınızda zaten tabloyu göreceksiniz. Tablo içerisinde yine tablo ismi, kolon ismi, kolon içeriği vb kısımlar göreceksiniz. Biz sadece kolon ismi ve içeriğini ekledik burada. Örnek olarak bir kolon kodunu paylaşmadan önce daha önce de dediğim gibi yukarıda görünen parametre ve değişkenleri "dataset" içinde tanımlamak gerekir. Yoksa tabloya eklemenize izin verilmeyecektir.

<jr:table ...>
  <datasetRun subDataset="Table Dataset 1">
    <jr:column width="103" >
<printWhenExpression><![CDATA[new Boolean($P{showAccountName})]]> </printWhenExpression>
<jr:columnHeader height="30" rowSpan="1">
<textField isBlankWhenNull="true">
<reportElement x="0" y="0" width="100" height="30" />
<textElement verticalAlignment="Middle">
<font pdfEncoding="Cp1254"/>
</textElement>
<textFieldExpression><![CDATA[$P{accountNameCaption}]]></textFieldExpression>
</textField>
</jr:columnHeader>
<jr:detailCell height="30" rowSpan="1">
<textField isBlankWhenNull="true">
<reportElement x="0" y="0" width="100" height="30""/>
<textElement verticalAlignment="Middle">
<font pdfEncoding="Cp1254"/>
</textElement>
<textFieldExpression><![CDATA[$F{accountname}]]></textFieldExpression>
</textField>
</jr:detailCell>
    </jr:column>
</jr:table>

   Bu kodu kısaca açıklamakta fayda var. Öncelikle tablo ile kodumuzu başlatıyoruz ve ısrarla belirttiğimiz gibi içindeki verilerimizi alacağımız "dataset"ini tanımlıyoruz. Onun ismini veriyoruz. Daha sonra bunun içine kolon ve onun da içine kolon başlığı tagını veriyoruz. Kolon başlığı bitiminde kolon içini oluşturan "detailCell" kısmı devam ediyor. Burada dikkat edilecek bir kısım vardır. Kırmızı ile belirtilen tagımız ne işe yarar diye soracak olursanız. Örneğin sizin elinizde bir tablo var. Siz bi raporda 5 tane kolon alacaksınız, diğerinde 4. Bunun için yeni baştan bir taslak mı oluşturacaksınız. Hayır. Bu kısım sayesinde parametre olarak göndereceğimiz true/false değeri sayesinde kolonu gizleyecektir ve ondan oluşan boşluğu da otomatik olarak diğer sütunları kaydıracaktır.  IsblankWhenNull değer boş olduğunda null değeri gösterilsin mi ? pdfEncoding kısmı da türkçe kareketerin gösterilmesi içindir. Default olarak 1252 geliyor. Bunu düzeltmeniz gerekecektir yoksa türkçe karekterler bozuk gelecektir veya gözükmeyecektir.

  
Resim-4

   Burada içerik kısmının boş gelmesinin sebebini yukarıda dediğim gibi ireport üzereinden çalıştırdığım için oldu. Eğer siz veritabanından bilgilerinizi buraya aktarırsanız , sizinki dolu gelecektir. Onun için de "dataset" kısmını doldurmanız gerekecektir.
<queryString
     <![CDATA[]]>
</queryString>   
   
    Dikkat ederseniz tarihi 03.01.2017 gözükmektedir. Siz de takdir edersiniz ki bir günde yazılamıyor çoğu zaman bu yazılar. Çoğu zaman yoğunluktan bir kısmını bir gün , diğer kısmın başka bir gün yazıyoruz. Ama yazı tamamlanıp bunun gibi bitime geldiğinde tüm yorgunluklar unutuluyor. Herkese faydalı olması dileğiyle. İyi çalışmalar.

5 yorum:

  1. Merhaba JDK7 yi indirmeye çalıştım.Ama Oracle artık destek vermiyor galiba indiremedim.Ireportun jdk8 de çalışabilmesi için yapabileceğimiz başka bir yöntem var mı?
    Ya da java için başka bir şekilde raporlama yapabilir miyiz?

    YanıtlaSil
  2. Merhaba Furkan,
    Tabi ki çözümü var. Yukarıda bahsettiğim site maalesef göçmüş onun altında yorum olarak yazmıştım. Benim gibi problemle karşılaşan arkadaşlar için. Bulup size iletmeye çalışacağım.

    YanıtlaSil
  3. Tekrardan merhaba,
    Uzun süre oldu tabi bunu yapalı. Tam olarak hatırlayamasam da aşağıdaki linke bakmanızı öneririm. İşinizi çözecektir.
    https://stackoverflow.com/questions/23902977/ireport-not-starting-using-jre-8

    YanıtlaSil
  4. Merhabalar Hocam;
    Jasper 'da rapor oluşturma ile ilgili bir sorum olacak destek olabilirseniz sevinirim.

    Örnek olarak bir üç sayfalık bir fatura var her sayfa altına bu raporların toplamı yazdırabiliyorum. Fakat istediğim ilk sayfanın toplamı ikinci sayfanı sağ üst köşesine nakli yekün olarak hesaplayıp yazmasını istiyorum ve üçüncü sayfaya ise ilk iki sayfanın toplamı nı yazdırmak istiyorum bu konuda nasıl bir yol izleyebilirim.

    YanıtlaSil
    Yanıtlar
    1. Selamlar Hocam,
      Geç dönüş yaptığım için kusura bakmayın öncelikle. Jasper kullanmayalı yıllar oldu o yüzden maalesef size şuan yardımcı olamayacağım.

      Sil