Forum
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
IN yada OR kullanabilirsiniz .
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.
çok teşekkür ederim
ç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
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.
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.
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.
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 .
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.
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 .
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
Ş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.