25 Nisan 2012 Çarşamba

Stored Procedure Invalid Object Name

Notlarımda bulunsun..

Stored Procedure oluşturduktan sonra manasız bir şekilde "Invalid Object Name" diyerek SP'nin altını kırmızıyla çiziyorsa SQLServer ımız,
Edit -> Intellisense -> Refresh Local Cache
istiyor demektir.. :)

24 Nisan 2012 Salı

SQL Computed Column ile Ayrıntılı Tarih Tablosu

Peş peşe yayınlarımdan da farkedileceği üzere bugünlerde raporlarla başım dertte.. Hiç de sevmem kendilerini ama ne yapalım ekmek parası :)
Rapor yaparken yaparken yine bir gün müdürüm yanıma geldi ve ayrıntılı tarih tablosunun raporlarda gerekli olacağını söyledi. Hatta sonraki zamanlarda resmi tatil günlerini içerecek bir tablo yapacağımızın da sinyalini verdi.. Resmi tatil günleri muhtemelen manuel bir tablo olacak ama ayrıntılı tarih tablosu dediğim olay çok hoş :)
Şöyle ki SQL in computed Column özelliğini kullanmak bu tabloyla nasip oldu ve hoşuma da gitti..

Tablomun create scripti şu :

USE [Database]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[TARIH_TANIM](
    [TARIH] [date] NOT NULL,
    [GUN]  AS (datepart(day,[TARIH])),
    [AY]  AS (datepart(month,[TARIH])),
    [CEYREK]  AS (datepart(month,[TARIH])/(4)+(1)),
    [YIL]  AS (datepart(year,[TARIH])),
    [HAFTA_GUN]  AS (case when datepart(weekday,[TARIH])=(1) then (7) else datepart(weekday,[TARIH])-(1) end),
 CONSTRAINT [PK_TARIH_TANIM] PRIMARY KEY CLUSTERED
(
    [TARIH] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

Biz scriptle değil, tablo oluştururken kolon ayarlarından Computed Column Specification -> (Formula) alanını kullanarak formülleri ekledik .. En çok ilgimi çeken formüller Pazarı 7. gün yapan ve yılın çeyreklerini hesaplayan formüldü.. Neyse, tablomuz hazır..

Ama bitmedi ya içini nasıl dolduracağız?
ASP.NET te basit bir kod işimizi görür.. :

using System;
using _7GEN.Data;

public partial class lab_tarih_doldur : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        var sql = new SQL(ExceptionBehaviour.Throw);// burası bizim projeye özel bir sınıf.. Ayrıca kullanmak istersek sql bağlantılarımızı kendimiz karşılamak zorundayız :)

        var tarih = DateTime.Now.AddYears(5).Date;

        while (DateTime.Now.AddYears(-10) < tarih)
        {
            var command = sql.CreateCommand("INSERT INTO TARIH_TANIM(TARIH) VALUES (@TARIH)");

            sql.AttachParameter(command, "@TARIH", tarih);

            sql.Execute(command);

            tarih = tarih.AddDays(-1);
        }
    }
}

Bu kadar basitmiş..
Mutlaka aynılarının daha güzelleri yapılabiliyordur ama JAVA ve ORACLE saplantılı aşkından sonra .NET ve SQL e ısınmaya mı başlayacağım ne? :)

Kısmet..

Rapora Göre Farklı Parametre Atama ASP.NET RS

