06/12/2024 - Ricki80 ha scritto:
Buongiorno a tutti,
in un db, ho una maschera di ricerca che tra le varie cose cerca una data in più campi data.
Ora ho realizzato un campo dove mettere la data e 4 checkbox per selezionare in quali campi cercare e ho fatto il seguente codice:
Private Sub cer_data_Click()
Dim strCerca As String
Dim datA As Date
Dim datB As Date
Dim datC As Date
Dim datD As Date
If Me.CB_primo = -1 Then
datA = Cerca_data.Value
End If
If Me.CB_secondo = -1 Then
datB = Cerca_data.Value
End If
If Me.terzo = -1 Then
datC = Cerca_data.Value
End If
If Me.quarto = -1 Then
datD = Cerca_data.Value
End If
strCerca = "select * from DFB_estesi where (campoA =#" & datA & "#) Or (campoB = #" & datB & "#) Or (campoC = #" & datC & "#) Or (campoD = #" & datD & "#)"
Me.RecordSource = strCerca
End Sub
ora ho questo problema, se i flag sono tutti messi funziona, ma se per assurdo tolgo il flag da un campo, lui invece di escluderlo mi trova proprio l'escluso!
Dove sbaglio?
Grazie a chi vorrà rispondere
Quando si fanno ricerche serve ottimizzare il codice... e fare una query con 4 WHERE non è il massimo se si può evitare.
Sugegrisco un approccio più funzionale.
Private Sub cer_data_Click()
Dim dtFindData As Date
Dim sWH As String
Dim sSQL As String
dtFindData=Me!Cerca_data.Value
If Me.CB_primo Then sWH="([campoA] + '-' + "
If Me.CB_secondo Then sWH=sWH+ "[campoB] + '-' + "
If Me.CB_terzo Then sWH=sWH+ "[campoC] + '-' + "
If Me.CB_terzo Then sWH=sWH+ "[campoC] + '-' + "
If Len(sWH>0) then
sWH="INSTR(" & mid$(sWH,1,LEN(sWH)-8) & ",cstr(dtFindData) & ")>0"
Me.Filter=sWH
Me.FilterOn=True
Else
Me.FilterOn=False
End if
End Sub
Verifica se la sintassi è completa perchè l'ho scritta a braccio... in sostanza in base ai campi che selezioni costruisco un campo calcolato per concatenazione e cerco la stringa in un solo colpo su questo.
Ovviamente puoi gestire l'evento AfterUpdate delle checkbox... vedi tu...
Uso la proprietà Filter invece di riassegnare l'intero Recordset perchè più efficiente e perchè se apri un Report passi la proprietà Filter nella WHERE CONDITION di OPENREPORT.