Adoquery.Filter özelliği Bilgi İhtiyacı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ufb1453
Üye
Mesajlar: 52
Kayıt: 14 Oca 2014 09:41
İletişim:

Adoquery.Filter özelliği Bilgi İhtiyacı

Mesaj gönderen ufb1453 »

Yaptığım projede dbgridde bulunan kolonların tamamına adoquery ile filter uygulamak istiyorum, tek bir filter için çalışmakta ancak misal 3 tane filter kullanmam gerekli kullanıcı açısından;
1) kullanıcı 2 adet filtreyi doldurdu(Tedit te ve Tcomboboxta belirtilmiş), 3. filtre boş kaldığında (Tedit) dbgridde dolu olan 2 filtere göre raporlama işini nasıl yaptırabilirim,
2) kullanıcı tüm filtreleri doldurdu and blogu gibi algılayarak nasıl işlem yaptırabilirim,

SQL kodu;

Kod: Tümünü seç

SELECT malzemekimlereverildi.serino AS [SERI NO],Tip.Tipi AS [MALZEME TİPİ], Birim.BirimAdi AS [HANGİ BİRİME VERİLDİ]
 ,Kullanicilar.Kullanici_Adi AS [KULLANICI ADI],Marka.Marka AS MARKA
 ,Model.Model AS MODEL, İsletimSistemi.Sistem_Adi AS [İŞLETİM SİSTEMİ], MSOfis.MSOfis_Surum AS [OFİS SÜRÜMÜ]
 ,malzemekimlereverildi.islemtarihi AS [İŞLEM TARİHİ], malzemekimlereverildi.hostname AS [DEĞİŞİKLİĞİ GERÇEKLEŞTİREN]
 
  FROM	
				  dbo.Firma																						INNER JOIN
                  dbo.malzemekimlereverildi	ON	dbo.Firma.FirmaID = dbo.malzemekimlereverildi.Firma				LEFT JOIN
                  dbo.Fatura				ON	dbo.malzemekimlereverildi.Fatura = dbo.Fatura.FaturaID			LEFT JOIN
                  dbo.Model					ON	dbo.malzemekimlereverildi.Model = dbo.Model.ModelID				LEFT JOIN
                  dbo.Marka					ON	dbo.malzemekimlereverildi.Marka = dbo.Marka.MarkaID				LEFT JOIN
                  Dbo.Birim					ON	Birim.BirimID = malzemekimlereverildi.Birim						LEFT JOIN
				  DBO.Kullanicilar			ON	Kullanicilar.KullaniciID = malzemekimlereverildi.kullaniciID	LEFT JOIN
				  DBO.İsletimSistemi		ON	dbo.İsletimSistemi.sistemID = malzemekimlereverildi.Sistem		LEFT JOIN
				  DBO.MSOfis				ON	MSOfis.MSOfisID = malzemekimlereverildi.MSofis					LEFT JOIN
				  DBO.Tip					ON	Tip.TipID = malzemekimlereverildi.Tip							INNER JOIN
				  malzeme					ON	malzeme.Seri_No = malzemekimlereverildi.serino
			group by malzemekimlereverildi.serino  ,Tip.Tipi, Birim.BirimAdi , Kullanicilar.Kullanici_Adi ,Marka.Marka 
 ,Model.Model, İsletimSistemi.Sistem_Adi,MSOfis.MSOfis_Surum,malzemekimlereverildi.islemtarihi , malzemekimlereverildi.hostname
 

			UNION
	
 SELECT distinct m.Seri_No ,'',b.BirimAdi,k.Kullanici_Adi,'','','','',null,'şuanki kullanıcı' FROM  malzeme m	INNER JOIN malzemekimlereverildi mkv on
 mkv.serino=m.Seri_No inner join kullanicilar k on
 m.kullaniciID=k.KullaniciID inner join birim b on
 b.BirimID = m.BirimID
     order by malzemekimlereverildi.serino desc 