Müdürüm bazen beni çok fena ümitlendiriyor, bazen de çok fena komplekse sokuyor :) Bugün komplekse girdiğim günlerden biriydi..
Namaz arası verip biraz da işten kaytarıp geri yerime döndüğümde bir de baktım bilgisayarımın başında müdürüm oturuyor. O an başımdan aşağıya kaynar sular döküldü,, çünkü üzerinde uğraştığım kodu henüz tamamlamamıştım ve sanırım kodda biraz saçmalamıştım.. Utandım haliyle.. Neyse ki "ne yapmaya çalıştığını anlamadım ama... " ifadesi dışında fazla bir ezme söz konusu olmadı :P Sağolsun.
Yapmaya çalıştığım şey, elimdeki peeek çok rapora ASP.NET üzerinde ayrı ayrı parametre tanımlamaktansa, elimdeki rapora göre belli parametreleri atayabileyimdi. Ben kendi çapımda ...... ServerReport.GetParameters().Contains( ......... metoduyla uğraşıyordum.. Bakın hocam/müdürüm bu olayı hangi basit yöntemle çözmüş..
list ve LINQ kullanarak..
örnek kodumu da yayınlayayım da malum unutacağım sonra da lazım olacak :) ;

    protected void RaporaParametreAta()
    {
        this.ReportViewer1.ServerReport.ReportServerCredentials = new CustomReportCredentials();

        var raporParemetreler = this.ReportViewer1.ServerReport.GetParameters();

        var parm = new List<ReportParameter>();

        parm.Add(new ReportParameter("ILANID", this.Numara.ToString()));

        if (raporParemetreler.Any(c => c.Name == "ILKTARIH"))
        {
            parm.Add(new ReportParameter("ILKTARIH", this.txtBasTar.Text));
        }

        if (raporParemetreler.Any(c => c.Name == "SONTARIH"))
        {
            parm.Add(new ReportParameter("SONTARIH", this.txtBitTar.Text));
        }

        this.ReportViewer1.ServerReport.SetParameters(parm);
        this.ReportViewer1.ServerReport.Refresh();

    } 


Zekalıyım ama işte böyle bir yapamamışlık içindeyim ;p

20 Nisan 2012 Cuma

Asp.Net te Java jar kullanmak - IKVM

Tamamen Asp.Net le yazılmış olan projemizde kullanılmak üzere müşterimiz, kendilerine özgü güvenlik kuralları nedeniyle Java ile yazılmış bir jar dosyasını projemize dahil etmemizi söyledi.. jar to exe programları mı denemedik, cmd de dll e mi çevirmeye çalışmadık, beceremedik. Sonra kısa bir araştırma sonucu bu iş için yazılmış ücretsiz IKVM dosyalarına ulaşıp projemize dahil ettik. 17 kadar dll ekledi projeye ve kodumuz sorunsuz bir şekilde çalıştı :)
Teşekkürler IKVM! :p

Raporu İlk yüklemede scroll çıkması; sonraki yüklemelerde scroll çıkmaması

Başlık komik oldu ama ben olsam böyle aratırdım :D arama yapmayı becerememek böyle olsa gerek.. Sonuç olarak bulamadım da zaten çözümü :)
Sorunu çözmek için ümitli fakat faydasız çırpınışlarımı gören müdürüm bana acımış olacak ki çırpınışıma katıldı.. 1-2 saat çırpındıktan sonra sorunun AsyncRendering özelliğini false yapmış olmamdan kaynaklandığını gördük :) O kadar çok oynamıştım ki ayarlarla öyle bir şeyi değiştirdiğimi dahi hatırlamıyorum..
Yani nadir olur ama eğer asp.net te bir sayfada rapor çalıştırırken ilk yüklemede scroll çıkıp diğer yüklemelerinizde scroll çıkmıyorsa muhtemelen bu raporun asenkron çalışmamasından kaynaklanıyordur. Önce sayfayı getirip sonra raporu hazırladığı için oluyormuş.. Demek ki neymiş,, AsyncRendering = True imiş..

Rapora Sadece Print Modunda Görünen Alanlar Eklemek

VS2008 de raporlarla uğraşırken parametreleri sadece çıktı alırken yazdırma ihtiyacı doğdu. Bu ihtiyaç sonucu müdürümle RenderFormat.IsInteractive özelliğinin yazıcı modunda farklı değer döndürdüğünü keşfedip kullandık ve oldu :)
Şöyle yaptık= Göstermek istediğimiz alanlara Expression ekleyerek içlerine

=IIF(Globals!RenderFormat.IsInteractive,"","Rapor Tarihi: ")     ya da eğer bu alanları Rectagle içine alırsak Visibility özelliğine
=IIF(Globals!RenderFormat.IsInteractive,True,False)

gibi bir kontrol ekledik. Bu kontrole göre Globals!RenderFormat.IsInteractive yazıcıda false; çalışırken true değeri döndürüyor. Hal böyleyken Yazıcı modunda görünüp ekranda görünmez oldu :)

Öyle işte ..