Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

Bir mantık sorusu

Konu, 'ASP.NET / Silverlight / Moonlight' kısmında memphiswoo tarafından paylaşıldı.

  1. memphiswoo

    memphiswoo Aktif Üye

    Kayıt:
    22 Ocak 2005
    Mesajlar:
    471
    Beğenilen Mesajlar:
    0
    Şehir:
    İzmir
    Merhaba Arkadaşlar :
    Sıkıntım aslında yazılımdan çok yazılımın mantığı, altyapısıyla ilgili. Ancak kullanacağım dil asp.net olduğu için (belki) özel bir durum olabilir düşüncesiyle konuyu buraya açtım. Konu şu..

    Ekteki tabloda da görebileceğiniz gibi müşteriler ve ödeme tipleri var. Müsteriler takdir edersiniz ki sonsuz sayıda. Ancak ödeme tipleri de öyle. Yani yeni bir ödeme tipini sisteme eklemek mumkun, ve elbette yeni bir müşteriyi de. Tüm ödeme tipleri tüm müşteriler için geçerli. Yani bu tüm ödeme tiplerini müşteriler ödemekle yükümlü.

    Bu durumda nasıl bir veritabanı yapısı kullılabilir? İşleyiş nasıl olur? Ödeme tipleri ve müşterilerin bu ödemeleri ile ilgili bilgiler (odendi, odenmedi ya da şu kadarı ödendi) aynı tablo uzerinde nasıl gösterilebilir?

    Bir başka deyişle normal şartlar altında listeleme işlemlerinde satırlar değişkenler, sütunlar sabitler. Ancak yukarıda bahsettiğim durumda hem sütunlar, hem satırlar değişken.

    Aslında durum çok daha karmaşık benim yapacağım işlemler adına ama mümkün olduğunca kabataslak anlatmaya gayret ettim fikir almak adına.

    Yardımlarınız için şimdiden teşekkürler.
    Herkeze iyi çalışmalar.
     
  2. anov

    anov erlang programcýsý adayý

    Kayıt:
    29 Nisan 2004
    Mesajlar:
    3,488
    Beğenilen Mesajlar:
    0
    Meslek:
    İnternet Programcısı (Kreatif Design Studio)
    Şehir:
    Mavi kabarcığın içi
    Sınırsız x Sınırsız veriyi depolamakta bir sorun oluşmaz. Her veriyi belli bir koordinat ile kaydederiz. Esas sorun (tam şu anda kafamda canlandıramadığım kısım) bunları okurken, pratik olarak nasıl *en az sorguyla* işi tamamlayabileceğimiz.

    ---------------------------
    Müşteriler tablosu sütunları : id, musteri_adi, vs...
    Ödemeler tablosu sütunları : id, odeme_tipi, vs...

    ---------------------------
    Müşteri_Ödemeleri tablosu sütunları : musteri_id, odeme_id, hucre_degeri

    Yazıp okurken izleyeceğin mantık çok basit:
    1- Koordinatları al. (musteri_id, odeme_id)
    2- Daha önce oraya bir veri yazılmış ise güncelle (UPDATE)
    3- Daha önce böyle bir kayıt yapılmamış ise ekle (INSERT)

    Böyle bir yapıyı okurken kısa bir yol aklıma gelmiyor. Benzeri bir problemle bugünlerde ben de uğraşıyorum.
     
  3. memphiswoo

    memphiswoo Aktif Üye

    Kayıt:
    22 Ocak 2005
    Mesajlar:
    471
    Beğenilen Mesajlar:
    0
    Şehir:
    İzmir
    Teşekkür ederim Necat. İlk olarak ben de koordinat konusunu düşünmüştüm ama bahsettiğin sıkıntılardan ötürü acaba bir mantık hatası mı var diye düşünmeden edemedim. Hayli enteresan bir durum aslında. Konuyla ilgili gelişmeleri (umarım olur) mutlaka buradan aktarmaya gayret edeceğim. Kolay gelsin
     
  4. ofaruk_k

    ofaruk_k Aktif Üye

    Kayıt:
    7 Mayıs 2005
    Mesajlar:
    322
    Beğenilen Mesajlar:
    0
    Merhabalar,
    aynı sorunu ben de öğrenci için yaşamıştım. tablo yapıları şu şekildeydi
    ogrtablo
    ogr_no....adi........soyad
    111.........ali.........kaya
    222.........ahmet...uzun
    .
    .
    .


    dersler
    id....dersadi
    1.....Matematik
    2.....Fizik
    .
    .
    .


    notlar
    ogr_no....ders....Y1....Y2....Y3
    111.........1........96....65....68 (Matematik)
    111.........2........75....48....95 (Fizik)
    222.........1........74....78....45 (Matematik)

    ---------------------------------------------
    Benim istediğim çıktı da BÜTÜN ÖĞRENCİLERİN, TÜM DERS NOTLARINI tek sorguda göstermekti. Yani şöyle bir çıktı oluşacaktı.
    ogr_no...adi...M.Y1......M.Y2......M.Y3......F.Y1.....F.Y2...F.Y3...
    111........ali....96.........65.........68.........75.........48......95....

    tablo yapılarında değişiklik yapmadan şu sorguyla işimi çözmüştüm:

    Kod:
    select
    max(ogrtablo.Ogr_No) [öğrenci Numarasi],
    max(Adi) as Adi,
    max(Soyadi)as Soyadi,
    sum(case when DerslerId=1 then Y1 else 0 end) MatematikY1,
    sum(case when DerslerId=1 then Y2 else 0 end) MatematikY2,
    sum(case when DerslerId=1 then Y3 else 0 end) MatematikY3,
    sum(case when DerslerId=2 then Y1 else 0 end) FizikY1,
    sum(case when DerslerId=2 then Y2 else 0 end) FizikY2,
    sum(case when DerslerId=2 then Y3 else 0 end) FizikY3,
    sum(case when DerslerId=3 then Y1 else 0 end) KimyaY1,
    sum(case when DerslerId=3 then Y2 else 0 end) KimyaY2,
    sum(case when DerslerId=3 then Y3 else 0 end) KimyaY3
    from ogrtablo
    inner join notlar on notlar.Ogr_No=ogrtablo.Ogr_No
    
    group by ogrtablo.Ogr_No 
    ama burada 1,2,3 yerine önceden veritabanından çekip dinamik bi sql sorgusu oluşturuyordum. Basit hali bu diye bunu yazdım.

    Tabi Öğrenci yerine müşteri, dersler yerine ödeme tipi, notlar yerine de ödeme kayıtları olacak. 2.aşamada Gridview üzerinde Insert/Update konusunda da Necati Bey'den yardım almıştım. Sorunsuz çalışıyor. Gerekirse bu kodları da göndereyim.
    Umarım işinize yarar.
    Kolay Gelsin...