örnek 3 filtre; seri no, işlem tarihi, ve malzeme tipi olacağını varsayıyorum,

saygılarımla,
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Adoquery.Filter özelliği Bilgi İhtiyacı

Mesaj gönderen ertank »

Merhaba,

Birden fazla yöntem kullanmak mümkün. Aklıma ilk gelen yöntem:
1- Filtre girilen bileşenlerin OnChange() olaylarına eğer bileşen için filtre değeri tanımlanmış ise ilgili database alanını

Kod: Tümünü seç

AdoQuery1.FieldByName('<ilgilialanadı>').Tag := 1;
şeklinde işaretleyebilirsiniz. Filtre değeri yok ise bu işareti 0 (sıfır) olarak değiştirirsiniz. Filtre değeri olsa da olmasa da OnChange() olayı içinde TAG değerini 1 veya 0 olarak değiştirmeniz önemli. Yoksa yanlış filtrelemelere sebebiyet verebilir.

2- Ardından filtrele/uygula butonuna basıldığı zaman her bir filtrelemek istediğiniz alanın TAG değerini kontrol edip 1 ise filtre kıstası içine dahil edebilirsiniz.

Kod: Tümünü seç

var
  FiltreAktif: Boolean;
  Filtre: string;
begin
  FiltreAktif := False;
  Filtre := EmptyStr;

  if AdoQuery1.FieldByName('serino').Tag = 1 then
  begin
    FiltreAktif := True;
    Filtre := '(' + <ilgili bileşen filtre değeri> + ')';
  end;
  
  if AdoQuery1.FieldByName('islemtarihi').Tag = 1 then
  begin
    if FiltreAktif then Filtre := Filtre + ' AND ';
    FiltreAktif := True;
    Filtre := Filtre + '(' + <ilgili bileşen filtre değeri> + ')';
  end;

  if AdoQuery1.FieldByName('malzemetipi').Tag = 1 then
  begin
    if FiltreAktif then Filtre := Filtre + ' AND ';
    Filtre := Filtre + '(' + <ilgili bileşen filtre değeri> + ')';
  end;

  AdoQuery1.Filtered := False;
  AdoQuery1.Filter := Filter;
  AdoQuery1.Filtered := True;
end;
ufb1453
Üye
Mesajlar: 52
Kayıt: 14 Oca 2014 09:41
İletişim:

Re: Adoquery.Filter özelliği Bilgi İhtiyacı

Mesaj gönderen ufb1453 »

Kod: Tümünü seç

begin
    FiltreAktif := False;
    Filtre := EmptyStr;
     if (AdoQuery1.FieldByName('SERI NO').Tag = 1)  and (Filtre.Length<>0) then
       begin
         FiltreAktif := True;
         if FiltreAktif then Filtre := Filtre + ' AND ';
         Filtre := Filtre + '[SERI NO] like ' + quotedstr(trim(edit1.Text));
       end
     else if (AdoQuery1.FieldByName('SERI NO').Tag = 1) and (Filtre.Length = 0) then
        Filtre := '[SERI NO] like ' + quotedstr(trim(edit1.Text));

     if (AdoQuery1.FieldByName('MALZEME TİPİ').Tag = 1) and (Filtre.Length<>0) then
       begin
         FiltreAktif := True;
         if FiltreAktif then Filtre := Filtre + ' AND ';
         Filtre := Filtre + '[MALZEME TİPİ] like ' + quotedstr(trim(edit2.Text))
       end
     else  if (AdoQuery1.FieldByName('MALZEME TİPİ').Tag = 1) and (Filtre.Length = 0) then
         Filtre := '[MALZEME TİPİ] like ' + quotedstr(trim(edit2.Text));

    AdoQuery1.Filtered := False;
    AdoQuery1.Filter := Filtre;
    AdoQuery1.Filtered := True;
    end;
ile 2 tane filtrede sorunsuz çalıştı ilginiz ve yardımınız için ayrıca teşekkür ederim ertank saygılarımla
Cevapla