14 Eylül 2017 Perşembe

FastReport Rapor Tasarlama (Rapor Sihirbazı ile)

Bu yazımda FastReport Designer'da standart rapor sihirbazı kullanarak sıfırdan rapor oluşturulması anlatılacaktır.

İlk olarak fastreport designer programını açılıyoruz ve standart rapor sihirbazını seçiyoruz.



Karşımıza gelen ekrandan yeni veri kaynağı oluştur seçeneğine tıklayarak yeni bağlantı oluşturuyoruz. Burada kendi veritabanınızın yolunu ve hangi database'i kullanacaksak o database'i seçiyoruz.



Veritabanımızı seçtikten sonra sonraki diyerek raporumuzda hangi tabloları kullanacaksak buradan seçebiliyoruz. Ya da sql sorgusu ekle seçeneğine tıklayarak direk select cümleciğimiz ile sorgumuzu yazıyoruz. Sorgu seçeneğini seçtiğimizde bizden bir tablo ismi tanımlamamızı istiyor. Burada herhangi bir şey girebilirsiniz. Belirttiğiniz isim sanal tablonuzda kullanılacak isim olacak.


Tablomuzun adını belirlememizin ardından karşımıza sql sorgumuzu yazacağımız ekran çıkıyor sorgumuzu direk buradan yazabilir ya da sorgu yapıcıyı kullanabilirsiniz.  Sorgumuzda rahatca inner joinler gruplamalar ve kısıtlamalar kullanabiliyoruz.




Sonraki adımda istersek parametreler tanımalayabiliyoruz. Parametreler kısıtlamalarda işimize yarayacak. Örneğin bir where sorgusuyla id kontrol edeceksek id isminde bir parametre oluşturarak buradan kontrolünü sağlayabiliyoruz. İlerleyen yazı dizelerinde buna örnek verilecektir. Şuanlık parametre kullanmayacağımız için sonraki diyoruz.


Buradan istersek columlarımızın özelliklerini değiştirebiliyoruz. Ben herhangi bir oynama yapmayacağım. Son diyoruz. Açılan sayfada tekrar son diyoruz. Ardından karşımıza seçilen veri kaynağı sayfası gelmekte. Buradan sonrakine tıklıyoruz ve  raporumuzda hangi kolumları kullanacaksak onları seçiyoruz. ben hepsini kullanacağım için tümünü seçtim.




Sonraki adımda istersek grup oluşturabiliyoruz. Ben oluşturmadan geçtim. Düz bir liste görüntülemek istiyorum. Ardından buradan sayfanın biçimsel özelliklerini belirliyoruz.



Son dediğimizde raporumuzu genel hatlarıyla tamamlamış oluyoruz. Rapor düzenleme ekranında bundan sonra istediğimiz gibi düzenleme yapabiliriz.



Raporda genel mantık şu şekilde işlemekte.


Band Aracı: Raporumuza veri, başlık gibi eklemeleri bu araç ile yapmaktayız. Buradan ekleme yaparak gerekli ayarlamaları belirtiyoruz. Default olarak Rapor başlığı, sayfa başlığı veri ve sayfa toplamı ekli olarak gelmekte.

Rapor Başlığı: Raporumuzun en üstünde yazacak olan yazıdır. Burada kurumun adı ya da logoyu ekleyebiliyoruz. Ne ekleyeceğiniz size kalmış. İstersek band aracına tıklayarak rapor başlığına çocuk ya da alt rapor başlığı eklenebiliyor. Bunlar tasarım konusunda daha ileri noktalarda çok işe yaramakta.

Sayfa Başlığı: Raporumuzun her sayfasının üstünde görmek istediğimiz alanları buraya yerleştiriyoruz. Rapor başlığında olduğu gibi burada da alt başlık ve çocuk olayları geçerli.

Veri: Verilerimizi çektiğimiz alan burası. Tekil veriler rapor başlığı ya da sayfa başlığı gibi alanlara da yerleştirilebiliyor. Fakat çoğul veriler kesinlikle veri bandına yerleştirilmelidir. Yani bir liste çekeceksek bu veri bandında olmalı. Veri bandında band aracı yardımıyla alt veri ya da veri grubu ekleyebilmekteyiz. Bunlar da ileride karşılaşacağımız kullanımlar. Ayrıca bir raporda birden çok veri bandı da kullanabiliriz. Bu ayrı raporda birden çok veri kaynağından veri çekeceğimiz zaman işe yarayacak.  Veri bandının yanındaki isim ise bizim hangi kaynaktan veri çekeceğimizi gösterecek. Bu ismin seçilmesi raporun doğru çalışması için mutlaka gereklidir. Eğer veri bandının yanında isim yazmıyorsa veri bandına çift tıklayarak veri kaynağını seçebiliriz.



