none
veri tabanı tablolar arası toplama çıkartma RRS feed

  • Soru

  • Hayırlı günler;

    Öncelikle üç gündür araştırdığımı bilmenizi isterim ama üstesinden gelemedim.

    SQL EXPRESS kullanıyorum, asp.net ile local yayın yapıyorum, veri tabanı adım "veritabani",

    3 tablom var

    byh_boya_kalan_tbl " id, marka, renkkodu, renkadi

    byh_boya_giris_tbl" id, marka, renkkodu renkadi,tarih,

    byh_boya_kullanim_tbl" id, marka, renkkodu renkadi,tarih,

    gelen ürünleri gelen tablosuna kaydediyorum, kullanılan ürünleri kullanılan tablosuna kaydediyorum ve bunları gridview de gösteriyorum. 3 gridview 3 ayrı sayfada, gelen,kullanim kalan. 

    kalan tablosunda renk adlarının tek, kilonun gelen-kullanim=kalan olarak kaydedilmesi

    kalan tablosunu yapamıyorum. sizlerden kod olarak yardım istiyorum mümkünse. mantığı oturtamadım bir türlü.

    Not: şimdilik renk adını textbox ile giriyorum ama vt deki byh_renklistesi_tbl aktif ettiğimde textbox yerine combobox kulanacağım, renk adlarının yanlış yazılmaması için. Listeyi aktif ettiğimde renkadi yerine id kullanacağım.

    kayıt butonu kodum.

    protected void Button8_Click(object sender, EventArgs e)
        {
            if (Page.IsValid)
            {           
                SqlCommand komut;
                SqlConnection baglanti = new SqlConnection(ConfigurationManager.ConnectionStrings["connect"].ToString());
                
                //try
                //{
                    komut = new SqlCommand("INSERT INTO byh_boya_giris_tbl (marka,renkkodu,renkadi,kilo,tarih) VALUES(@marka, @renkkodu,@renkadi,@kilo,@tarih)", baglanti);            
                    komut.Parameters.AddWithValue("@marka", TextBox1.Text);
                    komut.Parameters.AddWithValue("@renkkodu", TextBox2.Text);
                    komut.Parameters.AddWithValue("@renkadi", TextBox3.Text);
                    komut.Parameters.AddWithValue("@kilo", TextBox4.Text);
                    komut.Parameters.AddWithValue("@tarih", DateTime.Now.ToString("dd/MM/yyyy"));
                    baglanti.Open();
                    komut.ExecuteNonQuery();
                //LblMesaj.Text = "Kayıt Eklendi";
                Response.Redirect("byh_gelen.aspx");
    
                //}
                //catch
                //{
                //    //LblMesaj.Text = "Hata oluştu, kaydedilemedi.";
                //}
                //finally
                //{
                baglanti.Close();
                //}
            }
        }

    Yardımlarınız ve tavsiyeleriniz için şimdiden teşekkür ederim.




    13 Şubat 2018 Salı 09:07

Yanıtlar

  • Ürün giriş , Ürün Çıkış , Ürün Stok olarak 3 tablo kullanabilirsin ve hepsine tarih ekleyerek günlük takip yapabilirsin

    Neden? Verilen diğer cevapları okumayanlar için terar soruyorum. Tek bir tabloya hiç bir join vs. olmadan sorgu atmak varken bir sürü tablo ile iş yapmak neden? 

    Id, UrunId, Miktar, Tarih, Yon   şeklinde kolonlar açarsın (Miktar negatif pozitif de tutulabilir, fakat bu tercih sistemin analizine göre yapılmalıdır). Urun e göre filrelersen istersen yürüyen bakiye bile kolayca yazabilirsin. Ya da ürün e göre gruplayıp stokları direkt elde edebilirsin. Stok diye bir tablo olması ancak ve ancak özel durumlarda performans için yaptığımız tehlikeli cambazlıklardan birisi, normalde veri bütünlüğünü tehlikeye attığı için yapmamak gerekir.

    Bir de kodlama konusunda biraz fazla acele ediyorsunuz. Lütfen, biraz teorik bilgi okuyun ve açık kaynak gibi nimetlerden yararlanıp uzmanlar bu işleri nasıl yapıyor araştırın. Aksi durumda düğme arkasından veritabanına erişmek gibi kötü alışkanlıklar kazanıyorsunuz.


    www.cihanyakar.com




    • Düzenleyen Cihan YakarMVP 13 Şubat 2018 Salı 12:43
    • Yanıt Önerisini Geri Alan ÖmürTokman 21 Şubat 2018 Çarşamba 08:52
    • Yanıt Olarak İşaretleyen ÖmürTokman 22 Şubat 2018 Perşembe 15:30
    13 Şubat 2018 Salı 12:39

