none
Vakti olan bu soruna baksın biraz karışık bir sorun.. :) RRS feed

  • Soru

  • Merhaba arkadaşlar. Benim biraz büyük ve karmaşık bir sorunum var günlerdir uğraşıyorum ama sorunumu google nasıl anlatacağımı beceremediğim için faydalı bir şey bulamadım. Sizlere anlatayım inşallah yardımcı olabilirsiniz. Baştan belirteyim yardımcı olmak isteyen olursa sorunu daha detaylı bir şekilde açıklayabilirim..

    Bir mağaza yönetimi düşünün. Bu mağazada;

    - Ürün tipleri

    -Markalar  

    -Modeller var.

    Ürün Tipleri Table da : A , B , C Tipi

    Marka Table da : 1.Marka, 2.Marka, 3.Marka, 4.Marka, 5.Marka

    Model Table da : X, Y, Z , Q , W,K,L,M

    Olsun.

    Hangi Ürün Tipi hangi markaya hangi markada hangi modele bağlı olduğuna gelirsek

    A Tipinde   1.Marka, 2. Marka

    B Tipinde 3.Marka

    C Tipinde ise 4.marka ve 5.marka var.

    1.Marka X,Y

    2.Marka Z

    3.Marka Q,W

    4.Marka K

    5.Marka L,M

    Şimdi kullanıcı geliyor herhangi bir ürün tipini ona bağlı olan markayı ve sonrasında modeli girerek stok girişi yapıyor. Ve bunlar ayrı bir database de tutuluyor.

    Ben istiyorum ki Hangi ürüntipinin markasının modelinden kaç adet satılmış.

    Örneğin  A tipindeki 2. Markanın Z modelinden kaç adet satılmış.

    Ben bunu Yeni bir database oluşturarak gridviewde nasıl gösterebilirim ?

    Tek  önemli nokta var

    Heran yeni bir ürün tipi, marka veya model eklenebilir. Dolayısıyla dinamik bir yapısı olması gerekiyor.

    Ben bunu for döngüleriyle yapmaya çalıştım ama yapamadım. Biliyorum çok karışık bir şey ama yardımcı olursanız çok sevinirim..

    15 Ocak 2014 Çarşamba 16:19

Yanıtlar

  • Ben coktan cevabini yazdim. Alan adlarini kendine gore degistir.

    Not: Cevap verenlere de yardimci olmak istiyorsan, verilerini boyle resim olarak vermek yerine kod olarak ver. Ornegin:

    create table Urun (uruntipi_id int identity primary key not null, uruntipi_adi varchar(50))
    insert into Urun (uruntipi_id, uruntipi_adi) values (16, "Ortam Denetleme Sistemleri")
    insert into Urun (uruntipi_id, uruntipi_adi) values (17, "IP Kamera")
    ....

    gibi.

    • Yanıt Olarak İşaretleyen Ömer Birekul 20 Ocak 2014 Pazartesi 11:06
    20 Ocak 2014 Pazartesi 10:58

