Author Archives: frtlkmn

COALESCE function Transact SQL

Efendim t-sql’de kullanılan kullanışlı bir fonksiyondur kendisi. Birden fazla alan içerisinden değer içeren (dolu olan) alanı seçmek istediğinizde bu build-in fonksiyon yardımınıza koşuyor.

A = COALESCE(alan1,alan2,alan3)

yada

COALESCE(alan1,alan2,alan3) as A

şeklinde yazıldığında alan1, alan2 ve alan3 içerisinde ilk bulduğu “null” olmayan değeri almanızı sağlıyor.

Daha fazla bilgi için : http://msdn.microsoft.com/en-us/library/ms190349.aspx

Overload (C#)

Overload: en basit tabiri ile açıklamak gerekirse, bir metodun aynı isimle tekrar yazılması, aldığı parametrelerin değişmesi durumudur. Bir metodun aldığı değerleri değil de sadece dönüş tipinin farklı olacağı şekilde çoğullamak istiyorsak aldığı değerleri de değiştirmek zorundayız. Örneğin elektrik fatura tutarını hesaplayan bir metodumuz olduğunu ele alalım.

decimal FaturaHesapla(decimal Tutar, decimal KdvOrani) {
   return Tutar * KdvOrani;
}

Fatura tutarını hesaplarken kayıp kaçak bedeli adı altında, tahsil edemediğimiz bedelleri de üyelere ödeteceğimiz bir alan daha eklemek zorunda kaldığımızı düşünelim.

decimal FaturaHesapla(decimal Tutar, decimal KdvOrani, decimal KacakBedeli) {
   return (Tutar * KdvOrani) + KacakBedeli;
}

Bu durumda FaturaHesapla adını kullanmak için yazdığımızda visual studio’da intellisense otomatik olarak bu metoda ait overload’ları alt alta listeleyecektir.
KacakBedeli yansıtılacak faturaları hesaplarken bir değer daha alan ikinci yazdığımız metod çalışacaktır.

Metoda gelen değerleri değiştirerek overload yazabiliyoruz, peki ya dönen değerleri değiştirmek istersek? örnekte “decimal” tipinde veri dönmektedir, bunu değiştirebilmek için metoda gelen değerlerde de değişiklik yapmamız gerekecektir. C#, aynı sayıda ve tipte veri girişi yapılan metodlardan, aynı tipte veri çıkışına izin vermemektedir.

string FaturaHesapla(decimal Tutar, decimal KdvOrani, string KacakBedeli)
{
   return string.Format("Fatura Tutarınız : {0}, Kaçak Bedeli : {1}", Tutar*KdvOrani, KacakBedeli);
}

Windows 8, windows 10 klavye mouse çalışmaması [çözümlü]

Bilgisayarınıza windows 8, windows 10 kurduktan sonra windows açılış ekranından itibaren klavye ve mouse çalışmayı durduruyorsa bunun bir çözüm yöntemi var. Bazı donanımlarda klavye ve fare ikilisinin windows 8/10 platformunda sorun çıkarttığı destek sitelerinde paylaşılmıştır, kendim de bizzat bu sorunu yaşamış birisi olarak iki çözüm yolunu paylaşacağım.

1) Kesin Çözüm:

internetten usb belleğe bios update’ini indirip bios panelinden update sekmesine gelerek harici disk üzerinden bios update’i yapmak.

2)  Bazı modellerde geçerli update’siz çözüm :

bios ayarları ekranından “usb legacy support” özelliğini “disabled” olarak ayarlamak.

 

Bu işlemi yaptıktan sonra windows 8, windows 10 kurulu bilgisayarınızda klavye, mouse çalışır hale geliyor.

Not : ikinci çözümün her bilgisayarda sorunu çözmediği anlaşılmıştır, konu ile ilgili daha detaylı bilgi ve çözüm için microsoft support forumlarında bir başlık açılmış durumda, buradan takip edebilirsiniz.

usb-legacy-support

Chrome’da Javascript Print() fonksiyonu.

Normal olarak sayfamızdaki belli bir bölümü yazdırmak istediğimizde, bu bölümü “id” veya “class” tag’lerinden yakalayarak yeni bir pencere içerisine yazdırıp bu pencerenin objesinden print() fonksiyonunu çağırarak istediğimiz bölümü yazıcıya gönderebiliyoruz, bunun yanı sıra jquery ile sayfamızdaki html objelerinden birine “printable” sınıfını ekleyerek sadece bu kısmın yazıcıdan çıkması da sağlanabiliyor, tabi gerekli jquery sürümü sayfanızda mevcut ise bunu tercih edebiliyorsunuz.

