Bu Blogda Ara

18 Ekim 2011 Salı

Dinamik olarak Asp.Net GridView kullanmak...

Senaryomuz basit arkadaşlar;
Faturaların listelendiği bir gridview'imiz var.Bu faturalar saha satış elemanları tarafından işlenip sisteme kaydediliyor.Fakat bu faturaların şirket binasında çalışan personeller tarafından onaylanması gerekmektedir...
Personellet,Gridview içinde listelenmiş faturalardan hangilerinin onaylandığını ve hangilerinin hala onay beklediğini  görmek zorundadır...
Veritabanımızda faturalarımızın tutulduğu iki adet tablomuz var,faturaUst ve faturaAlt...faturaUst tablomuz bizim üzerinde çalışacağımız tablodur çünkü bizim bu işlemi yaparken faturada yer alan alt satırlar yani satılan ürün,ürünün fiyatı,kaç adet satıldığı,kdv matrahı vb... gibi şeylerle işimiz yok,biz sadece faturanın onaylanıp onaylanmadığı bilgisiyle ilgileniyoruz ve dolayısıyla bizim asıl ilgileneceğimiz tablo,faturanın genel bilgilerini tutan faturaUst tablosudur...O zaman ne yapıyoruz ? Hemen bu tabloda "Onay" adında int32 veritipinde bir alan oluşturmalıyız...Eğer bu alandaki değer 0 ise fatura onaylanmamış,bu değer 1 ise fatura onaylanmış...
Saha çalışanları faturayı işledikten sonra sistem otomatik olarak faturaUst tablosuna faturanın genel bilgilerini kaydederken "Onay" bilgisini 0 olarak kaydettiğini farzediyoruz...Şirket binasında çalışan arkadaşlarımız faturayı onayladığında ise ilgili faturanın "Onay" alanındaki 0 değerini 1 yapıyoruz.Yani aslında gayet basit...Ama listede bu değerlerin direk 1 ya da 0 olarak görünmesini istemek ve "anlasınlar kardeşim işte 0 false 1 true" diyemeyiz değil mi ? Çünkü onlar programcı değiller....
Bunu bir Sql sorgusu ile 0 değerini "Bekliyor",1 değerini ise "Onaylandı" şeklinde gösterebiliriz...Mesala şu komut gayet işe yarar bir komut;
CASE WHEN Onay =0 THEN 'Bekliyor' WHEN Onay=1 THEN 'Onaylandı' END AS Durum 
fakat aslında bu da etkili bir çözüm değil,çünkü yüzlerce fatura satırınının içinde bu farketmek zor olabilir,bence en güzeli png dosyaları kullanmak,böylece hem görsellik sağlamış olacağız hemde kullanıcılar için kolaylık.
Bunun için size güzel bir site önerebilirim http://www.iconfinder.com/ bu adresten konuya göre,boyuta göre istediğiniz formatta,büyüklükte dosyaları bulabilirsiniz...
Ben onaylanmış bilgisi için bir check,bekliyor bilgisi için bir saat indirip root klasörümün içindeki images klasörüme kopyaladım...
Şimdi gelelim gridview içinde önce bir alan açmaya...
Hemen bir TemplateField alanı oluşturuyoruz;

  <asp:TemplateField HeaderText="Durum">
          <ItemTemplate>     
                     <center>
                 <asp:Image ID="durumImg" runat="server" ImageUrl="~/images/bekliyor.png" />
                    </center>
        </ItemTemplate>