Tüm Yanıtlar

  • Şimdi çok karışık bir şey değil bu... senin istediğin bir sorgu sadece. Ama ilk önce bir veritabanını oluştur bakalım ortaya ne çıkacak ondan sonra o sorguyu yazarız. çok zor bir şey değil...

    İyi Çalışmalar. Cihangir SUR [cihangirsur@hotmail.com]

    15 Ocak 2014 Çarşamba 16:46
    Yanıtlayıcı
  • Öncelikle ilginiz için teşekkür ederim. Zaten veritabanım mevcut kafa karışıklığına sebep olmamak için burda real bir örnek vermedim.

    Cihan bey aşağıda resimde gördüğünüz database gerçektir. Görüldüğü gibi tablo lar birbirlerine bağlı.

    Eğer yardımcı olabilirseniz valla çok sevinirim günlerimi aldı bu iş :)

    15 Ocak 2014 Çarşamba 17:08
  • Şimdi ben yanlışmı görüyorum yoksa sen bunların her birisine database mi oluşturdun yoksa bunlar birer table mı ?

    İyi Çalışmalar. Cihangir SUR [cihangirsur@hotmail.com]

    15 Ocak 2014 Çarşamba 17:12
    Yanıtlayıcı
  • afedersiniz table yazacaktım..
    15 Ocak 2014 Çarşamba 17:14
  • bu arada kendi yapamadığımıda paylaşmak istedim :) Eminim çok gülüç durumdayımdır şuan.. Ama öğrenirken bu aşamalardan geçmek gerekiyor ne yazık ki..

    15 Ocak 2014 Çarşamba 17:18
  • Yok gülünç duruma düşen insanlar da var burada ama sen düşmezsin merak etme. Sen hiç değil bir şeyler yapıyorsun. Onlar genelde soru sormuyorlar. Direkt projeyi yaptırmaya geliyorlar zaten ağızlarının paylarınıda alıyorlar benden yana...

    Ömer yapman gereken inner join sorgusu kullanmak. Sana bir örnek aşağıda yazıyorum. Yani iki tabloyu birleştirmen gerekli.

    select * from Marka as M inner join Model as MO
    on M.marka_Id = MO.marka_Id
    where M.Marka = 'BİR SENS'

    Bu sorguyu sen kendine göre düzenleyerek kullan bakalım ;)


    İyi Çalışmalar. Cihangir SUR [cihangirsur@hotmail.com]


    • Düzenleyen ChngrSrEditor 15 Ocak 2014 Çarşamba 17:29 düzenleme
    15 Ocak 2014 Çarşamba 17:28
    Yanıtlayıcı
  • Yalnız ben dinamik bir yapı olsun istiyorum. yani bu kodları yazdıktan sonra yeni bir marka model eklendiği zaman onlarında adeti görünsün istiyorum. İNNER join ile bu mümkün olur mu ?

    Ayrıca sizin yukarıda yazdığınız kod tam olarak ne yapıyor

    15 Ocak 2014 Çarşamba 17:36
  • Tabii ki hiç fark etmez bu kod sana hangi markayı verirsen ona ait modelleri getirir sana veya bunu şöyle yazalım. ID olarak çekelim

    select * from Marka as M inner join Model as MO
    on M.marka_Id = MO.marka_Id
    where M.marka_Id = 11

    bu sana marka id si 11 olan markanın bütün modellerini getirir. İnner join i internetten biraz araştırırsan daha iiyi anlarsın ;)


    İyi Çalışmalar. Cihangir SUR [cihangirsur@hotmail.com]

    15 Ocak 2014 Çarşamba 17:48
    Yanıtlayıcı
  • iyide benim tam olarak istediğim bu değilki :) 

    bunları bir arada getirtmeyi biliyorum zaten bunu sql arayüzünden kod yazmadan yapabiliyoruz. benim istediğim. hangi modelden kaç adet var.

    mesela Ortam Denetleme BİRSENS 5020 den 5 tane var bunu sql de adet kolonu oluşturmadan dinamik olarak yapmak istiyorum

    15 Ocak 2014 Çarşamba 17:53
  • Omer,

    Soyledigin sey aslinda karisik degil basit. Ancak senin tablo yapilarinin elden gecmesi gerekiyor oncelikle. Model tablosuna Marka_ID koyamazsin. Eger koyarsan otomatikman o modellerin her birisinin o markaya ozgu oldugunu soylemis olursun. Ornegin 1.000 SMS icin Marka_ID 15, yani Turkcell. Oysa baska bir GSM sirketi de bu 1.000 SMS modelini kullanabilir. Bazilari hakikaten o markaya ozgu, ornegin "TELIT KS863-PY".

    Marka tablosuna bakarsan, bu tabloda UrunTipi_Id olmasi pek anlamli gorunmuyor. Mesela TURKCELL bir marka ama UrunTipi_Id ile onu WEB SMS diye bir urun grubuna sokmussun. Oysa WEB SMS altinda o 1000, 2000, 3000 SMS olsa daha anlamli olurdu. Ayni zamanda, TURKCELL'in tek tipi WEB SMS degil, tek WEB SMS kullanilan operator de TURKCELL degil.

    O nedenle once tablo yapilarini yeniden gozden gecir derim. Tablo yapisi uzerinde gunler gecirmen gerekebilir ama bence su anda istedigin sorguyu bulup sonucu almandan cok daha onemli. Gunu gecistirmek icin arastiriyorsan o zaman is basit bir join'e bakar. Ortada daha gorunmeyen stok tablolari var tabii.


    Not: Burada takilip, kodunu da paylastigin isabetli olmus. Gunu gelip kodlarin duzeldiginde de ASLA ve ASLA oyle SQL yazma. Yazman gerektiginde parametre kullan. Konuyla ilgili detaylar bu forumda defalarca yazildi ayrintisiyla bulabilirsin.
    • Düzenleyen CetinBasoz 15 Ocak 2014 Çarşamba 18:02
    15 Ocak 2014 Çarşamba 17:59
  • Bak ! Bunlar dinamik yani c# tarafında değil sql taraflı yapılır. Senin istediğini yapmak için de bu sorguyu kullanman lazım.

    select count(model_ismi) from Model where marka_Id = 11
    Yukarıda ki sorgu ile iki tabloyu birleştirmek için kullanılır. Yani senin yaptıkların yanlış. For döngüleri ile olmaz. Sql taraflı sorgular ile yapman lazım.

    İyi Çalışmalar. Cihangir SUR [cihangirsur@hotmail.com]

    15 Ocak 2014 Çarşamba 18:00
    Yanıtlayıcı
  • Çetin bey "ASLA ve ASLA oyle SQL yazma" derken ! Nasıl olacak sql yazmadan anlamadım...

    İyi Çalışmalar. Cihangir SUR [cihangirsur@hotmail.com]

    15 Ocak 2014 Çarşamba 22:40
    Yanıtlayıcı
  • çetin bey benim yazacağım uygulama halka arz edilmeyecek. Kendi şirketimden kullanacağım. dolayısıyla ürünler bu şekildedir orada sorun yok.
    16 Ocak 2014 Perşembe 08:06
  • Cihangir,

    Ornek olarak verdigi kodun icinde ornegin su var:

    "select marka_id from database_marka where marka_ismi='"+MarkaAdi+"'"

    ASLA ve ASLA boyle bir SQL yazma cunku "SQL injection attack" bu sekilde yazilan SQL'ler sayesinde oluyor. Bir yerde yazmaya baslarsan gerisi gelir.

    Bunun yerine parametre kullan:

    "select marka_id from database_marka where marka_ismi=@markaAdi"
    

    Not: Yazini oyle sarkastik unlemlerle filan yazma, olur mu? Sorularini dosdogru sorarsan sevinirim.
    • Düzenleyen CetinBasoz 16 Ocak 2014 Perşembe 11:06
    16 Ocak 2014 Perşembe 11:04
  • Pardon Çetin bey anladım. Button click event i altında ki sorgulardan bahsettiniz. Evet parametre kullanmalı stored procedure yazmalı data access layer oluşturmalı veya Linq kullanmalı...

    Not :  Çetin bey ünlem işaretini "asla ve asla" derken neden bu kadar kati bir suretle "yazma" dediğinize çok şaşırdığım için kullandım. Kötü bir niyetim yoktu. Şaşkınlık ünlemi :)


    İyi Çalışmalar. Cihangir SUR [cihangirsur@hotmail.com]

    16 Ocak 2014 Perşembe 12:04
    Yanıtlayıcı
  • Sen sorun yok diyorsan iyi. O zaman stok tablonu da verseydin sana komple SQL'i verebilirdik. Simdi biraz afaki tahminle olacak (hatta biraz datasiyla birlikte kod seklinde versen sana test edilmis kodlar verebilirdik). Bunu SQL ile tirmalayip bir dizi join ile yapabilirsin, ya da basitce projene "Linq To SQL classes" eklersin (add new item), tablolarini oraya koyarsin ve Linq sorgusu yaparsin:

    var satislar = from m in db.Modeller
      select new {
           UrunTipi = m.Marka.UrunTipi.UrunTipi_Adi,
           Marka = m.Marka.Marka_Ismi,
           Model = m.Model_Ismi,
           SatisAdedi = m.Satislar.Sum (s => s.Miktar),
           MarkaToplam = m.Marka.Modeller
              .Sum (mo => mo.Satislar
              .Sum (s => s.Miktar)),
           UrunTipiToplam = m.Marka.UrunTipi.Markalar
              .Sum (ma => ma.Modeller
              .Sum (mo => mo.Satislar
              .Sum (s => s.Miktar)))
      };

    Bunu dogrudan bir DataGridView'a baglayabilirsin:

    dgv.DataSource = satislar;

    gibi.

    16 Ocak 2014 Perşembe 12:14
  • kusura bakmayın iş yoğunluğundan dolayı anca bakabildim. Cetin bey ilginiz için çok teşekkür ediyorum. Size real yapıyı gönderiyorum resimde..

    Resim hk.

    1 nolu yer: kullanıcının stok girmesini sağlar.

    3 nolu yer: girilen stokların tutulduğu yer

    2 nolu yer: bütün ürün tipi marka modellerin biribrlerine bağlı olarak geldiği ve modele bağlı olarak adetlerin görüntüleneceği yer

    tek istediğim: yapıya  yeni model eklendiğinde bile adedi görmek istiyorum..tekrar teşekkürler

    18 Ocak 2014 Cumartesi 08:30
  • Ben coktan cevabini yazdim. Alan adlarini kendine gore degistir.

    Not: Cevap verenlere de yardimci olmak istiyorsan, verilerini boyle resim olarak vermek yerine kod olarak ver. Ornegin:

    create table Urun (uruntipi_id int identity primary key not null, uruntipi_adi varchar(50))
    insert into Urun (uruntipi_id, uruntipi_adi) values (16, "Ortam Denetleme Sistemleri")
    insert into Urun (uruntipi_id, uruntipi_adi) values (17, "IP Kamera")
    ....

    gibi.

    • Yanıt Olarak İşaretleyen Ömer Birekul 20 Ocak 2014 Pazartesi 11:06
    20 Ocak 2014 Pazartesi 10:58
  • tamam, yardımlarınız sayesinde sorunu çözdüm. Tekrar teşekkür ederim Çetin Bey.
    20 Ocak 2014 Pazartesi 11:06