Chrome ile bu işlemi yaptığınızda sayfa içeriği yüklenmeden önce chrome print() fonksiyonunu işlettiğinden dolayı boş bir sayfa ile karşılaşabilirsiniz. Bu durumun çok kolay bir çözümü var.

var printContent = document.getElementById('dvPrintContent');
var printWindow = window.open('about:blank', 'print');

printWindow.document.write('<body onload="window.print()">');
printWindow.document.write(printContent.innerHTML);
printWindow.document.write('</body>');
printWindow.document.close();
printWindow.focus();

Burada basit javascipt kullanılmış, Chrome tarayıcısında boş sayfa yazdırma sorununu çözüyor, sayfa yüklendiğinde sayfa kendi kendini yazdırmak için girişimde bulunuyor. Aynı işlem jquery ile daha kolay yoldan halledilebilir, mevcut yapıyı ve eski tarayıcıları da düşünerek böyle oluşturuldu.

Override Wcf Service

WCF servislerini, parametrelerini değiştirerek klasik şekilde override etmemize imkan vermiyor; çünkü bu durumda servisi kullanacak uygulama sözleşmeden yola çıkarak sözleşmelerden birini kabul edip, buna göre parametre dönüleceğini hesaplıyor.

WCF servislerini override edebilmek için sözleşmelerine isim parametresi eklememiz gerekiyor. Aslında arka planda sözleşmeleri farklı isimlerle client’a sunuyor.

[OperationContract(Name = “GetDataWithLastUpdateDate”)]
XmlElement GetCrmData(string sToken, DateTime dLastUpdatedDate);

[OperationContract(Name = “GetDataWithBetweenDates”)]
XmlElement GetCrmData(string sToken, DateTime dStartDate, DateTime dEndDate);

Servis metodlarımız aslında aynı isimde ve override edilmiş olarak çalışsa da kullanırken isim parametresinde belirttiğimiz farklı isimler ile çağrıldıklarından dolayı müşteri (client) tarafında sorunsuz kullanılabiliyor.

Category: WCF

Entity Framework Nedir?

Entity Framework’ün ne anlama geldiğini anlamadan önce “entity” kavramının ne olduğunu anlamamız gerekiyor.
Entity ingilizce; varoluş, ayrı ve bağımsız varlık anlamlarında kullanılmaktadır.
Entity birçok sektörde farklı anlamlarda kullanılmakla birlikte, yazılım alanında entity; bağımsız objeleri temsil etmektedir.

Entity Framework Nedir?
En basit tabiri ile; birbirinden bağımsız objeleri birbiri ile iletişim haline getirmek, bu nesnelerin aralarındaki ilişkiyi yönetmek, şemalar kullanarak bu objeleri oluşturmak veya objeler kullanarak bu şemaları oluşturmak için microsoft tarafından .net framework içerisine entegre edilen bir ad alanıdır.

architecture

İlk olarak 11 ağustos 2008 tarihinde Microsoft tarafından .Net Framework 3.5 içerisinde ve Visual Studio 2008 ile birlikte piyasaya sürülmüştür.

Entity framework ile günümüzde, tablolar kullanarak sınıfları oluşturmak veya sınıfları kullanarak tabloları oluşturmak şeklinde iki ana metod kullanılmaktadır. Microsoft platformlarında “Entity Framework” ile aynı görevi üstlenmek üzere açık kaynak lisansına sahip NHibernate geliştirilmiştir ve yaklaşık altı yıldan fazla zamandır geliştirilmeye devam etmektedir.

Entity framework ile ilgili daha fazla bilgi ve nasıl kullanıldığını öğrenmek için acikakademi.com sitesini ziyaret edebilirsiniz.

Uzun yıllar programlama yapmış ve pratikte istenilen herşeyi yapabilecek, sınırları zorlayabilecek insanlar, teorik testlerde ve sorularda sıkıntı yaşayabiliyor. Bunun en güzel örneğini geçenlerde .Net framework üzerine acikakademi.com adresinde microsoft’un hazırladığı seviye tespit sınavına girerek ve girenlerin yorumlarını okuyarak deneyimledim. Yıllardır sektörün içinde onlarca projeye imza atmış insanların “boyumun ölçüsünü aldım” yorumları ile yalnızlığım biraz da olsa azaldı.

not: artık çevremdeki programlama öğrenmek veya açık kaynak ortamından microsoft platformlarında yazılım geliştirmeye geçmek isteyenlere, döküman veya kitap bulmak yerine acikakademi.com web sitesine yönlendiriyorum.