Tüm Yanıtlar

  • Fakat bu yapmaya çalıştığınız ne kadar doğru? Bunu tek bir hareket tablosu ile yapıyor olmanız daha kolay olurdu. Bu durumda her işlemde 2 sorgu atmanız ve bunları transaction içine koymanız gerekecek. Bu bir yanlışsa bundan dönmek daha mantıklı olacaktır.

    www.cihanyakar.com

    13 Şubat 2018 Salı 11:16
  • Açıkçası kafam bu kadar basıyor :(  bu işin bir standartı var mıdır bilmiyorum.

    Biraz daha detaylandırabilir misiniz.

    gelen,giden kalan tek bir tabloda mı olmalı

    ben kafamda şöyle canlandırmıştım, bir üründen haftada veya günde bir kaç tane gelebiliyor hangi gün kaç tane gelmiş, hangi gün kaç tane kullanılmış, kalanda gün önemli değil elimde ne kadar var gibi.

    13 Şubat 2018 Salı 11:42
  • Ürün giriş , Ürün Çıkış , Ürün Stok olarak 3 tablo kullanabilirsin ve hepsine tarih ekleyerek günlük takip yapabilirsin

    Neden? Verilen diğer cevapları okumayanlar için terar soruyorum. Tek bir tabloya hiç bir join vs. olmadan sorgu atmak varken bir sürü tablo ile iş yapmak neden? 

    Id, UrunId, Miktar, Tarih, Yon   şeklinde kolonlar açarsın (Miktar negatif pozitif de tutulabilir, fakat bu tercih sistemin analizine göre yapılmalıdır). Urun e göre filrelersen istersen yürüyen bakiye bile kolayca yazabilirsin. Ya da ürün e göre gruplayıp stokları direkt elde edebilirsin. Stok diye bir tablo olması ancak ve ancak özel durumlarda performans için yaptığımız tehlikeli cambazlıklardan birisi, normalde veri bütünlüğünü tehlikeye attığı için yapmamak gerekir.

    Bir de kodlama konusunda biraz fazla acele ediyorsunuz. Lütfen, biraz teorik bilgi okuyun ve açık kaynak gibi nimetlerden yararlanıp uzmanlar bu işleri nasıl yapıyor araştırın. Aksi durumda düğme arkasından veritabanına erişmek gibi kötü alışkanlıklar kazanıyorsunuz.


    www.cihanyakar.com




    • Düzenleyen Cihan YakarMVP 13 Şubat 2018 Salı 12:43
    • Yanıt Önerisini Geri Alan ÖmürTokman 21 Şubat 2018 Çarşamba 08:52
    • Yanıt Olarak İşaretleyen ÖmürTokman 22 Şubat 2018 Perşembe 15:30
    13 Şubat 2018 Salı 12:39
  • Cihan hocam teşekkür ederim.

    açık kaynaklı kodlardan yararlanamayacak kadar gerideyim diye düşünüyorum en azından şimdilik. (bilemiyorum)

    işi amatör (hobi) olarak yapınca profesyonellerden pek kaynak bulunmuyor. genelde ödev ve eğitim maksatlı olunca programlar standart ın dışına çıkmıyor. yada benim araştırma usulüm hatalı. bir de benim gibi kapasite sınırlıysa :) ortaya böyle sorular çıkıyor.

    Not "Aksi durumda düğme arkasından veri tabanına erişmek gibi kötü alışkanlıklar kazanıyorsunuz."

    bu tam beni anlatıyor herhalde :)

    3 tabloda ısrar edicem "diyemiyorum" bilenler konuşunca bilmeyene susmak düşer.

    " Tek bir tabloya hiç bir join vs. olmadan sorgu atmak varken bir sürü tablo ile iş yapmak neden? " 

    tek bir tablo girişler ve çıkışları gün gün girdim, giriş ve çıkışları da filitreliyerek gördüm, kalanıda yine aynı tabloda filitreliyerek mi görücem.


    13 Şubat 2018 Salı 13:13
  • Cihan bey şöyle bir durum var tek tabloda tutup hesaplama yerine ayrı bir tabloda tutup trigger ile giriş veya çıkış durumuna göre değer artıtıp ya da eksiltmek de mantıklı bir durum değil mi?
    13 Şubat 2018 Salı 13:15
  • Cihan bey şöyle bir durum var tek tabloda tutup hesaplama yerine ayrı bir tabloda tutup trigger ile giriş veya çıkış durumuna göre değer artıtıp ya da eksiltmek de mantıklı bir durum değil mi?

    Stok durumundan bahsediyorsunuz sanırım, bunun gerekliğine uygulamanın analizinde veya yük altındaki davranışlarına göre karar vermek gerekir.

    Veritabanı tarafında en can sıkıcı işler eş zamanlılık durumunda yaşanır. Şimdi varsayalım ki bir stok tablosu oluşturdunuz ve giriş-çıkış a göre triggerla değişiklik yapacaksınız.

    Bir giriş oldu, bu durumda öncelikle stok tablosunda o ürün var mı diye bakmanız gerekeceğinden bir SELECT attınız. Varlık veya yokluk durumuna göre de INSERT veya UPDATE attınız. Veya bu üçünü tek bir MERGE sözcüğü ile yazdınız.  Tabi bunları yaptığınız için Stok tablonuza da otomatik veya seçtiğiniz kilitler atıldı (rowlock,uplock vs). Bu sebeple giriiş, çıkış tablolarınıza bir önceki işlem bitmeden yeni eklemeler yapılamıyor olacak (uygulamanın kayıt alma performansı düştü). Halbuki tek tablo olsaydı yazma sırasında sadece indexlerden yaşanan bir bekleme olacaktı. Şimdi ise stok tablonuz yüzünden bir bekleme yaşanıyor. 

    Yine giriş tablosunda ve çıkış tablonuzda manuel bir değişiklik oldu ve trigger tetiklenmemiş oldu. Bu durumda stok tablosundaki değerler ile veri arasıda uyuşmazlık olacaktır. 

    Yani kayıt işlemleri mi daha yoğun yoksa okuma işlemleri mi daha yoğun olacağına göre işler değişip duracak. MSSQL kümeleme fonksiyonlarını oldukça hızlı yapabildiği için ben tek tabloda ısrar ederdim. Stokları görmek için bir indexed view oluştururdum. Stokları hızlı getirmek içinde son hareket numarasına göre bir cache oluştururdum. Böylece hareketlerde değişiklik olmadığı sürece geçici tablodaki verileri sunardım.

    Yinede giriş-çıkış ı ayrı tablolarda tutmak gerekebilir. Yazılımda tek bir genel geçer doğru yok. Uygulamanın ne yapacağına göre işler çok değişiyor.


    www.cihanyakar.com



    13 Şubat 2018 Salı 14:15
  • Hepinizden Allah razı olsun.

    sonuc yine başa döndüm galiba :)

    giriş ve çıkışları kaydede biliyorum ama kalan tablosunu oluşturamıyorum, benim tablom da en fazla 1000 satır olur kalan tablosunu oluşturma için nasıl bir kod yazmalıyım.

    13 Şubat 2018 Salı 14:28
  • Özet. Kalan tablosuna ihtiyacınız yok. Kalan View'i yapmalısınız.

    www.cihanyakar.com

    13 Şubat 2018 Salı 15:00
  • Bu beni aşan bi konu farkındayım.

    Kalan view nasıl yaparım, eğer imkanınız varsa kod olarak verebilir misiniz Cihan hocam.

    Ayrıca uğraşınız için Allah razı olsun.

    13 Şubat 2018 Salı 15:11
  • Bir yere kadar geldim

    aşağıdaki kodda şöyle bir sorun var

    "incomming_tbl.kilo (12 + 3 + 5)" - "outgoing_tbl.kilo (2 + 2)" = 16 ancak  sonucu = 18 sonucu yanlış. 

    Nerede hata yapıyorum acaba.

    SqlDataSource1.SelectCommand = "SELECT Incomming_tbl.colorName,((SUM(DISTINCT Incomming_tbl.kilo)) - (SUM(DISTINCT OutGoing_tbl.kilo))) AS kilo
    FROM Incomming_tbl AS Incomming_tbl 
    LEFT JOIN OutGoing_tbl AS OutGoing_tbl ON OutGoing_tbl.colorName = Incomming_tbl.colorName 
    GROUP BY Incomming_tbl.colorName,OutGoing_tbl.colorName";

    21 Şubat 2018 Çarşamba 06:35