9 Temmuz 2018 Pazartesi

SQL Server - Satırları Birleştirme

Merhaba, 
Bu yazımda sql server'da birden çok satırı birleştirip tek satır yapmayı anlatacağım. Senaryomuz şu şekilde olsun mesela; bir faturamız var ve bunun detayları mevcut. Başlık ve detaylar ayrı tablolarda tutuluyor. Biz şimdi kdv oranlarına göre detaydaki stok adlarını tek bir satır yapacağız. İnternet de arama yaptığınız da değişik yöntemler çıkacaktır karşınıza. XML oluşturarak da yapılabilmektedir ama biz burada fonksiyon ile yapacağız. Bizim KDV beyannameleri gönderimi esnasında başımıza gelen bir olaydı ve bu şekilde çözüme ulaştık. 

SQL Server'da işlem yapacağımız veritabanına tıklıyoruz ve Programmability>Functions>Scalar-valued Functions yolunu izliyoruz. Sağ tıklayıp New Scalar-valued Functions diyoruz. Karşımıza aşağıdaki gibi bir sayfa geliyor.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION <Scalar_Function_Name, sysname, FunctionName>
(
       -- Dışarıdan aldığımız parametreler
       <@Param1, sysname, @p1> <Data_Type_For_Param1, , int>
)
RETURNS <Function_Data_Type, ,int>
AS
BEGIN
       -- Geri dönüş değerimiz
       DECLARE <@ResultVar, sysname, @Result> <Function_Data_Type, ,int> 
       -- SQL Sorgumuz
       SELECT <@ResultVar, sysname, @Result> = <@Param1, sysname, @p1> 
       -- Dönüş değişkenlerimiz.
       RETURN <@ResultVar, sysname, @Result>
END

GO

Bahsettiğimiz senaryomuzun kodları aşağıdaki gibidir. (örnek olması maksatıyla)

