none
Çoklu Sorgulama RRS feed

  • Soru

  • Merhabalar;

    VS2010 ile bir projem var ve access veritabanı kullanıyorum.

    Projede açılan kutulara göre veritabanından datagridview e verileri alıyorum. Sorunum genel olarak çoklu sorgu ama biraz farklı.

    Herhangi bir alan için örneğin tarih alanı için 2 adet açılan kutum var ve bu kutulardan ilkine başlangıç tarihi diğerine ise bitiş tarihi seçilip sorgulama yapılıyor. Burada kullandığım sorgu şu;
    SELECT * FROM tbl WHERE Tarih >= @Tar1 AND Tarih <= @Tar2
    Buraya kadar herşey normal, kullanıcı açılan kutulardan birer tarih seçtiğinde sorgu sorunsuz çalışıyor.

    Fakat, kullanıcı 1. veya 2. açılan kutuyu seçmediğinde örneğin; 1. kutudan seçim yapmadı ama 2. kutudan seçim yaptı bu durumda istediğim sorgu 1. kritere bağlı kalmadan 2. kutudan seçilen tarihten küçük olanları sorgulamasını istiyorum. . .

    Burada IF fonksiyonu ile şarta bağlı sorgular oluşturmak istemiyorum çünkü formumda sadece Tarih kriteri olmayacak
     SELECT * FROM tbl WHERE Tarih >= "*"&@Tar1&"*" AND Tarih <= "*"&@Tar2&"*"


    kullanıyorum ama olmuyor.

    Yardımlarınız için şimdiden teşekkür ederim...
    • Düzenleyen TR_Hasan 12 Eylül 2013 Perşembe 12:28
    12 Eylül 2013 Perşembe 12:26

Yanıtlar

  • SELECT * FROM tbl 
    WHERE ( @Tar1 is null or Tarih >= @Tar1 ) AND 
    ( @Tar2 is null or Tarih <= @Tar2 )

    Tabii Access garip bir veritabani (veritabanindan saymak bile garip) bu SQL'i anlamiyor olabilir. Sansini dene. Tabii daha iyisi Access kullanmaktan bir an once vazgecmen.
    • Yanıt Olarak İşaretleyen TR_Hasan 12 Eylül 2013 Perşembe 12:37
    12 Eylül 2013 Perşembe 12:31