Sayfa Toplamı: Raporumuzun sayfalarının altında yazmak istediğimiz alanları buraya ekliyoruz. Bu sayfa sayısı olur, adres olur....ne isterseniz. İlk eklendiğinde [PageN] kendiliğinden gelmektedir. Bu sayfa toplamının yazıldığı alandır.

Son olarak verikaynağımızdan çekeceğimiz verileri sağ taraftan sürekleyerek raporumuza ekleyebiliriz. Eklenmiş halleri [Deneme.kurumAd] gibi görünecektir. [] kullanılan yazılar raporun bir veri columnunu beklediğini belirtir.

Sol üst menüde report kısmına gelerek Onizlemeye tıklarsak raporumuzun nasıl göründüğünü izleyebiliriz. Bundan sonrası sizin tasarım becerilerinize kalıyor. Raporunuzu stediğiniz gibi tasarlayabilir, tablo-resim ekleyebilirsiniz.



Böylece raporumuzun tasarımını tamamlamış olduk. Yani frx uzantılı dosyamızı hazırladık. Bundan sonrasi raporumuzu hangi sistemde kullancaksak ona entegre etmek, çağırmak.

Asp.net projesinde nasıl kullanıldığını görmek için; FastReport - ASP.NET Rapor Oluşturma yazıma göz atabilirsiniz.
Paylaş:

13 Eylül 2017 Çarşamba

FastReport - ASP.NET Rapor Oluşturma

Fast Report yaygın olarak kullanılan raporlama araçlarından biridir. Bu yazıda Fast Report ile tasarladığımız raporu Visual Studio aracılığıyla asp projemizde nasıl kullanacağımız anlatılacaktır.

İlk olarak yapılması gereken Visual Studio'da referanslara aşağıdaki 5 dll'i eklemek olacaktır.



