Skip to main content

AccessTr.neT


Çok Kriterli Form Filtresi Uygulamada Opsiyonel Değişken Kullanımı

Çok Kriterli Form Filtresi Uygulamada Opsiyonel Değişken Kullanımı

Çözüldü #1
düzeltiyorum, sayın berduş hocamın verdiği kod gayet işimi gördü onu uyarlayınca işim tamam, ama yine de bu tarz yapabilir miyim diye sormaktan kendimi alamadım, aşağıda...


merhaba değerli arkadaşlar, and bağlacı ile çok kriterli form filtresi uygulamada sıkıntım yok ama o kriterlerin hepsinin opsiyonel olmasını istiyorum çünkü normal and bağlacıyla yaptığımdan, diyelimki ben o an, iki kriterli filtre uygulamak istiyorum, sadece ikisini baz alsın, üç olunca üçünü.... yani şöyle ; diyelimki beş değişkenli , and bağlcıyla bağlanmış bir filtre stringim var, icabında ikisini seçeyim diyorum diğerleri de değer beklediğinden hata veriyor, bu konuda çok düşündüm bi sonuca varamadım, yardımcı olur musunuz?

Dim a As String
Dim b As Variant
Dim c As Variant

a = Me.acilan.Column(1)
b = Me.tarih1.Value
c = Me.tarih2.Value

Call suz(a, b, c)


Function suz(Optional sinif As String, Optional tarih1 As Variant, Optional tarih2 As Variant) As Variant
Me.surecAltForm.Form.Filter = "siniflar.sinifAdi='" & sinif & "'" & " And " & "'" & [islemTarihi] & "'  Between #" & Format(tarih1, "mm\/dd\/yyyy") & "# And #" & Format(tarih2, "mm\/dd\/yyyy") & "#"

Me.surecAltForm.Form.FilterOn = True



End Function
Son Düzenleme: 16/04/2022, 22:14, Düzenleyen: tarkanaykın.
Cevapla
#2
temel mantık aynı bu sefer metin kutularının adı yerine atama yaptığınız değişkenler kullanılacak
If Len(Me.acilan.Column(1) & "") > 0 Then StrFiltre = " and [siniflar.sinifAdi]='" & Me.acilan.Column(1) & "'"
If Len(Me.tarih1 & "") > 0 Then StrFiltre = StrFiltre & " and [surec.İslemTarihi]>=" & CLng(Me.tarih1)
If Len(Me.tarih2 & "") > 0 Then StrFiltre = StrFiltre & " and [surec.İslemTarihi]<=" & CLng(Me.tarih2)
StrFiltre = Mid(StrFiltre, 6)
Me.surecAltForm.Form.Filter = StrFiltre
Me.surecAltForm.Form.FilterOn = True
yerine
Sub suz(Optional sinif As String, Optional tarih1 As Variant, Optional tarih2 As Variant)
StrFiltre = ""
If Len(sinif & "") > 0 Then StrFiltre = " and [siniflar.sinifAdi]='" & sinif & "'"
If Len(tarih1 & "") > 0 Then StrFiltre = StrFiltre & " and [surec.İslemTarihi]>=" & CLng(tarih1)
If Len(tarih2 & "") > 0 Then StrFiltre = StrFiltre & " and [surec.İslemTarihi]<=" & CLng(tarih2)
StrFiltre = Mid(StrFiltre, 6)
Me.surecAltForm.Form.Filter = StrFiltre
Me.surecAltForm.Form.FilterOn = True

End Sub
function yerine sub kullanabilirsiniz
fonksiyon çıktı alır burada çıktı yok eylem var o nedenle sub tercih edilmelidir
Cevapla
#3
çok teşekkür ederim sayın berduş, sub uyarısı için de ayrıca teşekkürler, verdiğiniz kodun işleyiş mantığını çözdüm de yalnız şu StrFiltre = Mid(StrFiltre, 6) ne anlam taşıyor, işlevini biliyorum da diğer kodlarla ne alakası var onu da öğrenebilir miyim? yanlış bilmiyorsam stringin ortasından itibaren 6 tane alıyor ama ne alıyor niçin alıyor? ya da eksik mi biliyorum?
Cevapla
#4
If Len(sinif & "") > 0 Then   StrFiltre =                 " and [siniflar.sinifAdi]='" & sinif & "'"
If Len(tarih1 & "") > 0 Then StrFiltre = StrFiltre & " and [surec.İslemTarihi]>=" & CLng(tarih1)
If Len(tarih2 & "") > 0 Then StrFiltre = StrFiltre & " and [surec.İslemTarihi]<=" & CLng(tarih2)


kodlara dikkat ederseniz hepsinin başına and eklenmiş 
ilk and fazladan onu silmek için ilk 5 karakteri koşuldan çıkarmak gerek yoksa sorgu hata verir
eğer ilk and çıkmazsa kriter aşağıdaki gibi alınır

" and [siniflar.sinifAdi]='sınıf'"  & " and [surec.İslemTarihi]>=tarih and [surec.İslemTarihi]<=tarih"
Mid(StrFiltre, 6) ile and silinince
"[siniflar.sinifAdi]='sınıf'"  & " and [surec.İslemTarihi]>=tarih and [surec.İslemTarihi]<=tarih"
Cevapla
#5
eyvallah, anladım bunu bir kenara not etmeye gerek yok çünkü mantığını anladım, sadece dikkat edilmesi gereken bir durum, sağolun
Cevapla

Bir hesap oluşturun veya yorum yapmak için giriş yapın

Yorum yapmak için üye olmanız gerekiyor

ya da
Task