Arama (Filtre) Kodlamalası İle İlgili Veri Tipi Ve Toplu Filtre İle İlgili Sorum

05/03/2021, 08:18

ODRSCH26

Merhabalar, Bir önceki sorumun devamı olarak sormak istediğim 2 nokta var. Eklediğim Access örneği üzerinden (vehicleplanform) cevaplayabilirsiniz.

Birinci Sorum:
Ben arama yapmak istediğimde aşağıdaki kod yapısını (KOD 1) kullanıyordum ancak farkettim ki bu kod yapısı veri kaynağındaki form altındaki sorguyu tamamen değiştiriyor. Bu nedenle arama amaçlı kullanılması yanlış diye düşünüyorum. Bu kodla arama yapıp formu kapatıp tekrar açan kullanıcı, dataları farklı şekilde son arama kaynağını baz alarak görmüş olacak. Bunu gözden kaçırmışım. O nedenle arama amaçlı aşağıdaki kodu (KOD 2) devreye soktum.

_______KOD 1_________

cabledataformquery  = "SELECT * FROM tblcabledata WHERE line ='" & linesearchtxtbox & "'" & ""
Me.RecordSource = cabledataform
Me.Refresh


_______KOD 2________

Private Sub searchbutton_Click()
On Error GoTo Err_searchbutton_Click
    Dim stDocName As String
    Dim stLinkCriteria As String
    stDocName = "vehicleplanform"
    stLinkCriteria = "[line]=" & [linesearchtxtbox]
    DoCmd.OpenForm stDocName, , , stLinkCriteria
Exit_searchbutton_Click:
    Exit Sub
Err_searchbutton_Click:
    MsgBox Err.Description
    Resume Exit_searchbutton_Click
End Sub


Burada arama yaptığım alan olan "line" integer. O nedenle buradaki tanımı da integer yapmam gerekiyor diye düşünüyordum ama string dediğimde doğru çalışıyor.(Dim stLinkCriteria As String)  StLinkCriteria aratma yaptığımız alan integer da olsa string de olsa string diye tanımlandığında arama doğru çalışıyor. Buradaki string tipi farklı bir noktayı mı tanımlıyor acaba?

İkinci Sorum:
Vehicleplanform formu üzerinde 2 tane arama alanımız var - (line,  model)
Burada her bir alan için teker teker bağımsız arama yapabiliyoruz. Ancak ben 2 kutuya değeri yazalım sonra tek bir büyüteçe bastığımızda 2 sini de sağlayacak şekilde filtre oluşturmasını istiyorum (Basit olarak excelde yapabildiğimiz filtre tarzı). Bunu nasıl yapabiliriz.


Teşekkürlerimi sunarım.
05/03/2021, 08:31

berduş

stLinkCriteria siz bu kodu form açma eyleminde kullanıyorsunuz yani form açma fonksiyonuna parametre gönderiyorsunuz, parametreler fonksiyonda tanımlanır, form açma fonksiyonu da bu parametreyi string olunca kabul ediyor. Bizim daha önce vurguladığımız metin/sayisal ayrımı doğrudan alanın kendisiyle ilgiliydi burada kullanılan parametre ise alan + alan değeri kullanılıyor
05/03/2021, 09:49

berduş

2. soru içinse tek arama butonu yeterli aslında arama kodunu aşağıdaki gibi düzenleyip dener misiniz?
On Error GoTo Err_searchbutton_Click
    Dim stDocName As String
    Dim stLinkCriteria As String
    stDocName = "vehicleplanform"
    stLinkCriteria = ""
    Me.FilterOn = False
  If Len(linesearchtxtbox & "") > 0 Then stLinkCriteria = "[line]=" & [linesearchtxtbox]
  If Len(modelsearchtxtbox & "") > 0 Then stLinkCriteria = stLinkCriteria & IIf(Len(stLinkCriteria & "") = 0, "", " and ") & "[model]=" & "'" & [modelsearchtxtbox] & "'"
    DoCmd.OpenForm stDocName, , , stLinkCriteria
Exit_searchbutton_Click:
    Exit Sub