Daha sonra raporun görüntülenmesini istediğimiz yeni bir sayfa oluşturuyoruz ve bu sayfaya FastReport(Rapor oluşturmak için) ve System.IO(MemoryStream'i kullanabilmek için)  küttüphanelerini sekliyoruz.



 protected void Page_Load(object sender, EventArgs e)
        {

            FastReport.Utils.Config.WebMode = true; //Raporun web modunu açıyoruz.

            using (Report report = new Report())// yeni rapor oluşturuyoruz.
            {

                report.Load(@"C:\Users\ASUSNB\Desktop\deneme\Rapor\SozlesmeListesi.frx"); // raporumuzun bulunduğu dizini gösteriyoruz.

                report.Prepare();//raporu hazırla

                FastReport.Export.Pdf.PDFExport pdfExport = new FastReport.Export.Pdf.PDFExport();// raporu pdf'e dönüştür ve bu pdf'i görüntüle.
                using (MemoryStream strm = new MemoryStream())
                {
                    report.Export(pdfExport, strm);

                    Response.ClearContent();
                    Response.ClearHeaders();
                    Response.Buffer = true;
                    Response.ContentType = "Application/PDF";
                    Response.AddHeader("content-disposition", "inline; filename=" + "SozlesmeListesi.pdf");

                    strm.Position = 0;
                    strm.WriteTo(Response.OutputStream);
                    Response.End();
                }

            }
        }

report.Load kullanımı local veritabanında çalışırken sorun çıkarmaz fakat onlıne veritabanı kullanılacak ise report.Load yerine Server.MapPath kullanılmalıdır. Bu sayede online veritabanında tasarımın olduğu dizin bulunabilecektir.

Yukarıdaki örnek FastReport Designer'da frx uzantılı olarak hazırlanmış ve verikaynağı da bu tasarımın içine gömülmüş raporlar için kullanılabilir. Bu kullanım FastReportun en basite indirgenmiş halidir. Sonraki yazı dizelerinde parametreli kullanım ve veri kaynağının tasarım kısmında değil de visual studio tarafında gönderildiği örnekler yapılacaktır.
Paylaş:

11 Eylül 2017 Pazartesi

MVC Proje Oluşturma - _Layout Ekleme

Yeni bir MVC projesi oluştururken yapılacaklar adım adım anlatılacaktır.  İlk olarak boş bir MVC projesi açılır.
  • Projede kullanılacak classlar için Classes klasörü eklenir.
  • Projede kullanılacak olan temanın içeriğinin yer alacağı Content klasörü eklenir.
  • Reverse Enginnerr code first ile veri tabınımız Entity Framework aacılığıyla projeye eklenir.
  • web configde connectionStrings bağlantısının yolu düzenlenir, kendi sqlimize uygun hale getirilir.

Proje ilk açıldığında genel olarak yapılması gerekenler bunlardan ibaret. Her projeye başlandığında bu işlemler yapılırsa bir süre sonra el çabukluğu oluşacaktır.

MVC MasterPage

ASP'deki masterpage'in karşılığı MVC'de layouttur. Layoutlar genelde Viewlerin içinde oluşturacağımız Shared klasörünün içinde bulunur. Shared isimli bir klasör oluşturarak _Layout isimli bir parçalı view projeye eklenir. Layout'un başındaki alttire view'in parçalı olduğunu belirtmek için kullanılır. Genel kullanım olarak tüm parçalı viewlere alttire eklemekte payda var.


<section class="content">
                @RenderBody()
 </section>

Layout'umuzun tasarım kısmını aldıktan sonra sıra Asp'deki contentcplaceholder olarak bildiğimiz değişken parçayı belirlemekte. MVC'de buna karşılık gelen satır @RenderBody()'dir. Renderbody ile viewlerimizde değişmesini istediğimiz içerikleri yazabileceğiz.

MVC'de ASP'den farklı olarak sadece bir tane değişken alan tanımlanabilir. Yani tek RenderBody kullanılabilir. Peki birden çok değişen alan istediğimizde ne yapacağız? Bu sefer de yardımımıza bu satır yetişmekte.


@RenderSection("CSS", false)

CSS olarak yazdığımız için contentimizin adı oluyor. Yani buraya css ile ilgili ekleyeceğimiz değişken satırları ekleyebiliyoruz. False ise bu section'un zorunlu olup olmadığını belirtmek için kullanılıyor. Default kullanımı false'dur yani her viewde bu section'ın olması zorunlu değil şekilde ayarlanmıştır. Biz de genelde hep bu şekilde kullanacağız.

Son olarak;


Views'in altındaki Web Configin içerisine namespace olarak projemizin model dosyasını ekliyoruz.



  <add namespace="kuzyyeliebru.Models"/>

Paylaş:

24 Ağustos 2017 Perşembe

Checkboxlist Çoklu Seçim Yaptırma ve Düzenleme


Çoklu seçim yaptırma ve kaydetme;


   for (int i = 0; i < chkPersonel.Items.Count; i++)
                {
                    if (chkPersonel.Items[i].Selected == true)
                    {
                       int persID = Convert.ToInt32(chkPersonel.Items[i].Value);
                        ArGeKurumYetkili a = new ArGeKurumYetkili();
                        a.arGeBilgilerID = argeBilgiler.arGeBilgilerID;

                        var yetkili=Erdi.EF.KurumYetkililers.Where(x => x.personelID == persID && x.kurumID==argeBilgiler.kurumID).SingleOrDefault();
                        a.kurumYetkililerID = yetkili.kurumYetkililerID;                        Erdi.EF.ArGeKurumYetkilis.Add(a);
                        Erdi.EF.SaveChanges();
                    }
                }

ChecboxList çoklu doldurma(düzenleme ekranları için);



  for (int i = 0; i < id.Count; i++)
            {
                chkPersonel.Items[id[i].KurumYetkililer.Personel.personelID - 1].Selected = true;
            }

Güncelleme(tablodan önce eski veriler siliniyor, tablodan çoklu veri silmek için foreach kullanılır.)



                foreach (var item in Erdi.EF.ArGeKurumYetkilis.Where(x => x.arGeBilgilerID == argeBilgiler.arGeBilgilerID).ToList())
                {
                    Erdi.EF.ArGeKurumYetkilis.Remove(item);
                    Erdi.EF.SaveChanges();
                }


Bu sefer veritabanına güncel verileri ekliyor. Son seçilen checbox bilgilerini yani.



 for (int i = 0; i < chkPersonel.Items.Count; i++)
                {
                    if (chkPersonel.Items[i].Selected == true)
                    {
                        int persID = Convert.ToInt32(chkPersonel.Items[i].Value);
                        ArGeKurumYetkili a = new ArGeKurumYetkili();
                        a.arGeBilgilerID = argeBilgiler.arGeBilgilerID;

                        var yetkili = Erdi.EF.KurumYetkililers.Where(x => x.personelID == persID && x.kurumID == argeBilgiler.kurumID).SingleOrDefault();
                        a.kurumYetkililerID = yetkili.kurumYetkililerID;
                        Erdi.EF.ArGeKurumYetkilis.Add(a);
                        Erdi.EF.SaveChanges();
                    }
                }

Paylaş:

UpdatePanel Kullanımı

UpdatePanel kontrolü, ASP.NET AJAX uygulamalarında, bir web sayfası içerisinde kısımlar oluşturulmasını ve bu kısımların asenkron şekilde güncellenmesini sağlayan kontroldür. Bu kontrol sayesinde  bir sayfa PostBack işlemine tabi tutulmadan güncellenebilir.


<asp:UpdatePanel ID="updatePanel1" runat="server">
   <ContentTemplate>
         <!-- PostBack olması istenen itemler -->
   </ContentTemplate>
   <Triggers>
         <!-- Olaylar/ buton -->
   </Triggers>
</asp:UpdatePanel>

Tetikleyici buton contenttample içerisinde ise triggers tagının kullanılmasına gerek yoktur. Ayrıca dropdown gibi aoutopostback özellliği olan itemlerde tetikleyici için bir butona ihtiyaç yoktur.

PostBackTrigger ve AsyncPostBackTrigger

Postbacktrigger; sayfanın tamamında postback işlemi gerçekleştirmesi istenirse kullanılır.

AsyncPostBackTrigger; sayfanın tamamının değil sadece o update panelin içinin postback işleminin gerçekleşmesini sağlar.


Bir sayfada birden çok update panel kullanılmak istenirse; İç kısımdaki UpdatePanel'in dıştaki panelden ayrı olarak çalışabilmesi için dıştaki UpdatePanel'in (UpdatePanel3) UpdateMode özelliği Conditional, içteki UpdatePanel'in (UpdatePanel4) UpdateMode özelliği ise Always(default olduğundan tanımlanmasına gerek yok.) olarak tanımlanmalıdır. 


<asp:UpdatePanel ID="UpdatePanel3" runat="server" UpdateMode="Conditional">
   <ContentTemplate>
      <table style="width: 300px; background-color: #9999ff">
         <tr><td>
            <asp:Button ID="Button3" runat="server" Text="Ana Panel" /><br />
        

            <asp:UpdatePanel ID="UpdatePanel4" runat="server">
            <ContentTemplate>
               <table style="width: 200px; background-color: #99ccff">
                  <tr><td>
                    
                     <asp:Button ID="Button4" runat="server" Text="İç Panel" />
                  </td></tr>
               </table>
            </ContentTemplate>
         </asp:UpdatePanel>

      </td></tr> </table>
   </ContentTemplate>
</asp:UpdatePanel>


Paylaş:

Session ve Cookie Kullanımı (Kullanıcı Girişi)

Session ve cookii'nin ikisi de server tarafından tutulan bilgilerdir. Session daha çok tarayıcı açıkken-oturum boyunca saklanancak veriler için kullanılırken; cookie ise belirtilen süre boyunca oturum kapatılsa bile saklanması istenilen veriler için kullanılır(kullanıcı adı ve şifrenin kendiliğinden gelmesi gibi.-Beni hatırla seçeneği-)

Session ve Cookie kullanımına bir örnek;



Session ve cookiler bir sistemde genelde giriş sayfasında oluşturulur, diğer sayfalarda çağırılır ve çıkış sayfasında sonlandırılırlar.

Giris.aspx.cs -Session/ Cookie Oluşturulması


 protected void btnGiris_Click(object sender, EventArgs e)
        {
              Kullanici kulGiris = Erdi.EF.Kullanicis.FirstOrDefault(x => x.Kulad == txtKulAd.Text&&x.Sifre==txtSifre.Text);
              if (kulGiris != null)
              {
                  HttpCookie cerez = new HttpCookie("cerez");
                  if (cbCookie.Checked)
                  {                     
                      cerez["KulAd"] = txtKulAd.Text;
                      cerez["Sifre"] = txtSifre.Text;
                      cerez["KullaniciId"] = (kulGiris.KullaniciID).ToString();
                      cerez.Expires = DateTime.Now.AddDays(1);
                      Response.Cookies.Add(cerez);
                  }
                  else
                  {
                      cerez["KullaniciId"] = (kulGiris.KullaniciID).ToString();
                      cerez.Expires = DateTime.Now.AddDays(1);
                      Response.Cookies.Add(cerez);                     
                  }
                  Response.Redirect("~/Kullanicilar/BilistProfilim.aspx");
              }
              else
              {
                  Response.Redirect("~/Kullanicilar/BilistGiris.aspx");
              }
         
        }


ya da


HttpCookie cerez = new HttpCookie("cerez");
                  if (cbHatirla.Checked)
                  {                     
                      cerez["KulAd"] = txtKulAd.Text;
                      cerez["Sifre"] = txtSifre.Text;
                      cerez.Expires = DateTime.Now.AddDays(1);
                      Response.Cookies.Add(cerez);

                      Session["yetkiId"] = kulGiris.yetkiID;

                  }
                  else
                  {
                      Session["yetkiId"] = kulGiris.yetkiID;           
                  }



Giriş butonuna tıklandığında beni hatırlanın seçili olup olmamasına göre kontroller sağlanır. Ayrıca giriş sayfasının pageblooadında  cookie çağırılarak kayıtlı cookie bilgileri kontrol edilir.



  protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
                return;
            HttpCookie cerez = Request.Cookies["cerez"];
            if(cerez!=null)
            {
                string Ad = Request.Cookies["cerez"]["kulAd"];
                string sifre = Request.Cookies["cerez"]["Sifre"];
                if (Ad != "" && sifre != "")
                {
                    txtKulAd.Text = Ad;
                    txtSifre.Text = sifre;
                }
            }
            else
            {

            }
        }