Tüm Yanıtlar

  • SELECT * FROM tbl 
    WHERE ( @Tar1 is null or Tarih >= @Tar1 ) AND 
    ( @Tar2 is null or Tarih <= @Tar2 )

    Tabii Access garip bir veritabani (veritabanindan saymak bile garip) bu SQL'i anlamiyor olabilir. Sansini dene. Tabii daha iyisi Access kullanmaktan bir an once vazgecmen.
    • Yanıt Olarak İşaretleyen TR_Hasan 12 Eylül 2013 Perşembe 12:37
    12 Eylül 2013 Perşembe 12:31
  • Cevabınız için çok teşekkür ederim, istediğim oldu sanırım.

    Yukarıda yazdığım sorguyu MSQL sorgular mı acaba?

    12 Eylül 2013 Perşembe 12:38
  • Yukaridaki yazdigim darken o yildizli sorguyu mu kastediyorsun? Eger oyleyse hic bir yerde asla oyle bir sorgu kullanma calissa da (calisacagini zannetmiyorum - SQL'de wildcard karakterleri % ve _ ama bu wildcard ile nereye varmak istedigini anlamadim).
    12 Eylül 2013 Perşembe 12:52
  • Yukaridaki yazdigim darken o yildizli sorguyu mu kastediyorsun? Eger oyleyse hic bir yerde asla oyle bir sorgu kullanma calissa da (calisacagini zannetmiyorum - SQL'de wildcard karakterleri % ve _ ama bu wildcard ile nereye varmak istedigini anlamadim).

    Yani şu mantığı kurdum, eğer comboboxlardan seçim olmadığında sadece joker karakter kriter olarak alınsın ama sanırım yanlışa düştüm.

    Yardımlarınız için teşekkürler.

    Konuyla alakalı son bir sorum daha olacak,

    Algoritmama göre kullanıcının 2. açılan kutudan seçtiği tarih 1. açılan kutudan küçük olursa kodlarım işlemeyecek ve datagrid boş görünecektir. Kod, sorgu, tablo, bilgisi olmayan bir program kullanıcısının böyle bir seçim yaptığında yine sonuçların döndürülmesi için ne yapabiliriz? Yani, kullanıcı ilk açılan kutuda 15.09.2013 tarihini 2. açılan kutuya da 12.09.2013 tarihini seçtiğinde, ilk kutudan 12.09 ikinci kutudan da 15.09 seçmiş gibi sorgulama yaptırıp verileri getirebilir miyiz?

    Teşekkürler...

    12 Eylül 2013 Perşembe 13:01
  • Bence @tar1, @tar2 siralamasini once hallet. SQL'i karmasiklasrimanin alemi yok diye dusunuyorum.
    12 Eylül 2013 Perşembe 16:58
  • Bence @tar1, @tar2 siralamasini once hallet. SQL'i karmasiklasrimanin alemi yok diye dusunuyorum.

    Günaydın Çetin Bey,

    Yukarıdaki access sorgusunu projeme aşağıdaki şekilde uyguladığımda, "Ölçüt ifadesinde veri türü uyuşmazlığı" hatası alıyorum. Bu hatayı, kriterlerden bazıları seçilmediğinde yani bazı açılır kutular boş olduğunda alıyorum. Tüm açılır kutulardan seçim yapıldığında böyle bir hata gelmiyor. Sorun nerede acaba?

    Dim conn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=.\ggvt.accdb")
            Dim cmdFget As New OleDb.OleDbCommand("SELECT Fisno AS [Fiş No], Skod AS [Stok Kodu], Sisim AS [Stok Adı], Tutar, Tarih, Aciklama AS [Açıklama], Fistur AS [Fiş Türü] FROM Hareket WHERE ((@Skod1 is null or Skod >= @Skod1) AND (@Skod2 is null or Skod <= @Skod2) AND (@Tutar1 is null or Tutar >= @Tutar1) AND (@Tutar2 is null or Tutar <= @Tutar2) AND (@Tarih1 is null or Tarih >= @Tarih1) AND (@Tarih2 is null or Tarih <= @Tarih2) AND (@Fistur1 is null or Fistur >= @Fistur1) AND (@Fistur2 is null or Fistur <= @Fistur2))", conn)
            cmdFget.Parameters.AddWithValue("@Skod1", cbSkod1.Text)
            cmdFget.Parameters.AddWithValue("@Skod2", cbSkod2.Text)
            cmdFget.Parameters.AddWithValue("@Tutar1", cbTutar1.Text)
            cmdFget.Parameters.AddWithValue("@Tutar2", cbTutar2.Text)
            cmdFget.Parameters.AddWithValue("@Tarih1", cbTarih1.Text)
            cmdFget.Parameters.AddWithValue("@Tarih2", cbTarih2.Text)
            cmdFget.Parameters.AddWithValue("@Fistur1", cbGg1.Text)
            cmdFget.Parameters.AddWithValue("@Fistur2", cbGg2.Text)
            Dim daFget As New OleDb.OleDbDataAdapter
            daFget.SelectCommand = cmdFget
            Dim ds As New DataSet
            Try
                conn.Open()
                daFget.Fill(ds, "Hareket")
                dgFis.DataSource = ds.Tables("Hareket")
                dgFis.Columns(3).DefaultCellStyle.Format = "#,###.00 TL"
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
            Hesap()


    Garip olan da şu ki; access de sorgulama yaptığımda hiç bir sorun yok. Sorun şu ki; access de çıkan parametereye boş geçebiliyorum ancak comboboxlar boş olduğunda accessdeki parametre gibi davranmıyor :/

    Bu arada eklemeliyim ki, formun açılışında, kayıt ekleme, silme, güncelleme işlemlerinin her birinde comboboxlara group by ... order by ... komutu ile veri dolduruyorum...

    • Düzenleyen TR_Hasan 13 Eylül 2013 Cuma 07:25
    13 Eylül 2013 Cuma 06:49
  • Daha once de dedigim gibi, ideal cozum Access kullanmamak.

    DateTime t1, t2;
    
    DateTime? tar1 = DateTime.TryParse(cbTarih1.Text,new CultureInfo("tr-TR"),DateTimeStyles.None,out t1) ? (DateTime?)t1 : null;
    DateTime? tar2 = DateTime.TryParse(cbTarih2.Text,new CultureInfo("tr-TR"),DateTimeStyles.None,out t2) ? (DateTime?)t2 : null;
    
    cmdFget.Parameters.AddWithValue("@Tarih1", tar1);
    cmdFget.Parameters.AddWithValue("@Tarih2", tar2);

    Not: VB kukllandigini sonradan farkettim ama cevirmesi kolay nasil olsa.
    • Düzenleyen CetinBasoz 13 Eylül 2013 Cuma 11:52 Duzeltme
    13 Eylül 2013 Cuma 11:51