Err_searchbutton_Click:
    MsgBox Err.Description
    Resume Exit_searchbutton_Click
bu koda ile hangi metin kutuları doluysa ona göre arama yapması gerek
Me.FilterOn = False bu kod 2 metin kutsu da boşsa tüm kayıtları gösterir
kodu aşağıdaki gibi de düzenleyebilirsiniz
    Dim stLinkCriteria As String

stLinkCriteria = ""
If Len(linesearchtxtbox & "") > 0 Then stLinkCriteria = "[line]=" & [linesearchtxtbox]
If Len(modelsearchtxtbox & "") > 0 Then stLinkCriteria = stLinkCriteria & IIf(Len(stLinkCriteria & "") = 0, "", " and ") & "[model]=" & "'" & [modelsearchtxtbox] & "'"
Me.Filter = stLinkCriteria
Me.FilterOn = True

ufak 1 hatırlatma lütfen 1 konuda sadece 1 soru olsun
her soru için yeni konu açın.
05/03/2021, 21:17

berduş

Lütfen konularınıza olumlu yada olumsuz mutlaka dönüş yapınız
06/03/2021, 09:02

ODRSCH26

Sayın Berduş,

teşekkürler cevabınız için. 
ikinci nokta ile ilgili olarak netleştirmek istediğim için ufak bir sorum var.
Aşağıdaki ifadeyi de 

If Len(modelsearchtxtbox & "") > 0 Then stLinkCriteria = stLinkCriteria & IIf(Len(stLinkCriteria & "") = 0, "", " and ") & "[model]=" & "'" & [modelsearchtxtbox] & "'" 

Bu şekilde yazamaz mıydım? 

If Len(modelsearchtxtbox & "") > 0  Then stLinkCriteria = "[model]=" & "'" & [modelsearchtxtbox] & "'" ? 


Tek konuya tek soru sormaya dikkat edeceğim. Teşekkürler.
06/03/2021, 09:47

berduş

(06/03/2021, 09:02)ODRSCH26 yazdı: If Len(modelsearchtxtbox & "") > 0  Then stLinkCriteria = "[model]=" & "'" & [modelsearchtxtbox] & "'"
kodu bu şekilde yazarsanız sadece modele göre arama yapar
ifade özellikle o şekilde kullanıldı 1. amaç line alanı için arama kriteri var mı ona bakıldıktan sonra
eğer line için arama girilmiş ise and bağlacı ile 2. koşul da sağlanma şartı eklemek
1 - If Len(linesearchtxtbox & "") > 0 Then stLinkCriteria = "[line]=" & [linesearchtxtbox] bu satır ile line alanı için kriter girilmiş mi o kontrol edilir
2 - If Len(modelsearchtxtbox & "") > 0 Then stLinkCriteria = stLinkCriteria & IIf(Len(stLinkCriteria & "") = 0, "", " and ") & "[model]=" & "'" & [modelsearchtxtbox] & "'"
buradaki IIf(Len(stLinkCriteria & "") = 0, "", " and ") line alanı dolu ise and bağlacı eklenir, boş ise bir şey eklemez
her 2 arama alanı doluysa sonuç:
stLinkCriteria -->"line=SayıLineArama and model='MetinModelArama'"
______________________________________________________________________________________________
2 kriter tek olduğundan burada çok önemli değil ama aşağıdaki mantık 2den fazla kriter için daha uygun olur bence
Dim stLinkCriteria As String

stLinkCriteria = ""
If Len(linesearchtxtbox & "") > 0 Then stLinkCriteria =  stLinkCriteria &  " and [line]=" & [linesearchtxtbox]
If Len(modelsearchtxtbox & "") > 0 Then stLinkCriteria = stLinkCriteria & " and [model]=" & "'" & [modelsearchtxtbox] & "'"
stLinkCriteria = Mid(stLinkCriteria, 6)

Me.Filter = stLinkCriteria
Me.FilterOn = True
böylece aynı şablon üzerinden istediğimiz kadar kriter ekleyebiliriz tek değiştirilmesi gereken alan adları ve atanacak metin kutusu adı olur