</asp:TemplateField>
Artık daha belirgin ve görsel bir grid elde ettik,fakat şimdi ne yapacağız? Tabi ki eğer "Onay" değeri 0 ise grid içinde ilgili alanda saat ,değer 1 ise check göstereceğiz...Bunun için gridview içinde bulunan tüm satırları tek tek okutup,ve okunan fatura ile ilgili bilgiyi içeren faturaUst tablosundaki satırı bulup,o satırın "Onay" alanındaki değeri bulacağız....
Bunun için önce gridview içinde kaç satırın var olduğunu bulmalıyız ve bu çok kolay
int satirSayisi=gridview.Rows.Count; // toplam satır sayısını int veritipindeki satirSayisi değişkenine aktardık burada...
daha sonra gridview içindeki satırların hepsini bitene kadar okutmalıyız,yani for döngüsü kullanıyoruz...döngü sınırımız satirSayisi kadar olmalı...


 if (GridView1.Rows.Count > 0) //satır var mı ?
            {
                for (int i = 0; i < GridView1.Rows.Count; i++) 
                {
                    Label lblBlg = (Label)GridView1.Rows[i].FindControl("lblFatBelgeNo");
                    string belgeNo = lblBlg.Text; //faturanın belge numarası 


                        var fatUstBel = from fT in fatData.faturaUsts.Where(j => (j.belgeNo == belgeNo))
                                        select fT; // tablodaki ilgili fatura
                        foreach (var glO in fatUstBel) // elde edilen dizi içindeki değerleri bize veren döngü
                        {
                           
                            if (glO.onay != null) //onay alanı boş değilse
                            {
                                if (glO.onay.Trim() == "Onaylandı") //eğer onaylı ise
                                {
                                    Image im = (Image)GridView1.Rows[i].FindControl("durumImg");
                                    im.ImageUrl = "../images/onay.png"; 
                                }
                                if (glO.onay.Trim() == "Bekliyor") // eğer bekliyor ise
                                {
                                    Image imgs = (Image)GridView1.Rows[i].FindControl("durumImg");
                                    imgs.ImageUrl = "../images/bekliyor.png";
                                }
                            }  
                        }
       
                }
            }



24 Ağustos 2011 Çarşamba

LINQ

Her ne kadar Microsoft  bizi ara sıra çıldırtmış olsa da , eğer bir .Net Yazılımcısı iseniz Microsoft'un bu yapıyı ne kadar geliştirdiğini,geliştirmeye devam ettiğini ve işlerimizi daha da kolaylaştırdığını inkar edemeyiz.

Yine bu ardı arkası gelmeyen yeniliklerden birisi de Linq...Benim fikrimi soracak olursanız eğer, SQL .Net yazılımcıları için artık tarih olmakta....en azından benim için. :)

Peki nedir LINQ ?

Özellikle C# her ne kadar genel amaçlı bir programlama dili olsa da,C# dili hemen hemen tüm veri merkezli sistemlerde kolaylıkla kullanılabiliyor.Yeterki hali hazırda bir veritabanı olsun :) İşte LINQ daha önceleri kullanmış olduğumuz SQL yapısını kolaylaştıran,kısaltan ve dolayısı ile yazılımcıya hem zaman hem de güvenlik açısından güven sağlayan yeni bir framework....
Geyik yapmaya devam edelim,hemen bir senaryo oluşturalım...
Diyelim ki elimizde KISILER adında basit bir tablomuz var...Bu kişi tablosunun alanları;

Adı,Soyadı,Telefonu,Adresi olsun....

Eğer hala SQL kullanmak konusunda inatçı iseniz ,dört alandan içeren kısa bir kayıt için yazmamız gereken SQL cümleciği şu olacaktır :
"INSERT INTO KISILER ('Adi','Soyadi',Telefonu','Adresi') VALUES ('Adnan','Ertörer','05412847381','İzmir Konak')";

tabi ki bu cümleciği çalıştırmak için ayrıca bir bağlantı açmamız,daha sonra bir Command nesnesi oluşturmamız,sonra bu nesneye bu cümleciği tanıtmamız,çalıştırmamız ve bağlantıyı kapatmamız gerekecekti ....

Peki LINQ ile bu işlem nasıl oluşuyor

Linq,sizin oluşturduğunuz veritabanının anlık kopyasını olduğu gibi tutar ve tabi ki böylece veritabanında ki her şey birer nesneye dönüşür....

VeritabaniDataContext Dt=new VeritabaniDataContext();

KISILERS kisi=new KISILERS()
{
     Adi=Adnan,
     Soyadi=Ertörer,
     Telefon=05412847381,
     Adres=İzmir Konak
};
dt.KISILERS.InsertOnSubmit(kisi);
dt.SubmitChanges();