USE [VERITABANI_ISMI]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/****** GetDetay bizim fonksiyonumuzun adıdır. ******/
ALTER FUNCTION [dbo].[GetDetay]
(
    @fid int,
    @KDV int
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @detaylar Nvarchar(MAX)

    SELECT @detaylar = COALESCE(@detaylar + ', ', '') + ISNULL(D.FATURADETAY_STOKADI,'')
    FROM VT_FATURADETAY D WHERE D.FATURADETAY_FISID=@fid AND D.FATURADETAY_KDV=@KDV

    RETURN @detaylar

END

Daha sonra ise sağ tıklayıp Execute diyoruz. Böylelikle fonksiyonumuz kaydetilmiş oluyor. Siz buradaki SQL sorgusunu istediğiniz gibi geliştirebilirsiniz. Group By, Order By, Sum(), Avg() vs. vs. vs.

Şimdi ise gelelim bu fonksiyonu nasıl kullanacağız. Sql Management Studio üzerinden erişmek istediğiniz de ilk başta fonksiyonu tanımayacaktır. Management Studio'yu yeniden başlatırsanız düzelecektir. Örnek olması amacıyla çok basit bir sorgu yazdım. Bu faturanın normalde 5 adet detayı vardır.

SELECT B.FATURABASLIK_CARINO AS CARINO, B.FATURABASLIK_CARIADI AS CARIADI,
dbo.GetDetay(B.FATURABASLIK_FISID, D.FATURADETAY_KDV) AS STOKADLARID.FATURADETAY_KDV AS KDV,
SUM(D.FATURADETAY_MIKTAR) AS TOP_MIKTAR, SUM(D.FATURADETAY_TUTAR) AS TUTAR
FROM VT_FATURABASLIK B INNER JOIN VT_FATURADETAY D
ON B.FATURABASLIK_SIRKETID=D.FATURADETAY_SIRKETID
AND B.FATURABASLIK_FISID=D.FATURADETAY_FISID
WHERE B.FATURABASLIK_SIRKETID=11 AND B.FATURABASLIK_FISID=1101055
GROUP BY B.FATURABASLIK_CARINO, B.FATURABASLIK_CARIADIB.FATURABASLIK_FISID, D.FATURADETAY_KDV

Ama bu fonksiyonumuz ile tek satırda tüm stokları kdv'lerine göre gruplu toplamları ile birlikte görebilmekteyiz. 

Herkese İyi Çalışmalar.

4 Temmuz 2018 Çarşamba

SQL Server Row_Number Komutu ve 2 Tablo Arasında Update İşlemi

Merhabalar,

Bu notumda ROW_NUMBER() komutundan bahsedeceğim ve daha sonrasında ise iki tablo arasında nasıl güncelleme yaparız ondan bahsedeceğim.

Öncelikle kısaca RIGHT komutundan bahsedeceğim. Bildiğiniz üzere RIGHT() ve LEFT() komutu string ifadelerde baştan veya sonra kaç karakter belirtir isek o kadarlık kısmını kesip alıyor. Örnek vermek gerekirse:

SELECT RIGHT('İlyas', 3) as DENEME ===> yas
SELECT LEFT('İlyas', 4) as DENEME ===> İlya

Burada ilk sorguda right komutu ile sonran 3 karakter almak istediğimizi belirtiyoruz. Şimdi gelelim right komutu ile Row_Number komutunu birlikte nasıl kullanacağız. 

SELECT '120.01.' + RIGHT('000' + CONVERT(nvarchar, (ROW_NUMBER() OVER (ORDER BY ACTNAME))), 4) AS YENI_NO
FROM ACT
WHERE ACTNO LIKE '120%'

Buradaki senaryomuz şu şekilde. Şirketde yapmış olduğumuz bir işlemin küçük bir kısmı. Cari kartlarımızdan 120 ile başlayanların listeliyoruz. Bunların başına 120.01. ekliyoruz. Daha sonra ise 3 adet 000 koyuyoruz ve satır numaralarını yazmaya başlıyoruz. İlk başta 9a kadar sorun 0001, 0002, ....., 0009 şeklinde sonrasında ise 00010, 00011,....00099 şeklinde devam ediyor fakat biz sondan 4 haneyi al dediğimiz için 0010,....0099 şeklinde alıyor. Bu işlem 0999,....., 9998 şeklinde devam edip 9999 olduğunda bitiyor. Daha sonra güncelleme yada yeni kayıt ekleme gibi ne tür işlem yapacaksanız ve kayıt sayınıza göre hane sayısını artırıp azaltabilirsiniz yada noktadan sonra kaç karakter istiyorsanız ona göre düzenleyebilirsiniz.

Şimdi ise ikinci konumuza gelelim. Birbiri ile bağlantılı iki tablo arasında güncelleme işlemi yapacaksak kullanmamız gereken kod aşağıdaki gibidir: 

UPDATE T1
SET T1.BIRIM111= T2.BIRIM222
FROM TABLO_1 T1 JOIN TABLO_2 T2
       ON T1.ID = T2.ID

Burada Tablo_1'i güncelliyoruz. Tablo_1 ve Tablo_2'deki kayıtları eşleştiriyoruz ve Tablo_2'deki BIRIM222 sütunundaki bilgiyi Tablo_1'deki BIRIM111 alanına atıyoruz.

Herkese İyi Çalışmalar.

27 Haziran 2018 Çarşamba

Excel Çalışma Kitabını Paylaştırma

Merhaba,
Bu yazımda yazılım dışında bir konuya değineceğim. İşim gereği sistem, network, donanım, yazılım hepsiyle ilgileniyorum. Nerede sorun çıkacağı belli olmuyor. 

Şirket içerisinde ağdaki dosyalarımızdan aynı anda kullanmamız gereken dosyalar olabilir. Bu olay excel 2010, 2013 kullanan kullanıcılar da biraz daha kolay. 
Bunun için menü kısmından Gözden Geçir sekmesinden Çalışma Kitabını Paylaş diyoruz. Karşımıza gelen pencereden "Aynı andan birden fazla kullanıcının değişiklik yapmasına izin ver...." kutucuğu işaretliyoruz. Daha sonrasında dosyamızı kaydettikten sonra birden fazla kullanıcı kullanabilir. 

Office 2010 ve 2013de bu şekilde yaparken 2016 ve 365 sürümünde ise bu özellik pasif olarak gelmektedir. Peki bunu nasıl düzeltebiliriz. Bu butonları iki farklı şekilde gösterebiliriz excelimizde. İsteyen hızlı erişim çubuğunda isteyen ise normal menü bölümünde gösterebilir. Ben şimdi Menü bölümüne eklemeyi anlatacağım. İlk olarak Dosya>Seçenekler>Şeridi Özelleştir bölümüne geliyoruz. Komutlardan seçim yapın bölümünden Tüm Komutlar diyoruz. Sağdaki listemizden ise Gözden Geçir sekmesini seçiyoruz ve Yeni Grup diyerek bir grup oluşturuyoruz. Ben Paylaştırma dedim grubumun adına, siz istediğiniz ismi verebilirsiniz. Bu yeni grubumuzu mouse ile seçiyoruz ve soldaki tüm komutları listelediğimiz listeden;

- Çalışma Kitabını Paylaş (Eski)
- Değişiklikleri izle (Eski)
- Paylaşımı Koru (Eski)
- Çalışma Kitaplarını Karşılaştır ve Birleştir

komutlarını tek tek seçip ekle diyoruz. Bu seçtiğimiz komutların sağdaki listede yeni açtığımız grubun altında görünüyor olması lazım. Resimde görebilirsiniz.




Tamam deyip kapatıyoruz pencereyi. Şimdi menü kısmında Gözden Geçir sekmesine geldiğimizde yeni grubumuzu ve yeni eklemiş olduğumuz komutları göreceğiz. Buradan Çalışma Kitabını Paylaş (Eski) butonuna tıklıyoruz. Karşımıza çıkan pencereden "Yeni birlikte yazma deneyimi yerine eski paylaşılan çalışma kitaplarını özelliğini kullan" kutucuğunu işaretliyoruz. Artık office 2016 ve 365 sürümlerinde de çalışma kitabını paylaşabiliririz.

Herkese İyi Çalışmalar.

16 Mayıs 2018 Çarşamba

Asp.Net Datalist - Koşullu Renklendirme

Merhabalar,

Şimdi ise datalist üzerinde basit bir işlem daha gerçekleştireceğiz. senaryomuz şu şekilde: diyelim ki iki tarih arasındaki faturaları listeledik ve mahsup edilenleri yeşil mahsup edilmeyenleri ise kırmızı renkli görmek istiyoruz. Bunun için öncelikle kıyaslama yapacağımız sütunu bir değişkene atıyoruz. Tabloda görülmeyecek bir değişken ise visible'ını false yapınız. 
Yine datalist'imizin ItemDataBound event'ine kodlarımızı yazıyoruz.

if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
    if (((Label)e.Item.FindControl("LBLmahsup")).Text == "True")
        ((Label)e.Item.FindControl("LBLcariadi")).ForeColor = System.Drawing.Color.Green;
    else
        ((Label)e.Item.FindControl("LBLcariadi")).ForeColor = System.Drawing.Color.Red;
}