Diğer sayfalarda basitçe cookie çağırma işlemi ise aşağıdaki satır gibi yapılır.



int KullaniciId = Convert.ToInt32(Request.Cookies["cerez"]["KullaniciId"]);

Çıkış sayfasında ise sonlanması istenilen cookie bitirilir.


Request.Cookies["Kullanici"]["KullaniciId"] = "";

Paylaş:

Trigger Kullanımı - After Trigger

Trigger yani tetikleyici kullanımlarına bir kaç örnek verelim. After triggerlar olay gerçekleştikten sonra devreye giren triggerlardır. Bu olaylar ekleme silme ya da güncelleme olabilir. İşlemler genel olarak sanal tablo olan inserted ve deleted tabloları üzerinden gerçekleştirilir.

Ekleme işleminden sonra devreye giren trigger örneği;



ALTER TRIGGER ekle -- trigger Adi
ON Ogretmenler -- hangi tablo icin tetiklenecek
AFTER INSERT -- hangi islem icin tetiklenecek
AS
declare @ad nvarchar(50) set @ad=(select ad from inserted) -- eklenen verileri degiskene ata.
declare @soyad nvarchar(50) set @soyad = (select soyad from inserted)
INSERT INTO Log VALUES(GETDATE(),@ad+' '+@soyad +' adlı kişi ' +CONVERT(VARCHAR(11), GETDATE(), 106) +'tarihinde eklenmiştir.') -- degiskenleri log tablosuna ekle.

