1

Konu: Set Filter to

(Şimdi üstadlarımın "set filter to ..." kullanma diyecekler ama.)

Bir table de örneğin 4 kritere göre bir sorgulama yapmam gerekiyor. Ad, Hesap türü, vs vs...
bunları text boxlardan yada combo boxlardan okuyup set filter ile işleyip gridin içinde gösteriyorum. Buraya kadar problem yok. Ancak kullanıcı bazı seçenekleri (mesela: hesap türü combo box'u ) boş bırakıpta diğer 3 kritere göre bir analiz yada liste istediğinde her defasında textbox ve combo boxların dolumu boşmu olduğunu kontrol etmek ve eğer boşsa "set filter"e dahil etmemek gerekiyor. Bu durumda aşırı bir "do case" yoğunluğuna sebep oluyor.

Set filter'e konu olan kriterleri bir kere değerlendirip tek bir set filter komutu yada bir SQL komutu  yada yada başka bir şekilde nasıl filitreleyebilirim

Teşekkür ederim

2 Son düzenleyen, ugurlu2001 (19.06.2007 14:09:25)

Re: Set Filter to

*/ Resim ekleyemedim ekran çıktısı için
*/ SET FILTER için benzer bir seçim

*/  M_BTN_DEVAM CLICK

Aranan = ""

IF ThisForm.cmb_raporturu.Value = 'TÜM BORÇLULAR' && Bakiyesi olanlar
    Aranan = Aranan + '(MBorc!=0 OR UsBorc!=0 OR NBorc!=0)' + " AND "
ENDIF

IF LEN(ALLTRIM(ThisForm.cmb_firmakodu.Value)) <> 0 && Firma Kodu Girilmiş...
    IF ThisForm.G_FirKodN.Value <> 1 && Eşit olan
        IF     ThisForm.cmb_firmakodu.Value = "M" OR ;
            ThisForm.cmb_firmakodu.Value = "A" OR ;
            ThisForm.cmb_firmakodu.Value = "H" OR ;
            ThisForm.cmb_firmakodu.Value = "T" OR ;
            ThisForm.cmb_firmakodu.Value = "R" OR ;
            ThisForm.cmb_firmakodu.Value = "O" OR ;
            ThisForm.cmb_firmakodu.Value = "K"
                Aranan = Aranan + "Kod='" + ALLTRIM(ThisForm.cmb_firmakodu.Value) + "'" + " AND "
        ENDIF
    ELSE && Farklı olan
        IF     ThisForm.cmb_firmakodu.Value = "M" OR ;
            ThisForm.cmb_firmakodu.Value = "A" OR ;
            ThisForm.cmb_firmakodu.Value = "H" OR ;
            ThisForm.cmb_firmakodu.Value = "T" OR ;
            ThisForm.cmb_firmakodu.Value = "R" OR ;
            ThisForm.cmb_firmakodu.Value = "O" OR ;
            ThisForm.cmb_firmakodu.Value = "K"
                Aranan = Aranan + "Kod!='" + ALLTRIM(ThisForm.cmb_firmakodu.Value) + "'" + " AND "
        ENDIF
    ENDIF
ENDIF

IF LEN(ALLTRIM(ThisForm.cmb_bolgekod.Value)) <> 0 && Bölge Kodu Girilmiş...
    IF ThisForm.G_BolgeN.Value <> 1 && Eşit olan
        Aranan = Aranan + "BolgeKod='"  + ALLTRIM(ThisForm.cmb_bolgekod.Value) + "'" + " AND "
    ELSE && Farklı olan
        Aranan = Aranan + "BolgeKod!='" + ALLTRIM(ThisForm.cmb_bolgekod.Value) + "'" + " AND "
    ENDIF
ENDIF

IF LEN(ALLTRIM(ThisForm.cmb_firma.Value)) <> 0 && Firma Adı Girilmiş...
    IF ThisForm.G_FirmaN.Value <> 1 && Eşit olan
        Aranan = Aranan + "HesAdi='"  + ALLTRIM(ThisForm.cmb_Firma.Value) + "'" + " AND "
    ELSE && Farklı olan
        Aranan = Aranan + "HesAdi!='" + ALLTRIM(ThisForm.cmb_Firma.Value) + "'" + " AND "
    ENDIF
ENDIF

IF LEN(ALLTRIM(Aranan)) > 0
    Aranan= ALLTRIM(SUBSTR(Aranan,1,LEN(Aranan)-4))
ENDIF

IF ThisForm.Cmb_ozetturu.Value <> "ÖZET LİSTE"
    DO CASE
        CASE ThisForm.Cmb_siralamaturu.Value = "BÖLGE - FİRMA ADI"
            Gl_SiraBakiye = "BolgeKod, HesAdi, HesTip"
        CASE ThisForm.Cmb_siralamaturu.Value = "FİRMA ADI"
            Gl_SiraBakiye = "HesAdi, HesTip"
        CASE ThisForm.Cmb_siralamaturu.Value = "AÇIKLAMA"
            Gl_SiraBakiye = "Not_Ozet, BolgeKod, HesAdi"
        OTHERWISE
            Gl_SiraBakiye = "HesAdi, HesTip"
    ENDCASE
ELSE
    Gl_SiraBakiye = "BolgeKod, HesAdi, HesTip"
    * Gl_SiraBakiye = "" && Ver_Bakiye.PRG dosyasında önemli, hataya sebep olucaktır. Düzenle
ENDIF

DO Ver_Bakiye
DO FORM ver_bak_sonuc.scx

*/ PROCEDURE Ver_Bakiye && Başlangıç kısmı

xHaving = "1 = 1" && kendi hesaplattığınız istediğiniz koşulu verin
xAranan = Aranan &&  Do Case yerine kullanılacak kalıp

SELECT ;
Bolgekod, Hesno, Hesadi, ;
(MBorc-MAlac) AS HasBorc, ;
(UsBorc-UsAlac) AS UsdBorc, ;
(NBorc - NAlac) AS NakitBorc, ;
ALLTRIM(Telko) + " "  + ALLTRIM(Telno) AS Telefon ;
    FROM Hesplan ;
    WHERE &xAranan ;
    ORDER BY BolgeKod ASC, HesAdi ASC ;
    HAVING &xHaving ;
    INTO CURSOR HesBak


*/ Yada Özetle

SET FILTER TO xAranan

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

3

Re: Set Filter to

Henuz kimse 'set filter' kullanma demedi di mi:) Ben diyeyim.