Bunun dışında ise tasarım tarafında da ayarlama yapabiliriz.

<asp:Label ID="LBLcariadi" runat="server" Text='<%#Eval("CARIADI") %>'
           ForeColor='<%#Eval("DURUM").ToString()=="2"?                                                          System.Drawing.Color.Green:System.Drawing.Color.Red %>'></asp:Label>

Buradaki kodumuz da ise durum sütununda 2 olanları yeşil renkli diğerlerini ise 3 kırmızı renkli yap diyoruz..

Bunun dışında sadece 2 koşul için değil daha fazla koşul içinde kullanabiliriz  Renk özelliğinin yanı sıra cssclass özelliğinde de kullanabiliriz. Diyelim ki listemizdeki taleplerin öncelik durumu olsun, bunlar da normal, acil ve çok acil olmak üzere 3 çeşit olsun. Öncelik tipi normal olanlar yeşil, acil olanlar sarı, çok aciller ise kırmızı listelensin. Burada css verirken bootstrap'ın css'lerini kullanıyorum. Ayrıca text özelliğinde de durumu aktif ise check işaret, değilse x işareti koyuyor.

<asp:Label ID="LBLdurum" runat="server" 
Text='<%#Eval("Durum").ToString()=="Aktif"?"&check;":" X "  %>'
CssClass='<%#Eval("Durum").ToString()=="Aktif"?"label label-success":"label label-danger" %>'></asp:Label>

Bu mantıktan yola çıkarak bu koşullandırmayı; tasarım tarafında datalist, gridview vb  veri listeleme araçları içinde çeşitli yerlerde kullanabilirsiniz.

Herkese İyi Çalışmalar

15 Mayıs 2018 Salı

Asp.Net Datalist - Alt Toplam

Merhabalar,