Dbml to mdf

Projenizde herşey tamam giderken veritabanınız bir şekilde elinizin altından yok oldu ve sadece “linq to sql” database şeması (dbml dosyanız) ile başbaşa kaldınız.

Şemadan tekrar bir “mdf” (mssql şema ve veri dosyası) oluşturmak istiyorsunuz. Bu basit makaleyi benim gibi zor durumda kalanlar için yazdım, back-up almak tabiki en doğru yöntem fakat bazen işler yolunda gitmediği durumlarda bu gibi sorunların altından kalkabilmek için küçük cinlikler yapmak gerekiyor.

Database şemanızda trigger ve varsayılan veri gibi yapı haricinde veriye etki eden unsurlar yok ise projenizin bir yerine aşağıdaki iki satır kod parçasını ekleyerek dbml şemanızdan mdf dosyası oluşturabilirsiniz.

dbDataContext db = new dbDataContext("D:\\deneme\\deneme.mdf");
db.CreateDatabase();

Yukarıdaki dbDataContext projenizde kullandığınız “Linq.DataContext” nesnesi, adını değiştirerek kullanabilirsiniz. Fakat denemelerimden sonra her durumda kullanılamadığını fark ettim. Yukarıda da belirttiğim gibi bazı durumlarda CreateDatabase metodu hata verebilmektedir, basit yapılı veritabanları için şemayı ve ilişkileri geri getirebilmek adına tercih edilmelidir.

Category: C#

C# Razor – Dinamik Excel Oluşturma

Aşağıdaki örnekte “view” dosyamıza gönderilen model içerisindeki veriler ile dinamik olarak excel oluşturma, kaydetmeden kullanıcıya gönderme ele alınmıştır.

Bu işlemin birden fazla yolu olduğu gibi benim bu yolu tercih etmemin ana sebebi, sunucu tarafında fiziksel olarak bir excel dosyası oluşturup göndermenin bant genişliğini ve sunucuyu daha fazla kullanmasından kaynaklanmaktadır.

Dosyayı fiziksel olarak yaratmadan xml şeklinde kullanıcıya göndermek, daha az işlem gücü ve kaynak kullanımı ile yapılabilmektedir.

örnekte C# .Net framework 4 ve mvc 3 yapısı kullanılmıştır.

ExportToExcel.cshtml adını verdiğim View Dosyası

@model acenta.com.Models.TurHesaplasma

@{
   
    Layout = null;
    Response.ContentType = "application/vnd.ms-excel";
    Response.AddHeader("Content-Disposition", "attachment; filename=hesaplasma.xls");


}

<?xml version="1.0" encoding="utf-16"?>
<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
    <Styles>
        <Style ss:ID="s25">
                <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
                <Borders>
                    <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
                </Borders>
                <Interior ss:Color="#FFA500" ss:Pattern="Solid"/>
            </Style>
    </Styles>

    <ss:Worksheet ss:Name="Sheet1">
        <ss:Table>
           
            <ss:Row>
                <ss:Cell><ss:Data ss:Type="String">Tur Adı</ss:Data></ss:Cell>
                <ss:Cell><ss:Data ss:Type="String">@Model.TerminDetay.Tour.name</ss:Data></ss:Cell>
                <ss:Cell></ss:Cell>
                <ss:Cell><ss:Data ss:Type="Number">25</ss:Data></ss:Cell>
            </ss:Row>

            <ss:Row>
                <ss:Cell ss:Formula="=SUM(R[+2]C:R[+52]C)"></Cell>
                <ss:Cell></ss:Cell>
                <ss:Cell></ss:Cell>
                <ss:Cell ss:Formula="=SUM(R[+2]C:R[+52]C)"></Cell>
                <ss:Cell></ss:Cell>
                <ss:Cell></ss:Cell>
                <ss:Cell ss:Formula="=SUM(R[+2]C:R[+52]C)"></Cell>
            </ss:Row>

        </ss:Table>
    </ss:Worksheet>
</ss:Workbook>

Yukarıdaki örnekte mevcut kullanımın tamamına ait kodları paylaşamayacağım için “string”, “numeric” ve “formula” veri tiplerinin kullanımını örnek olarak ekledim.

SUM fonksiyonu excel’in türkçe versiyonunda TOPLA olarak geçmesine rağmen, xml dosyamızı “xls” uzantılı olarak bu formatta gönderdiğimizde fonksiyon otomatik olarak “TOPLA” fonksiyonu işlevi kazanıyor.

