Problema con istruzione SELECT

di il
6 risposte

Problema con istruzione SELECT

Buonasera a tutti ragazzi,
se possibile, mi servirebbe un vostro aiuto, poichè non riesco a risolvere un problema che sembra essere banale, però, non essendo un esperto di Access e SQL, non riesco a venirne a capo, anche perchè alcune volte funziona, altre no, e non riesco a capire dove sia l'errore.

Vi spiego, ho creato una maschera per effettuare una ricerca secondo il testo che entra in input in delle caselle di testo e poi di conseguenza aggiornare i record in base ai dati immessi.

Questo è il codice:
Private Sub TastoCerca_Click()
Dim RicercaPro As String
RicercaPro = "SELECT * FROM Protocollo WHERE NProtocollo LIKE [Forms]![Ricerca].[testoprotocollo] AND Tipologiaposta LIKE [Forms]![Ricerca].[testotipologia] AND Oggetto LIKE [Forms]![Ricerca].[testoggetto] AND Destinatario LIKE [Forms]![Ricerca].[testodestinatario] AND Mittente LIKE [Forms]![Ricerca].[testomittente] AND Dataregistrazione Between [Forms]![Ricerca].[DataDal] AND [Forms]![Ricerca].[DataAl]"
Me.RecordSource = RicercaPro
End Sub
Dove sbaglio? Ci sono troppi AND? Se lo faccio con un campo funziona, non appena comincio a concatenare AND non visualizza nulla.
Grazie mille in anticipo per la vostra gentilezza e disponibilità.

6 Risposte

  • Re: Problema con istruzione SELECT

    Forse volevi effettuare la ricerca in OR (ovvero oppure, invece che in AND in cui tutte le condizioni devono essere soddisfatte) ?
  • Re: Problema con istruzione SELECT

    Oltre a quanto detto da willy55, con l'operatore LIKE servono le wildcards per esplicitare il pattern.
    Ma come mi spiegava Alex:

    @Alex ha scritto:


    Con Access, è estremamente più funzionale, partire con una origine dati completa o pulita, al limite filtrata su WHERE CONDITION in apertura che valorizza la proprietà FILTER, quindi invece di modificare il predicato SQL, si opera sulla proprietà FILTER attivandola e rinfrescandola con FILTERON.
  • Re: Problema con istruzione SELECT

    willy55 ha scritto:


    Forse volevi effettuare la ricerca in OR (ovvero oppure, invece che in AND in cui tutte le condizioni devono essere soddisfatte) ?
    No no, se fanno la ricerca inserendo due o più campi, vorrei spuntassero i record filtrati per quei campi, esempio: i documenti inseriti dal gg/mm/aaaa al gg/mm/aaaa aventi tipologia posta in uscita, ecc..., quindi un AND e non un OR, devono essere contemporanei. Non so se sono stato chiaro.
  • Re: Problema con istruzione SELECT

    Sgrubak ha scritto:


    Oltre a quanto detto da willy55, con l'operatore LIKE servono le wildcards per esplicitare il pattern.
    Ma come mi spiegava Alex:

    @Alex ha scritto:


    Con Access, è estremamente più funzionale, partire con una origine dati completa o pulita, al limite filtrata su WHERE CONDITION in apertura che valorizza la proprietà FILTER, quindi invece di modificare il predicato SQL, si opera sulla proprietà FILTER attivandola e rinfrescandola con FILTERON.
    Quindi che soluzione mi stai proponendo? Perdonami, sto imparando gradualmente.
  • Re: Problema con istruzione SELECT

    La prima cosa è che l'uso del LIKE impone la WildCard... ma la cosa più importante è che tu hai inserito N criteri, e sicuraemente potrebbero non essere valorizzati, al che immagino tu intenda vedere tutti i record.
    Questo significa che stai obbligando a risolvere criteri INUTILI, quindi si riduce drasticamente la velocità di esecuzione di una Query.
    Ovviamente non è il modo corretto.

    Come accennato il modo più funzionale è EVITARE CRITERI se non servono ed inserire, o costruire la concatenazione dei criteri la dove siano valorizzati.
    Questo processo viene semplificato usando la proprietà FILTER di Maschera.

    Il metodo più funzionale è questo:
    
    Dim strWH As String
    If Len(Me!Controllo1.Value & vbNullstring)>0 Then strWH=strWH & "Campo1=" & Me!Controllo1.Value& " AND "
    If Len(Me!Controllo2.Value & vbNullstring)>0 Then strWH=strWH & "Campo2=" & Me!Controllo2.Value & " AND "
    ' aggiungi le altre 1000 condizioni... con AND e OR come ritieni
    If Len(strWH)>0 then strWH=Mid$(strWH,1,Len(strWH)-5) ' Attenzione al valore 5 è la LEN(" AND ") quindi se l'ultimo è OR sarà 4
    Me.Filter=strWH
    Me.FilterON=True
    Se poi vuoi che la ricerca o criterio includa le somiglianze, devi usare il LIKE:
    
    If Len(Me!Controllo2.Value & vbNullstring)>0 Then strWH=strWH & "Campo2 LIKE '*" & Me!Controllo2.Value & "*' AND "
    Fai attenzione alla sintassi, quella proposta è per Campi Testo, quindi APICETTI e WILDCARD... prima o dopo a seconda di come vuoi cercare.

    Ci sono poi concetti che introduci che tecnicamente sono sbagliate, pur funzionanto in quanto il costrutto viene ugualmente risolto dal motore...!

    Faccio esempi:
    RicercaPro = "SELECT * FROM Protocollo WHERE NProtocollo LIKE [Forms]![Ricerca].[testoprotocollo] AND ...."
    Nel predicato inserisci i riferimenti ad Oggetti di Maschere, obbligando il motore ad andarsi a recuperare e risolvere il valore...
    In questi casi si valorizzano in modo ESPLICITO a prescindere... per semplificare il lavoro al motore.
    RicercaPro = "SELECT * FROM Protocollo WHERE NProtocollo LIKE " & [Forms]![Ricerca].[testoprotocollo] & " AND ...."
    Ora hai TUTTO per capire in autonomia.
  • Re: Problema con istruzione SELECT

    Okarin7 ha scritto:


    Quindi che soluzione mi stai proponendo? Perdonami, sto imparando gradualmente.
    Al posto di modificare il [Me.RecordSource], vai a modificare la proprietà [Me.Filter] e poi chiami [Me.FilterOn = True] per aggiornare la schermata.

    Nota l'uso degli asterischi ad indicare che il filtro vada applicato a tutti i records che comprendono il testo scritto nel controllo.
    Leggi la documentazione ufficiale che ti ho linkato in precedenza per gli approfondimenti sull'uso delle wildcards.

    Potrebbe essere anche opportuno costruire meglio la String da assegnare alla proprietà Filter controllando che il controllo non sia vuoto:

    Ad esempio:
    Private Sub TastoCerca_Click()
    Dim filtro As String
    If testoprotocollo.Value) <> "" then
    	filtro = "NProtocollo LIKE '*" & testoprotocollo.Value & "*' " 
    End If
    If testotipologia.Value <> "" Then
    	If filtro <> "" Then filtro = filtro & " AND "
            filtro = filtro & "Tipologiaposta LIKE '*" & testotipologia.Value & *' "
    End If
    'Aggiungi tutti gli altri AND o OR che ti servono, controllandoli...
    Me.Filter = filtro
    Me.FilterOn = True
    End Sub
    Probabilmente è migliorabile, ma ho fatto qualche test e funziona...
Devi accedere o registrarti per scrivere nel forum
6 risposte