Datalist kontrolünü esnekliğinden ve istediğim gibi kullanabilmemden dolayı seviyorum. Şimdi datalist kontrolünde alt toplamı nasıl elde edeceğimizden bahsedeceğim kısaca. 

Projemizde gerekli tasarımları yaptıktan sonra Datalist'in footerTemplate etiketinin altına bir adet toplamı göstereceğimiz bir adet Label ekliyoruz.


<asp:Label ID="LBLmatrah" runat="server" Text="0"></asp:Label>

Şimdi ise Bu Label'a toplamı yazağımız koda gelelim. Datalist'in ItemDataBound eventine gidiyoruz. 


if (e.Item.ItemType == ListItemType.Footer)
{
    if (dsetbaslik.Tables[0].Rows.Count > 0)
    {
           ((Label)e.Item.FindControl("LBLmatrah")).Text = 
       string.Format("{0:N}", Convert.ToDouble(dsetbaslik.Tables[0].Compute("Sum(MATRAH)", "MATRAH >= 0").ToString()));
    }
}

Şimdi burada dikkat etmemiz gereken noktalar: 

  • Öncelike dataset'imiz global tanımlandığı için buradan rahatlıkla verilerimize erişebiliyoruz.
  • İlk olarak LBLMatrah değişkenimiz footer alanında olduğu için if ile kontrol ediyoruz. Sonra herhangi bir hata almamak için ilk önce gelen satır sayımız 0'dan büyük mü diye kontrol ediyoruz. 
  • Sum kodunun yanındaki değişkenimiz ise bizim verileri çektiğimizde toplamını alacağımız sütunun adıdır.
  • MATRAH>=0 kısmı ise koşulumuzdur. Ben burada 0 ve 0'dan büyük olanların hepsini topla dedim. Eğer siz isterseniz bu 0'ı değiştirerek belli bir değerin üzerindekileri toplayabilirsiniz.
Şimdi ise gelelim koşullu toplam yapacak olursa nasıl yapacağız. Diyelim ki faturalarımızı listeledik. Satış ve satınalma iadeleri SATIŞ, satınalma ve satış iadeleri ise ALIŞ diye etiketlediğimizi varsayalım. Ben sadece etiketi satış olanları toplamak istiyorum. Bunun için dataset'den "AL_SAT" sütunu SATIŞ olanları bul ve matrahı 5000 TL ve üzerinde olanları topla diyorum. 

string satis = (dsetDetay.Tables[0].AsEnumerable()
                                   .Where(r => r.Field<string>("AL_SAT") == "SATIS")
                                   .AsDataView()
                                   .ToTable()
                                   .Compute("SUM(MATRAH)", "SUM(MATRAH) >= 5000"))
                                   .ToString();

Bu koşullu toplamayı union ile iki veya daha fazla sorguyu birleştirdiğiniz zaman da kullanabiliriz, ama o zaman tip diye birer sütun oluşturacağız. Diyeceğiz ki : ilk sorguda tip alanı tip1, uniondan sonraki ikinci sorguda tip2 diyeceğiz. Sonra da toplama işleminde where koşulunun olduğu yere hangisinin toplamını istiyorsak onu yazacağız.

Herkese İyi Çalışmalar

14 Mayıs 2018 Pazartesi

Yeniden Dönüş

Merhabalar,

Yaklaşık 5 yıldır ara verdiğim not defterime tekrardan yazmaya başlıyorum. Haziran 2013'de Pamukkale Üniversitesi Bilgisayar Mühendisliği bölümünden mezun oldum. Sonrasında askerliğimi yaptım. Şu anda  Şubat 2015'de çalışmaya başladığım özel bir tekstil firmada yazılım, program destek, donanım, network vb konularda çalışmaktayım. İşe başladıktan sonra anladım ki okul ile iş hayatının hiç bir alakası yok :) Öğrencilik zamanınızda ne kadar kendinizi geliştirirseniz o kadar rahat başlarsınız iş hayatına. Ben onun zorluğumu çektim.

Bundan sonra blogumda yazılım, donanım, network vb. konularda notlar tutacağım. Umarım sizler de işinize yarar bilgiler bulabilirsiniz.

Herkese İyi Günler

SQL Server - Satırları Birleştirme

Merhaba,  Bu yazımda sql server'da birden çok satırı birleştirip tek satır yapmayı anlatacağım. Senaryomuz şu şekilde olsun mesela; bir...