iste bu kadar :)   konuyu ne kadar salaş bir şekilde anlattığımın fakındayım,şu an İzmir Asansör'de kahve içmekteyim...Şu anki atmosferden bu kadar çıkıyor :)  Bir daha ki makalemde tüm ayrıntıları ile LINQ konusuna döneceğiz....Herkese kolay gele .




24 Aralık 2010 Cuma

Yeni Başlayanlar İçin..

Temel Ata Sınıf .NET ile çalışmak ileri seviye nesne tabanlı programlama bilgisini zorunlu kılar..NET kapsamında kullanılan herşeyin ata sınıfı System.Object sınıfıdır. Klasik programlama dillerinde kullanılan temel tiplerde dahil olmak üzere tipler,değerler,değişkenler,diziler,sabitler, vb.
System.Object sınıfını ata sınıf olarak kabul eder. Bu kapsamda örnek verecek olursam eğer ;
string yazi=12.ToString();
int i = "Deneme".Lenght;
double [] dizi = new double [3]{1.1,1.2,1.3};
int diziBoyutu=dizi.Lenght;
 Değersizlik,daha önce işaretçi tip işlemlerinde sık kullanılan null,nothing veya nil olarak ifade edilen kavramdır. Değersizlik,değişken içeriğinin boş olduğunu ,değişken n herhangi bir değer ieçermediğini belirtmektedir. Diziler Diziler,tipleri birebir aynı olan ve içeriklerine göre sayısal bir index aracılığıyla ulaşılabilen değişkenler listesi olarak tanımlanabilir.Diziler tek boyutlu veya çok boyutlu olabilirler.
int[] dizi1=new int[5];
int[] dizi2={1,2,3,4,5};
int[,] dizi3=new int[2,2];
int[,] dizi4={ {1,2},{3,4} };
int[,,] dizi5 = new int[5,3,5];
Örnek Uygulama yaparsak ;
using System;
using System.Collections.Generic;
using System.Text;
namespace dizi
{
class Program
{
static void Main(string[] args)
{
int[] dizi1=new int[5];
for (int i = 0; i < dizi1.Length; i++)
dizi1[i] = i * i;
for (int i = 0; i < dizi1.Length; i++)
Console.WriteLine("dizi1[{0}]={1}", i, dizi1[i]);
Console.ReadLine();
}
}
}
Bu kodları çalıştırdığımızda ekran görüntüsü şu şekilde olacaktır;
dizi1[0]=0
dizi1[1]=1
dizi1[2]=4
dizi1[3]=9
dizi1[4]=16

Derleme İşlemi Nedir ?

Derlemeyi ( Compile ),kullanıcı okunabilir kodunun (kaynak kodunun) makina okunabilir koda çevrimi olarakta tanımlayabiliriz.Kavramın 
dönüştürme (Conversion) olarak ifade edilmemesindeki temel sebep,işlem sırasında dönüştürme dışında bazı adımlarında gerçekleşiyor olmasından
kaynaklanmaktadır.

Derleme işlemi aşağıdaki adımlardan oluşmaktadır.

1-Sözcüksel analiz :
Kaynak kod içerisindeki en küçük parçaların (sayısal değerler,metin değerler,vb.) analizinin yapılmasıdır.
2-Sözcük dizim analizi:
Belirlenen sözcüklerin söz dizim kuralları kapsamında kontrol edilmesi
3-Anlam analizi:
Sözcük dizim hataları dışındaki hataların kontrol edilmesi
4-Ara kod oluşturma:
Geçici kod üretme
5-Optimizasyon:
Üretilen kodun optimize edilmesi
6-Çalıştırılabilir kod oluşturma:
Optimize edilmiş geçici koddan çalıştırılabilir kodun üretilmesi

Yukarıda listelenen adımlar tüm derleyiciler için geçerlidir ve kod üretimi bütün adımların başarıyla tamamlanması sonucu yapılmaktadır. ( Kod yazmak ne kadar zor bir
işmiş değil mi:)) )