Olayin 2-3 turlu cozumu var (en az):

Visual Fox Pro
local lcWhere

lcWhere = ''
with thisform.myCombo1
   if .ListIndex > 0 && combodan kriter secilmis
     lcWhere = m.lcWhere + ;
           iif(empty(m.lcWhere),'',' and ') + ;
           'myField1 == ' + .List( .ListIndex )
   endif
endwith
 
if !empty(thisform.txtKriter2.Value)  && textbox kriter var
     lcWhere = m.lcWhere + ;
           iif(empty(m.lcWhere),'',' and ') + ;
           'myField2 == ' + trans(thisform.txtKriter2.Value) && gerekiyorsa tirnak ekle
endif
 
* ... bu sekilde tum kriterleri doldur
 
if !empty(m.lcWhere)
  lcWhere = 'where ' + m.lcWhere
endif
 
select ... from ... &lcWhere into cursor crsResult nofilter

Yukaridaki cozum set filter'a da uygulanir ama set filter kullanma demis miydim:)
Bir baska yolu onlarin bos ya da dolu olmasi durumunda where icerigini degistirmek:
Diyelim ki 4 kriterin sirasiyla ilktarih, sontarih (date), yer (char),  stokId (int). Bastan SQLun boyle olsun:

Visual Fox Pro
select * from myTable ... ;

where tarih between m.ilkTarih and m.sonTarih ;
  and yer = m.yer ;
  and stokID between m.ilkStok and m.sonStok

Bu SQL oncesinde:

Visual Fox Pro
local m.ilkTarih,m.sonTarih,m.yer,m.ilkStok,m.sonStok

do case
case empty(thisform.txtIlkTarih.Value) and empty(thisform.txtSonTarih.Value)
     ilkTarih = {}
     sonTarih = date(9999,12,31)
case empty(thisform.txtIlkTarih.Value)
     ilkTarih = {}
     sonTarih = thisform.txtSonTarih.Value
case empty(thisform.txtSonTarih.Value)
     ilkTarih = thisform.txtIlkTarih.Value
     sonTarih = date(9999,12,31)
otherwise
     ilkTarih  = min( thisform.txtIlkTarih.Value, thisform.txtSonTarih.Value)
     sonTarih = max( thisform.txtIlkTarih.Value, thisform.txtSonTarih.Value)
endcase
 
yer = trim(thisform.txtYer.Value)
 
if empty(thisform.stokID.Value)
  ilkStok = 0
  sonStok = 0x7FFFFFFF
else
  store thisform.stokID.Value to m.ilkStok, m.sonStok
endif


Kriter text ve combolarin arka planda ilgili kayitlarin primary keylerini birer cursora almasi ve sonunda bu cursorlarin joinle baglanmasi bir baska yol.