Silme işleminden sonra devreye giren trigger örneği;



ALTER TRIGGER sil -- trigger Adi
ON Ogretmenler -- hangi tablo icin tetiklenecek
AFTER DELETE -- hangi islem icin tetiklenecek
AS
declare @ad nvarchar(50) set @ad=(select ad from deleted) -- eklenen verileri degiskene ata.
declare @soyad nvarchar(50) set @soyad = (select soyad from deleted)
INSERT INTO Log VALUES(GETDATE(),@ad+' '+@soyad +' adlı kişi ' +CONVERT(VARCHAR(11), GETDATE(), 106) +' tarihinde silinmiştir.') -- degiskenleri log tablosuna ekle.

Güncelleme işleminden sonra devreye giren trigger örneği (önce delete sonra insert);



CREATE TRIGGER guncelle -- trigger Adi
ON Ogretmenler -- hangi tablo icin tetiklenecek
AFTER UPDATE -- hangi islem icin tetiklenecek
AS
declare @eskiAd nvarchar(50) set @eskiAd=(select ad from deleted) -- eski veri sanal tablodan alindi.
declare @yeniAd nvarchar(50) set @yeniAd=(select ad from inserted) -- yeni veri sanal tablodan alindi.
declare @eskiSoyad nvarchar(50) set @eskiSoyad = (select soyad from deleted)
declare @yeniSoyad nvarchar(50) set @yeniSoyad = (select soyad from inserted)
INSERT INTO Log VALUES(GETDATE(),@eskiAd+' '+@eskiSoyad +' adlı kişi '  
+CONVERT(VARCHAR(11), GETDATE(), 106) +' tarihinde '+@yeniAd + ' ' + @yeniSoyad 
 +' şeklinde düzenlenmiştir.') -- degiskenleri log tablosuna ekle.
Paylaş: