Anasayfa » Forum

c# datagridde ç...
 

c# datagridde çok şarta bağlı filtreleme  

  RSS
ugur kaygısız
(@ugurkaygisiz)
Yeni Üye

herkese selamlar

c# projemdeki fatura formunda datagridde çoklu şarta bağlı filtreleme yapmak istiyorum

bağlantı;

public void stokbaglan()
{
con = new SqlConnection("server=SALON\\SQLEXPRESS; Initial Catalog=muhasebe;Integrated Security=true");
con.Open();
da = new SqlDataAdapter("Select * from stokdb", con);
ds = new DataSet();
da.Fill(ds, "stokdb");
dataGridView1.DataSource = ds.Tables[0];
con.Close();

}

şeklindedir

ve;

public void arabul()

{

baglanti.Open();
string kayit = "SELECT * from stokdb where isim=@isim";
SqlCommand komut = new SqlCommand(kayit, baglanti);
komut.Parameters.AddWithValue("@isim", ttextbox1.Text);
SqlDataAdapter da = new SqlDataAdapter(komut);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
baglanti.Close();

}

şeklinde tek şarta bağlı arama yapabiliyorum ancak istediğim birkaç şart daha koymak

örnek olarak aynı grid de

textbox2,textbox3,textbox4 e görede  süzme işlemi nasıl yapabilirim

ilgilenip cvp verecek arkadaşlardan ricam lütfen  kodu açık yazın 

saygılar

 

Alıntı
Gönderildi : 23/07/2016 16:51
Birol Aydugan
(@birolaydugan)
Üye

IN yada OR kullanabilirsiniz .

CevapAlıntı
Gönderildi : 30/07/2016 01:03
Yavuz Cingöz
(@YavuzCingoz)
Yeni Üye

public void arabul()

{

baglanti.Open();
string kayit = "SELECT * from stokdb where (@isim is not null and isim like '%' + @isim + '%') or (@grup is not null and grupid = @grup) or (@kategori is not null and kategoriid = @kategori)";
SqlCommand komut = new SqlCommand(kayit, baglanti);

if (!string.isNullOrEmpty(ttextbox1.Text))
komut.Parameters.AddWithValue("@isim", ttextbox1.Text);

else komut.Parameters.AddWithValue("@isim", DbNull.Value);

 

if (!string.isNullOrEmpty(ttextbox2.Text))
komut.Parameters.AddWithValue("@grup ", ttextbox2.Text);

else komut.Parameters.AddWithValue("@grup ", DbNull.Value);

 

if (!string.isNullOrEmpty(ttextbox3.Text))
komut.Parameters.AddWithValue("@kategori ", ttextbox3.Text);

else komut.Parameters.AddWithValue("@kategori ", DbNull.Value);

SqlDataAdapter da = new SqlDataAdapter(komut);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
baglanti.Close();

}

 

gibi olabilir. tabi grup ve kategori verileri combobox tan da gelebilir. örneği kodunuza göre düzenleyin.

CevapAlıntı
Gönderildi : 01/08/2016 21:28
ugur kaygısız
(@ugurkaygisiz)
Yeni Üye

çok teşekkür ederim

CevapAlıntı
Gönderildi : 02/08/2016 00:32
ugur kaygısız
(@ugurkaygisiz)
Yeni Üye

 

çok teşekkür ederim

dedim ama ben soruyu yalnış sormuşum hocam olay şöyle

bahse konu form açılırken  db de 2 önemli kriterden biri olan resmi hesabı

baglanti.Open();
SqlCommand komut = new SqlCommand("SELECT * from stokdb where resmi=@resmi", baglanti);
komut.Parameters.AddWithValue("@resmi", resmi.Text);
SqlDataAdapter da = new SqlDataAdapter(komut);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
baglanti.Close(); 

kodu  ile resmi hesapları süzerek listeliyor. bundan sonra süzme işlemleri grid üzerinden olmalı

sizin göndermiş olduğunuz kod ile her box veya combo tekrar tekrar db üzerinden veri süzüyor.

oysa ki zaten süzülmüş gelen verileri grid üzrinde tekrar süzmeli.

 

ilginize teşekkür ederim

 

 

 

CevapAlıntı
Gönderildi : 02/08/2016 13:59
Ali GÖREN
(@AliGOREN)
Yeni Üye

Dilerseniz bu işlemi SQL Server tarafında oluşturacağınız bir Stored Procedure ile gerçekleştirebilirsiniz.

COALESCE kullanarak verileri null olarak yollayabilir, null olmayanları seçebilirsiniz. Örneğin;

 

txt1, txt2, txt3, txt4 adında textBoxlar olsun.

deger1, deger2, deger3, deger4 karşılıkları olsun.

SQL server tarafındaki işlemi şöyle yapın:

 

create procedure StokGetir

@deger1 nvarchar(50),

@deger2 nvarchar(100),

@deger3 nvarchar(100),

@deger4 nvarchar(100)

AS

BEGIN

SELECT * FROM Stoklar WHERE (Stoklar.deger1=COALESCE(@deger1, Stoklar.deger))

AND (Stoklar.deger2=COALESCE(@deger2, Stoklar.deger2)) AND (Stoklar.deger3=COALESCE(@deger3, Stoklar.deger3))

AND (Stoklar.deger4=COALESCE(@deger4, Stoklar.deger4))

END

 

şeklinde bir SP oluşturup o SP'ye verileri txt1, txt2, txt3, txt4 şeklinde gönderebilirsiniz. Tıpkı insert işleminde olduğu gibi AddWithValue methoduna değerleri eklerseniz veriler önünüze gelecektir. AddWithValue sadece insert ile çalışmaz. Unutmadan SqlCommand nesneninizin CommandType özelliğine, CommandType.StoredProcedure şeklinde bildirim uygulamanız gerekiyor.

 

@ ile başlayanlar, procedure parametreleri. Tıpkı methodların parametre alması gibi.

 

Stoklar.deger1 ise deger1 adındaki alanları temsil ediyor. Bunu kendinize göre uyarlarsanız SQL sorgularını program tarafında yazmaktan da kaçınmış olursunuz.

 

Bu arada AddWithValue kullanmak yerine Add kullanabilirsiniz.

 

http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/

 

İyi çalışmalar dilerim.

CevapAlıntı
Gönderildi : 02/08/2016 17:06
ugur kaygısız
(@ugurkaygisiz)
Yeni Üye

[quote user="Ali GÖREN"]

Dilerseniz bu işlemi SQL Server tarafında oluşturacağınız bir Stored Procedure ile gerçekleştirebilirsiniz.

COALESCE kullanarak verileri null olarak yollayabilir, null olmayanları seçebilirsiniz. Örneğin;

 

txt1, txt2, txt3, txt4 adında textBoxlar olsun.

deger1, deger2, deger3, deger4 karşılıkları olsun.

SQL server tarafındaki işlemi şöyle yapın:

 

create procedure StokGetir

@deger1 nvarchar(50),

@deger2 nvarchar(100),

@deger3 nvarchar(100),

@deger4 nvarchar(100)

AS

BEGIN

SELECT * FROM Stoklar WHERE (Stoklar.deger1=COALESCE(@deger1, Stoklar.deger))

AND (Stoklar.deger2=COALESCE(@deger2, Stoklar.deger2)) AND (Stoklar.deger3=COALESCE(@deger3, Stoklar.deger3))

AND (Stoklar.deger4=COALESCE(@deger4, Stoklar.deger4))

END

 

şeklinde bir SP oluşturup o SP'ye verileri txt1, txt2, txt3, txt4 şeklinde gönderebilirsiniz. Tıpkı insert işleminde olduğu gibi AddWithValue methoduna değerleri eklerseniz veriler önünüze gelecektir. AddWithValue sadece insert ile çalışmaz. Unutmadan SqlCommand nesneninizin CommandType özelliğine, CommandType.StoredProcedure şeklinde bildirim uygulamanız gerekiyor.

 

@ ile başlayanlar, procedure parametreleri. Tıpkı methodların parametre alması gibi.

 

Stoklar.deger1 ise deger1 adındaki alanları temsil ediyor. Bunu kendinize göre uyarlarsanız SQL sorgularını program tarafında yazmaktan da kaçınmış olursunuz.

 

Bu arada AddWithValue kullanmak yerine Add kullanabilirsiniz.

 

http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/

 

İyi çalışmalar dilerim.

[/quote]

hocam ilginize çok çok teşekkür ederim anlayan için inanıyoruki çok iyi açıklamışsınızdır.

Ancak ben o kadar acemiyimki defalarca okumama rağmen ne yapmam gerektiğini bir türlü anlayamadım.Lütfen neyi nasıl yapmama gerektiğini detaylı yazarmısınız.

yani mesela şu kodu diyelimki sql in şurasına falanca kodu sql in burasına filanca kodu formun şurasına falan gibi.

ben yeni kodlama öürenmeye uğraşıyorum ama yüz yüze eğitim amadığım için anlamakta çok zorlanıyorum.

anlayışınız için teşekkür ederim.

CevapAlıntı
Gönderildi : 02/08/2016 19:47
Birol Aydugan
(@birolaydugan)
Üye

Kısa ve öz WHER isim IN (texbox1.text,texbox2.text,texbox3.text,texbox4.text)

yani isim alanında 4 kritere göre arama yapıyorsun .

CevapAlıntı
Gönderildi : 03/08/2016 00:31
Ali GÖREN
(@AliGOREN)
Yeni Üye

Hmm o konuda bir şey diyemem. Stored Procedure kullanımını ve Stored Procedure'lerin C# tarafında kullanımına bakmanızı öneririm.

Demek istediğim detaylı bir arama için bu gibi bir işlem kullanabilirsiniz. Kendi kullandığım bir yöntem ayrıca.