“SUM(R[+2]C:R[+52]C)” bu formülde “Row +2 ve Column” yani formulün bulunduğu satırdan iki satır aşağı inerek başla ve sütun aynı kalsın, “Row +52 ve Column” yani 52 satır aşağı ve sütun aynı kalacak şekilde 50 satırlık hücreyi topla.

SUM(RC[+2]:RC[+4]) şeklinde yapsaydık satır aynı kalacaktı, yana doğru iki sütundaki paralel hücreleri toplayacaktı.

Xml tipinde excel üretmenin dezavantajı şu satır ve şu sütuna git ve şunları yaz şeklinde komut kullanmaya imkan tanımaması, eğer bunları yapmak istiyorsanız excel’e çıkartma işlemi için internette çeşitli framework’ler mevcut. (örn: www.codeproject.com/KB/cs/WriteDataToExcel.aspx)

Aynı çalışmanın farklı bir örneği için : http://stackoverflow.com/questions/7417198/export-to-excel-file-in-mvc3-asp-net

Override (C#)

Override metodu kısaca özetlemek gerekirse; bir tipten elde edilen verilerin tipin farklı bir türevinde farklı şekilde verilebilmesidir, overload ile karıştırmamak gerekir. Farklı farklı kullanımları olmakta birlikte aşağıda msdn kütüphanesinde bulunan bir kod örneğini türkçe’ye çevirerek yazdım.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{

    class Program
    {
        public class Calisan
        {
            public string ad;
            public string soyad;

            protected string tcno;
            protected decimal maas;

            // sınıf yaratıldığında değerleri alan constructor
            public Calisan(string ad, string soyad,string tcno, decimal maas)
            {
                this.ad = ad;
                this.soyad = soyad;
                this.tcno = tcno;
                this.maas = maas;
            }

            public virtual decimal MaasHesapla()
            {
                return maas;
            }
        }

        // Calisan türünden yeni bir sınıf türetiyoruz.
        public class SatisCalisani : Calisan
        {
            // maaşı etkileyecek gelir kaynağı
            private decimal SatisPrimi;

            // Constructor
            public SatisCalisani(string ad, string soyad, string tcno, decimal maas, decimal SatisPrimi)
                : base(ad, soyad, tcno, maas)
            {
                this.SatisPrimi = SatisPrimi;
            }

            // MaasHesapla metodu "override" edilerek satış primi eklenir.
            public override decimal MaasHesapla()
            {
                return maas + SatisPrimi;
            }
        }

        static void Main()
        {
            // Birkaç yeni çalışan oluşturalım.
            SatisCalisani calisan1 = new SatisCalisani("Ali","PEKMEZ","36545865511",1000, 200);
            Calisan calisan2 = new Calisan("Baha", "DÖNMEZ", "54235231562", 900);

            Console.WriteLine("Çalışan 1 " + calisan1.ad +
                      " maaasi: " + calisan1.MaasHesapla());
            Console.WriteLine("Çalışan 2 " + calisan2.ad +
                      " maaasi: " + calisan2.MaasHesapla());
        }

       
    }
}
Category: C#

Razor’da Javascipt ile Dinamik Select Ekleme

Aşağıdaki örnekte Controller sayfanızda tanımladığınız SelectList olan ViewData[“OdemeTurleri”], OdemeEkle() fonksiyonu çalıştıkça #odemeler id’sini verdiğiniz tablo yapınıza satır olarak eklenecektir ve aynı zamanda post veya get yöntemi ile ilgili Controller objenize dizi şeklinde gönderimi sağlanacaktır.

Bu örnekte OdemeEkle() fonksiyonunu bir butonun “OnClick” özelliğine yazarak gönderilecek formumuza belirlediğimiz ödeme seçeneklerinden sınırsız sayıda eklenebilmesini sağladım.

Tip : Controller kısmına düşen verileri database’e yazmadan önce aynı türe sahip ödemelerin tutarlarını toplayarak database’e yazabilirsiniz.

<script type="text/javascript">

var numrows = 0;

function OdemeEkle() {
        var text = '@foreach (SelectListItem item in (SelectList)ViewData["OdemeTurleri"]){ <option value="@item.Value">@item.Text</option>}';

        $("#odemeler").append('<tr><td><select name="odeme[' + numrows + '].odeme_id">' + text + '</select></td><td><input type="text" name="odeme[' + numrows + '].tutar"></td><td></td></tr>');

        numrows = numrows + 1;
    }

</script>
Category: C#