Derleme işleminde yapılan ilk 3 adım tüm derleyiceler için aynı niteliktedir.Bu adımların temel işlevi kaynak kod içerisinde gerek diziliş gerek mantıksal hataları
yakalamak ve sonraki adımlarda işlenen kaynak kodun hatasız olduğunu garanti altına almaktadır.

Ara kod olarak ifade edilen ve kaynak kod ile hedeflenen çalıştırılabilir kod arasında bulunan yapı Ara Dil Kodu -IL Kod olarak tanımlanmaktadır.Kod üretiminde kullanı-
lan dil,farklı derleyiciler için mantıksal düzeyde aynı olmasına rağmen,şekilsel olarak farklı üretilmektedir.

Bir derleyicinin zeka ve değerini belirleyen en önemli unsur üretilen ara kodun optimizasyon düzeyidir.Optimizasyon işlemi,nihai çalıştırılabilen kodun kalitesini
de birebir belirleyen ödemli adımlardandır.Bu adımda rol oynayan en büyük etken,çalıştırılabilen kodun hedeflediği platform ve işletim sistemi özellik ve
nitelikleridir.

Dolayısıyla optimizasyon işlemine başlamadan önce platform bilgisinin belirlenmiş olması en kritik değerlerden birisidir.

Demek ki neymiş?:) 
Porgram yazıcaksan,kodlama yapacaksan kullandığın işletim sistemini çok iyi bilecekmişsin dimi ...:)

Tamamlanan optimizasyon adımı ardından derleyicinin son görevi optimize edilmiş IL kodun çalıştırılabilir koda çevrimidir.Böylece,kullanıcı okunabilir kaynak
kodun makina okunabilir koda derlenmesi tamamlanmış olmakta ve üretilen kod hedeflenen platform üzerinde çalışabilmektedir...

19 Ekim 2010 Salı

Değişkenler,İşleçler ve Deyimler

İfadeler:


İfade(staement),eylem geliştiren komutur.C#'ta ifadeler sözdizimi kurallarına uygun olmak zorundadır.Bu kurallardan en önemlisi ve olmazsa olması her ifadenin bir noktalı virgülle bitmek zorunda olmasıdır.Yoksa derleyici bunu anlayamaz.Mesala sonunda noktalı virgül olmasaydı aşağıdaki ifadeyi derleyici derleyemezdi;

Console.WriteLine("Merhaba");

Püf nokta şudur:Önce sözdizimi ve anlambilimini iyi öğrenmek ve daha sonra dili doğal ve deyimsel bir şekilde kullanmaktır.


Tanımlayıcılar:

Tanımlayıcılar(identifiers),program yazarken ad alanları,değişkenler ve yöntemler öğeleri tanımlamak için kullanılmaktadir.Yine bu bağlamda sözdizimi kurallarına uymk zorundasınız;

1-Yalnızca harf(büyük ve küçük),rakam ve alt çizgi karakterlerini kullanabilirsiniz
2-Tanımlayıcı,bir harf ile başlamak zorundadır.

Not:C# büyükküç harfe duyarlıdır.Örneğin kitapKaydet ile KitapKaydet yada kitapkaydet aynı şeyler değildir.

Anahtar Sözcükler

C#,77 adet tanımlayıcıyı kendisi kullanmak için ayırmıtır ve bunları kendi amaçlarınız için yeniden kullanmanıza izin vermez.

abstractdoinprotectedtrue
asdoubleintpublictry
baseelseinterfacereadonlytypeof
boolenuminternalrefuint


vs....


Değişkenler

Değişken(variable),program yazarken vermiş olduğunuz değeri saklayan,tutan bir depolama birimidir.Bilgisayarınızın içinde veriş olduğunuz değeri geçici olarak tutan bir oda gibi düşünün.Her tanımladığınız değişken için benzersiz bir ad kullanmak zorundasınızdır.Değişkenleri tuttkları değere göre adlandırmaısınız ve böylelikle okunabilirlik ve anlama daha kolay olacaktır.Çünkü o kadar çok değişken tanımlayacaksınız ki hangi değişken ne işe yarıyor hemen anlayabilmeniz gerekmektedir.Örneğin bir işletmenin maliyet değerini tutan bir değişkenin adı Maliyet olmalıdır.