CevapAlıntı
Gönderildi : 03/08/2016 12:27
ugur kaygısız
(@ugurkaygisiz)
Yeni Üye

[quote user="Birol Aydugan"]

Kısa ve öz WHER isim IN (texbox1.text,texbox2.text,texbox3.text,texbox4.text)

yani isim alanında 4 kritere göre arama yapıyorsun .

[/quote]

hocam selamlar sanırım sizin öneriniz benim gibi acemiye göre daha ilgi cekici ve kola gibi geldi ama öneriyi biraz daha açabilllirmisiniz lutfen mumkunse bir ornekle ama lutfen detaylı bir ornekle açıklayabilirmisiniz.

ben şöyle yapmak istiyorum mesela

mutlaka resmi hesabının içinde

irsaliye noya göre ara

stok koduna göre ara

stok adına göre ara

fatura noya göre ara

tutara göre ara ........ devam edip gidebilir

ama en önemlisi mutlaka ilk kriter "RESMİ HESAP"

tüm aramalar bunun içinde olmalı

resmi hesap sütununda işte 

fasonlar

imalatlar

takaslar vs gibi hesap isimleri de bulunmakta aranan veri mutlaka resmi hesap içinde aranmalı vs gibi

herkese teşekkürller

CevapAlıntı
Gönderildi : 03/08/2016 20:17
Ahmet ATASAGUN
(@AhmetATASAGUN)
Yeni Üye

Şu an ki geliştirdiğim mevcut Wpf projemde bunu uyguladım. Genel mantık şu şekilde :

string sqlcumlesi değişkeni oluşturulur. Her doldurulan alan için sorgu cümlesine metinler ilave edecek şekilde kontroller hazırlanır. En son sorgu cümlesindeki revizyon yapılarak sorgu uygulanır.

bir örnek gerekirse :

 

public void DegerAtamalar()
{
   sorgucumlesi = "SELECT * FROM serinotakip WHERE kayittarihi >= CONVERT(DATETIME,'" + DatekayitTarihiilk.SelectedDate + "',104) AND kayittarihi <= CONVERT(DATETIME,'20.06.2018 00:00:00',104) AND ";
   if (checkBoxOnayTarih.IsChecked == true) { sorgucumlesi += "onaytarihi >= CONVERT(DATETIME, '01.01.2018 00:00:00', 104) AND onaytarihi <= CONVERT(DATETIME, '20.06.2018 00:00:00', 104) AND "; }
   if (checkBoxSilinmis.IsChecked == true) { sorgucumlesi += "sil LIKE '1' AND "; }
   else { sorgucumlesi += "sil LIKE '0' AND "; }
   if (checkBoxOnaysiz.IsChecked == true) { sorgucumlesi += "onaytarihi IS NULL AND "; }
   if (textBoxSeriNo.Text != "") { sorgucumlesi += "serino LIKE '" + textBoxSeriNo.Text + "' AND "; }
   if (comboBoxMTipi.Text != "") { sorgucumlesi += "tip LIKE '" + comboBoxMTipi.Text + "' AND "; }
   if (comboBoxMDegeri.Text != "") { sorgucumlesi += "deger LIKE '" + comboBoxMDegeri.Text + "' AND "; }
   if (comboBoxMKasnagi.Text != "") { sorgucumlesi += "kasnak LIKE '" + comboBoxMKasnagi.Text + "' AND "; }
   if (comboBoxTurSayisi.Text != "") { sorgucumlesi += "tur LIKE '" + comboBoxTurSayisi.Text + "' AND "; }
   if (comboBoxiletkenCapi.Text != "") { sorgucumlesi += "cap LIKE '" + comboBoxiletkenCapi.Text + "' AND "; }
   if (comboBoxKaydeden.Text != "") { sorgucumlesi += "kaydeden LIKE '" + comboBoxKaydeden.Text + "' AND "; }
   if (comboBoxOnaylayan.Text != "") { sorgucumlesi += "onaylayan LIKE '" + comboBoxOnaylayan.Text + "' AND "; }
   sorgucumlesi = sorgucumlesi.Substring(0, sorgucumlesi.Length - 4).Trim();
}

private void butonSorgula_Click(object sender, RoutedEventArgs e)
{
   DegerAtamalar();
   using (var sonuc = new AkMotorDbEntities1())
      {
      try
      {
         var veritablosu = sonuc.serinotakips.SqlQuery(sorgucumlesi).ToList();
         dataGridVerilerRapor.ItemsSource = veritablosu;
      }
      catch (Exception hata)
      {
         MessageBox.Show(hata.Message);
      }
   }
}

Benim izlediğim yol bu ama profesyonel şekilde nasıl yapılıyor bilmiyorum. Umarım faydalı olmuşumdur.

CevapAlıntı
Gönderildi : 29/05/2018 18:53
Paylaş:
  
Çalışıyor

Lütfen Giriş yap yada Kayıt ol