Ricerca data in più campi

di il
14 risposte

Ricerca data in più campi

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

14 Risposte

  • Re: Ricerca data in più campi

    Cer_data è un pulsante?

    Cerca_data.Value da dove spunta? Forse devi scrivere Me!Cerca_data.Value

    Idem Me!campoA, Me!campoB, Me!campoC, Me!campoD

  • Re: Ricerca data in più campi

    Grazie per la risposta.

    Allora:

    cerca_data  è la textbox dove inserisco la data da cercare

    mentre campoA-B..... sono i campi dove va a cercare la data che inserisco prima

  • Re: Ricerca data in più campi

    Usi la stessa data... leva quei datB. C e D.

    Private Sub cer_data_Click()
    Dim dataricerca As Date
    
    dataricerca= [tuadatadiricerca]
    PARAMETERS  Me.CB_primo BIT
    PARAMETERS  Me.CB_secondo BIT
    ecc... 
    
    
    
    "select * from DFB_estesi 
    where ((campoA = [dataricerca] and Me.CB_primo = TRUE) or Me.CB_primo=false)
    and   ((campob = [dataricerca] and Me.CB_secondo = TRUE) or Me.CB_secondo=false)
    and   ((campoc = [dataricerca] and Me.CB_terzo = TRUE) or Me.CB_terzo=false)
    ecc.. ecc..)"
    

    aggiorna query ogni volta che spunti una checkbox...

    sostituisci campoA campoB ecc.. con i nomi dei campi.

  • Re: Ricerca data in più campi

    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.

  • Re: Ricerca data in più campi

    06/12/2024 - sihsandrea ha scritto:

    Usi la stessa data... leva quei datB. C e D.

    Private Sub cer_data_Click()
    Dim dataricerca As Date
    
    dataricerca= [tuadatadiricerca]
    PARAMETERS  Me.CB_primo BIT
    PARAMETERS  Me.CB_secondo BIT
    ecc... 
    
    
    
    "select * from DFB_estesi 
    where ((campoA = [dataricerca] and Me.CB_primo = TRUE) or Me.CB_primo=false)
    and   ((campob = [dataricerca] and Me.CB_secondo = TRUE) or Me.CB_secondo=false)
    and   ((campoc = [dataricerca] and Me.CB_terzo = TRUE) or Me.CB_terzo=false)
    ecc.. ecc..)"
    

    aggiorna query ogni volta che spunti una checkbox...

    sostituisci campoA campoB ecc.. con i nomi dei campi.

    Grazie mille per la risposta.

    Già Intravedo lo svolgimento ma perdona la mia poca conoscenza, ma cos'è quel BIT che metti all'inizio?

    Non lo conosco e se lo lascio coì mi dà proprio errore in fase di compilazione! Anche perchè se lo escludo poi non riconosce le chechkbox (o meglio mi chiede di inserirgli il valore).

    Grazie se potrai aiutarmi

  • Re: Ricerca data in più campi

    Errata corrige: boolean

    HsjsnxjjdwXi

  • Re: Ricerca data in più campi

    06/12/2024 - sihsandrea ha scritto:

    Errata corrige: boolean

    HsjsnxjjdwXi

    perdonami, come vedi ho sostituito ma continua a dare errore

  • Re: Ricerca data in più campi

    ! Non .

    Avevo copiato la tua.

  • Re: Ricerca data in più campi

    @Alex

    Ti ringrazio per il codice che hai scritto, ma al momento presenta mi da degli errori probabilmente proprio nella sintassi in quanto lo segna in rosso

    come vedi va in errore sull'ultimo IF anche se cmq la variabile sotto la segna comunque come non corretta

    Perdonami per la domanda sciocca ma le mie conoscenze di vb si sono completamente arrugginite

    Grazie

  • Re: Ricerca data in più campi

    Hai fatto una abbuffata di virgolette nella funzione Instr. Hai consultato la guida?

  • Re: Ricerca data in più campi

    06/12/2024 - Antony73 ha scritto:

    Hai fatto una abbuffata di virgolette nella funzione Instr. Hai consultato la guida?

    Mi sa che non hai capito cosa deve fare quella stringa... ;-) equivale a questo, ma usando filter si costruisce solo la parte where.

    SELECT * FROM T1
    WHERE INSTR((dt1+dt2+dt3),valoredata)>0

    La concatenazione dei campi data deve essere risolta nel predicato.

    Dovendo trasformare in data temo serva aggiungere gli apicetti qua e là... una roba simile 

    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"
  • Re: Ricerca data in più campi

    06/12/2024 - Ricki80 ha scritto:

    @Alex

    Ti ringrazio per il codice che hai scritto, ma al momento presenta mi da degli errori probabilmente proprio nella sintassi in quanto lo segna in rosso

    come vedi va in errore sull'ultimo IF anche se cmq la variabile sotto la segna comunque come non corretta

    Perdonami per la domanda sciocca ma le mie conoscenze di vb si sono completamente arrugginite

    Grazie

    Fai un debug.lrint della stringa SWH e SSQL prima di passare a filter... non ho modo di fare un test specifico per qualche gg, ma se presenti la stringa finale magari si comprende...

  • Re: Ricerca data in più campi

    ((campoA = [dataricerca] and (Me.CB_primo.checked))
    
     
      
        
    ((campoB = [dataricerca] and (Me.CB_secondo.checked))
    
     
       
    ((campoC = [dataricerca] and (Me.CB_terzo.checked))
    ecc.. ecc..)"

    Mettilo nei criteri a design time

    Ognuno nel rispettivo campo data comandabile da checkbox...

    Il resto dimenticalo.

  • Re: Ricerca data in più campi

    Grazie a tutti per le risposte.

    Mi rendo conto che le mie conoscenze sono ancora troppo "basiche" e fatico a seguire i Vs. preziosi consigli.

    Vi ringrazio per il tempo dedicato

Devi accedere o registrarti per scrivere nel forum
14 risposte