Değişkenleri Adlandırmak

1-Tanımlayıcılarda altçizgi kullanmayın.
2-Yanlızca küçük-büyük harf farkına bağlı olarak değişken ouşturmayın.Örneğin Sayi ile sayi farklı değişkenlerdir evet,fakat karışıklığa sebebiyet vereilirler.
3-Adı küçük harfle başlatın.
4-Birden fazla kelimeden oluşan değişkenlerde,ilk kelimeden sonra gelen kelimenin baş harfini büyük yapın.Örneğin;
kdvTutarHesapla
5-Macar notasyonu kullanmayın.Bilmiyorsanızda dert etmeyin :))

17 Ekim 2010 Pazar

Yazılım Geliştirme Teknikleri




Bir sistemin analizi yada yeni bir yazılım yaratımı müşteriden gelen talep ile olur. Müşteri yazılımcıya ihtiyaçlarını ifade eder ve yazılımcı talebe tam olarak cevap verebilecek yazılımın algoritmasını oluşturur.



İhtiyaçların belirlemesinde sorulabilecek sorular:

Problemin kapsamı:
· Yazılım ne için?
· Yazılıma neden ihtiyaç duyulmuştur?
İhtiyaçlar:
· Düşünülen kullanıcı tipi kimlerdir?
· Sistem neler yapabilmelidir?
· Ara yüze konulacaklar?
Uygulama kontexti:
· Düşünülen donanım nedir?
· Düşünülen işletim sistemi nedir?
Kabullenişler:
· Hangi kabullenişler sistemin tasarlandığı şekilde çalışmasını sağlar?
· Performans
· Yanıt süresi,
· Hafıza ve disk yeri talebi,
· Cpu talebi nelerdir?




Prosedüre yönelik Analiz nedir?

Prosedüre yönelimli analiz sistemi etkileşimdeki prosürlerle datayı ayrı olarak düşünür. Örneğin C dilinde datalar Structure’lara function’larda prosedürlere denk gelir.
Burada data dictionary kayıtlı olan prosedürlerin kullandığı bilginin tanımlarını içerir. Bu yaklaşım programcıyı , sistem bileşenlerini , bileşenler arasındaki ilişkileri ve nasıl bileşenlerle sistemin tasarlanıp işleneceği konusundan uzaklaştırır. Bu analiz tipinde prosedürlerden gelen tüm bilgi tek bir mantıksal analiz dökumanı içerisinde saklanır.

Nesneye yönelimli analiz nedir?

Bu sorunun cevabını verebilmek için ilk önce nesnenin ne demek olduğuna bir göz atalım. Geleneksel olarak programcılıkta bilgi ve kod bir birinden ayrı tutulur fakat nesneye yönelimli programlamada data ve tek bir görünür nesne haline gelmiştir. Bu şekilde data ve kod paketleri halindeki nesneler birbirleriyle mesajlar aracılığıyla iletişim kurarlar. Bir nesnenin yapabileceği her şey bu mesaj ara yüzleriyle temsil edilir böylece bir nesneyi kullanmak için içinde neler olduğunu bilmek zorunda kalmayız bu bize daha sonra nesneler üzerinde yapabileceğimiz değişiklikler açısından esneklik sağlar. Bu şekilde nesnelere sadece mesajlar üzerinden erişim sağlayarak bir tür data gizliliği sağlanır buna kapsülleme (encapsulation) denir.

Tüm bu yapılanların amacı yazılımı en kolay şekilde nasıl tekrar yazabileceğimiz sorusana cevap vermektir. Unutmamak gerekir ki “yazılım yazılmaz yeniden yazılır(Software is not written , its rewritten)”. Nesneye yönelimli programlamada amaç programı küçük sınıflara ayırarak sistemin esnekliğini artırmak buna bağlı tekrar yazma gibi durumları ortadan kaldırarak yazılım geliştirme sürecine en aza indirmektir ve dolasıyla masrafları düşürmektir.

Nesneye yönelik programlamada anlamamız gereken bir başka konuda sınıflardır. Kısaca söylemek gerekirse nesneler sınıfların tekil birer örnekleridir. Bu ne demektir? Bir örnekle konuya açıklık getirelim mesela elimizde bir ev sınıfı olsun bizde ev sınıfından pencere diye bir nesne çağıralım. Pencere bir ev sınıfı nesnesi örneğidir, ev sınıfı bu nesnenin yapabileceği işleri ve kendisini tanımlar. Bir sınıf birden fazla nesne üretebilir ve ev sınıfı nesnelerinin anlayabileceği mesajlar üretir. Bu tip sınıflardan nesne örnekleri yaratma olayına nesneye yönelik programlamada”Factory” denir. Nesnelerin gönderdikleri mesajlar içindeki kodlara verilen addır ve bu mesajlarla genelde argumanlarda yollanır bunlar genelde nesnenin neyi,ne zaman ne kadar yapacağı gibi sorulardır. Örnek olarak bir temizle mesajı “hangi pencere” veya “ne zaman” sorularının cevaplarıyla gelebilir.

Nesneye yönelik programlamada yaratmamış olduğumuz sınıfları daha spesifik alt sınıflara ayırabiliriz. Bunlara alt sınıflar(sub classes) denir, alt sınıflar yaratılığı atasına (parent class) ait tüm var olan mesajları ve davranışları da alır bu olaya miras (İnheritance) denir. Yani daha üst sınıflara ait mesajlar yeniden(reuse) kullanılabilir ve kendi alt sınıfımıza ait spesifik yeni mesajlar yaratabiliriz. Mesela ev sınıfımızdan bir oda alt sınıfı yaratalım ev sınıfından kalma bir evde “renk” mesajı oda sınıfında kullanılabilir veya oda için “yatak” gibi bir yeni mesaj tanımlayabiliriz.

Piyasada nesne yönelimli bir çok programlama dili vardır özellikle bu sayı her gün artan yeni internet yazılım geliştirme ortamıyla büyük bir artış göstermiştir. Ancak eskiden beri gelmiş kabul gören ve çok kullanılan üç programla dili vardır.

· C++: C’nin Object oriented versiyonudur.


· Java: Sun microsystems’in geliştirmiş olduğu bu dilin İBM, Microsoft, Symantec gibi versiyonlarıda bulıunmaktadır. Bu dilin çok tutulmasının nedeni internet ve internet uygulamalarında ve web browserlarla son derce uyumlu ve güvenilir olarak çalışabilir olmasıdır.

· Smalltalk: Tam standardı oturmamıştır bu yüzden üç ayrı ticari sürümü vardır.
VisualWorks ParcPlace-Digitalk, Inc.
Smalltalk/V and Visual Smalltalk f ParcPlace-Digitalk Inc.
VisualAge IBM



Nesneye yönelimli analiz bir nesneye yönelimli sistem analiz tekniğidir. Birbiriyle iletişimde olan nesnelerin esas karakteristiğini ortaya koymada etkili bir tekniktir. Temel kavramları sistem bilgisinin biçimsel tanımı ve davranış biçimi modellemedir. Burada datalar arası ilişkiler mesajlarla , argümanlar aracılığıyla yapılan metotlarla olur.



Mesajların içerdiği metotlar gittiği yerdeki mesaj alıcı tarafından işlenir. Oo analizin temel kavramları sistem bilgisinin formal tanımına ve davranış biçimi modellemeye dayanır. NYA’de modellenen tüm bileşenler sistemin önemini kavratacak şekilde tasarlanır yani sistem nasıl uygulanacağı sorusu yerine gerçek ne olduğu sorusu üzerine inşa edilir

Nesneye yönelik analiz , prosedüre yönelik analizden farklı olarak sistemi “nasıl” sorusundan ziyade ne sorusu üzerine inşa eder böylece erken bir tasarım aşamasına geçişten programcıyı alı koyar.