Filtro su evento Keyup

di il
20 risposte

Filtro su evento Keyup

Buonasera,
ho realizzato un codice che esegue ricerche all'interno di una query applicando la proprietà filteron a varie combobox e textbox.
Utilizzando eventi click sulle combobox tutto bene, ma appena applico il filtro all'avento keyup di textbox mi restituisce stringhe vuote come si evince applicando debug.print sulla stringa.
il codice è il seguente:
Private Sub txtente_rich_Keyup(KeyCode As Integer, Shift As Integer)

Dim str As String
Dim strsql As String
Dim strwhere As String
Dim lg as integer

lg = Len(Me.txtente_rich.Text)

str = "'" & Me.txtente_rich.Text & "*'"

strsql = "SELECT Denominazione_Ente FROM Enti_MM WHERE Denominazione_Ente like " & str

Me.cboente_rich.RowSource = strsql

If lg = 0 Then Me.cboente_rich.RowSource = vbNullString ' svuota la combobox quando la txtente_rich è vuota

If Me.cmd_filtro_prot.Caption = "Disattiva Filtro" Then 

If Len(Me.cbotipo_an & vbNullString) > 0 Then strwhere = strwhere & "Categoria Like '" & Me.cbotipo_an & "' And "
If Len(Me.cbotipo_camp & vbNullString) > 0 Then strwhere = strwhere & "Tipo_campione Like '" & Me.cbotipo_camp & "' And "
If Len(Me.txt_Num_Camp & vbNullString) > 0 Then strwhere = strwhere & "Numero_Campione Like '*" & Me.txt_Num_Camp & "*' And "
If Len(Me.txt_Data_Acc & vbNullString) > 0 Then strwhere = strwhere & "Numero_Campione Like '*" & Me.txt_Data_Acc & "*' And "
If Len(Me.txtdescr_camp & vbNullString) > 0 Then strwhere = strwhere & "Descrizione_Campione Like '*" & Me.txtdescr_camp & "*' And "
If Len(Me.txtente_rich & vbNullString) > 0 Then strwhere = strwhere & "Denominazione_Ente Like '*" & Me.txtente_rich & "*' And "
If Len(Me.txtprot_rich & vbNullString) > 0 Then strwhere = strwhere & "Testo_Protocollo Like '*" & Me.txtdata_rich & "*' And "
If Len(Me.txtdata_rich & vbNullString) > 0 Then strwhere = strwhere & "Data_protocollo Like '*" & Me.txtdata_rich & "*' And "
If Len(strwhere) > 0 Then strwhere = Mid$(strwhere, 1, Len(strwhere) - 5)

Form_SM_Protocollo.Filter = strwhere
Form_SM_Protocollo.FilterOn = True
End If
Debug.Print strwhere
End Sub
Me la potrei cavare utilizzando delle stringhe su predicato sql, ma vorrei capire perché non riesco con il metodo esposto.
grazie.

20 Risposte

  • Re: Filtro su evento Keyup

    Hai detto 3 cose nella spiegazione ma assurde... vaghe...
    Intanto sei in una maschera e non una query...
    I vari eventi click di cosa... che usi solo l'evento keyup...?

    Prima cosa se vuoi un aiuto non sparare cavolate generiche insensate... scrivi poche cose ragionandoci e solo se sai di cosa parli, altrimenti chi ti legge si fa una idea magari no pienamente te positiva...

    Nel codice che hai copiato, malamente, e non realizzato tu, ci sono una marea di errori... di cui immagino tu non sia consapevole...
    Assegni il Rowsource anche se il testo ha lunghezza zero poi controlli ed eventualmente lo cancelli... questo nelle prime righe...
    Poi passiamo all'elenco delle.condizioni...
    I campi sono TUTTI di tipo testo...?
    Perche usi LIKE OVUNQUE anche se le combo normalmente restituiscono testo intero quindi serve = e spesso sono associate a colonna numerica, quindi nemmeno testo ma Indice Long.
    Le ultime 2 condizioni hanno sempre il txtadata come criterio...?
    TxtData immagino non sia testo ma data come lascia intuire il nome...

    Tu formatti tutto uguale quindi non hai compreso la differenza di sintassi che serve tra campi Testo/Numerici/Data...

    Suggerisco 2 passi indietro...
  • Re: Filtro su evento Keyup

    Buonasera,
    La stringa sql che è indicata serve a filtrare un valore da una combobox che a sua volta riceve il valore da una tabella Enti_MM. Utilizzando un evento click su questa combobox viene assegna il valore alla medesima textbox permettendo ad un utilizzatore di ricercare un testo precedentemente utilizzato e facilitando il lavoro di un utilizzatore.
    Per questo dico che l'evento click funziona.
    Allo stesso tempo vorrei disporre un filtro dinamico su evento keyup.
    La variabile lg è utilizzata per svuotare la combo quando Len(Me.txtente_rich.Text)=0.
    Tutti i valori che si leggono a parte txtdata (che sono date in effetti, ed ho commesso un errore) sono tutte formato testo per questo ho utilizzato like.
  • Re: Filtro su evento Keyup

    Non hai letto quello che ti ho scritto... hai cercato di spiegarmi ancora cosa hai fatto...
    Inizia a sistemare quello che ti ho segnalato... il like dove hai combo non ha senso... non spiegarlo a noi come fossimo noi a non capire... cerca di capire tu i suggerimenti in modo tecnico e ragiona su quelli...
  • Re: Filtro su evento Keyup

    Ho sistemato i like con = per le combo, ho tralasciato momentaneamente il controllo con la parte formata data, ma la strWhere continua ad essere una stringa vuota e non capisco perché.
  • Re: Filtro su evento Keyup

    Devi fare debug... metti un break point e poi premi F8 per fare stepbystep...
    Ad esempio questa condizione...?

    If Me.cmd_filtro_prot.Caption = "Disattiva Filtro" Then
  • Re: Filtro su evento Keyup

    Ho risolto con la proprietà .text
    Adesso funziona.
    Mi stai chiedendo a cosa serve
    If Me.cmd_filtro_prot.Caption = "Disattiva Filtro" Then

    C'è un pulsante che assume il valore Attiva Filtro e Disattiva Filtro.
    Quando la caption = "Disattiva Filtro" il filtro è attivo e viceversa.
    In questo modo l'utente può scegliere se inserire soltanto i valori o filtrare in contemporanea all'inserimento.
  • Re: Filtro su evento Keyup

    Mi spiegheresti la differenza nell'usare "=" o "like" nella stringa. Qual è la controindicazione con le combo?
  • Re: Filtro su evento Keyup

    eddy1973 ha scritto:


    Mi spiegheresti la differenza nell'usare "=" o "like" nella stringa. Qual è la controindicazione con le combo?
    Funzionano entrambi chiaramente... il discorso è un po come usare sempre variabili Variant invece che specifiche... funziona sicuramente... ma...
    La regola dice che se devi Confrontare Stringhe complete per l'identificazione di UGUAGLIANZA, si usa [=] se devi confrontare Caratteri all'interno di stringhe, che restituiscano SIMILITUDINE, si deve usare LIKE+WildCard.

    Il LIKE si aspetta un Pattern(che include tra questi la WildCard), quindi l'efficienza della query è inferiore.
    Se poi vogliamo anche vedere l'utilizzo del LIKE in un Database SQL, non JET, ma SQLServer ad esempio, se usi un Create Table ed accodi dati con una Insert condizionata da un LIKE i Campi che vengono creati sono diversi dal campo che vede "="... cambia da Char a VarChar.

    ecc...
  • Re: Filtro su evento Keyup

    Grazie.
  • Re: Filtro su evento Keyup

    Buongiorno,
    Un'ultima cosa…
    Per la formattazione delle date nel filtro ho usato la funzione Cdate(me.textbox.value) e passato i valori a variabili as Date e poi inseriti del codice per la gestione del filtro.
    Il filtro funziona a patto che entrambe le date sul filtro non siano Null. Ma se una delle due date non è inserita il codice restituisce l'errore "utilizzo non valido di Null". Per una stringa utilizzo isNullString ma per una data come si opera?
    Grazie.
  • Re: Filtro su evento Keyup

    eddy1973 ha scritto:


    Buongiorno,
    Un'ultima cosa…
    Per la formattazione delle date nel filtro ho usato la funzione Cdate(me.textbox.value) e passato i valori a variabili as Date e poi inseriti del codice per la gestione del filtro.
    Il filtro funziona a patto che entrambe le date sul filtro non siano Null. Ma se una delle due date non è inserita il codice restituisce l'errore "utilizzo non valido di Null". Per una stringa utilizzo isNullString ma per una data come si opera?
    Grazie.
    Non ho capito, puoi postare il codice...?
  • Re: Filtro su evento Keyup

    Ti posto il codice:
    Private Sub txt_data_rich_Change()
    
    Dim strwhere As String
    Dim data_rich As Date
    Dim data_acc As Date
    
    data_rich = CDate(Me.txt_data_rich.Value)
    data_acc = CDate(Me.txt_data_acc.Value)
    
    If Len(Me.cbotipo_an & vbNullString) > 0 Then strwhere = strwhere & "Categoria='" & Me.cbotipo_an & "' And "
    If Len(Me.cbotipo_camp & vbNullString) > 0 Then strwhere = strwhere & "Tipo_campione='" & Me.cbotipo_camp & "' And "
    If Len(Me.txt_Num_Camp.text & vbNullString) > 0 Then strwhere = strwhere & "Numero_Campione= '" & Me.txt_Num_Camp.text & "' And "
    If Len(data_acc & VbNullString) > 0 Then strwhere = strwhere & "Data_Accettazione like '" & data_acc & "' And "
    If Len(Me.txtdescr_camp.text & vbNullString) > 0 Then strwhere = strwhere & "Descrizione_Campione like '*" & Me.txtdescr_camp & "*' And "
    If Len(Me.txtente_rich.text & vbNullString) > 0 Then strwhere = strwhere & "Denominazione_Ente like '*" & Me.txtente_rich & "*' And "
    If Len(Me.txtprot_rich.text & vbNullString) > 0 Then strwhere = strwhere & "Testo_Protocollo like'*" & Me.txtprot_rich.text & "*' And "
    If Len(data_rich & vbNullString) > 0 Then strwhere = strwhere & "Data_Protocollo='" & data_rich & "' And "
    
    If Len(strwhere) > 0 Then strwhere = Mid$(strwhere, 1, Len(strwhere) - 5)
    
    Form_SM_Protocollo.Filter = strwhere
    Form_SM_Protocollo.FilterOn = True
    
    end sub
    Ho indicato la gestione delle date con vbNullString ma non è corretto. Come si gestisce un valore della data quanto il valore non è inserito nel campo della corrispondente textbox?
    Grazie.
  • Re: Filtro su evento Keyup

    eddy1973 ha scritto:


    Ti posto il codice:
    Private Sub txt_data_rich_Change()
    
    Dim strwhere As String
    Dim data_rich As Date
    Dim data_acc As Date
    
    data_rich = CDate(Me.txt_data_rich.Value)
    data_acc = CDate(Me.txt_data_acc.Value)
    
    If Len(Me.cbotipo_an & vbNullString) > 0 Then strwhere = strwhere & "Categoria='" & Me.cbotipo_an & "' And "
    If Len(Me.cbotipo_camp & vbNullString) > 0 Then strwhere = strwhere & "Tipo_campione='" & Me.cbotipo_camp & "' And "
    If Len(Me.txt_Num_Camp.text & vbNullString) > 0 Then strwhere = strwhere & "Numero_Campione= '" & Me.txt_Num_Camp.text & "' And "
    If Len(data_acc & VbNullString) > 0 Then strwhere = strwhere & "Data_Accettazione like '" & data_acc & "' And "
    If Len(Me.txtdescr_camp.text & vbNullString) > 0 Then strwhere = strwhere & "Descrizione_Campione like '*" & Me.txtdescr_camp & "*' And "
    If Len(Me.txtente_rich.text & vbNullString) > 0 Then strwhere = strwhere & "Denominazione_Ente like '*" & Me.txtente_rich & "*' And "
    If Len(Me.txtprot_rich.text & vbNullString) > 0 Then strwhere = strwhere & "Testo_Protocollo like'*" & Me.txtprot_rich.text & "*' And "
    If Len(data_rich & vbNullString) > 0 Then strwhere = strwhere & "Data_Protocollo='" & data_rich & "' And "
    
    If Len(strwhere) > 0 Then strwhere = Mid$(strwhere, 1, Len(strwhere) - 5)
    
    Form_SM_Protocollo.Filter = strwhere
    Form_SM_Protocollo.FilterOn = True
    
    end sub
    Ho indicato la gestione delle date con vbNullString ma non è corretto. Come si gestisce un valore della data quanto il valore non è inserito nel campo della corrispondente textbox?
    Grazie.
    Secondo me non hai capito a cosa serve quel controllo allora...!
    If Len(data_rich & vbNullString) > 0 Then ...
    Questo codice serve per determinare se il Controllo contiene un Valore, e questo prescinde dal fatto sia Data/Numero/Testo..., ovviamente servirebbe la Validazione di TIPO... che ognuno fa se lo ritiene necessario...
    Se non contiene NULLA NON COMPONE la sintassi relativa a questa parte di Criterio.

    Cosa diversa invece è la SINTASSI di formattazione del criterio che dipende proprio dal FieldType, quindi cambia per Data/Numero/Testo, e si esplica in questa parte del codice:
    strwhere = strwhere & "Data_Protocollo='" & data_rich & "' And "
    Nel tuo caso essendo Data ovviamente questo non va bene..., ma nel post precedente, scivi:

    eddy1973 ha scritto:


    ...
    Per la formattazione delle date nel filtro ho usato la funzione Cdate(me.textbox.value) e passato i valori a variabili as Date e poi inseriti del codice per la gestione del filtro....
    Non trovo traccia di questo nel codice che passi ora...!
    Oltretutto spero tu non abbia un controllo chiamato [textbox].

    Detto questo però, non siamo ancora arrivati a capire la parte di sostanza di cui parlavi:

    eddy1973 ha scritto:


    ...
    Il filtro funziona a patto che entrambe le date sul filtro non siano Null. Ma se una delle due date non è inserita il codice restituisce l'errore "utilizzo non valido di Null". Per una stringa utilizzo isNullString ma per una data come si opera?
    Grazie.
    Se la condizione della Data prevede un Inizio-Fine, quindi presuppone che ENTRAMBE le condizioni siano soddisfatte, è evidente che devi modificare il codice in relazione a questo...
    
    If Len(Me!data_Inizio & vbNullString) > 0  AND Len(Me!data_Fine & vbNullString) > 0 Then strwhere = strwhere & "Data_Protocollo BETWEEN " & clng(Me!Data_Inizio) & " AND " & clng(Me!Data_Fine) & " And "
  • Re: Filtro su evento Keyup

    So bene che:
    If Len(data_rich & vbNullString) > 0 Then ...
    agisce nel controllare se la variabile data_rich risulti vuota, che si tratti di stringa, numerico o data).
    Il problema che mi pongo è come si agisce nel caso di una data nell'utilizzo del controllo. Ovvero nel caso di variabile numerica e testo si usa vbNullString per valutare se alla variabile è assegnato un valore, ma nel caso di una data come si esegue il controllo?
    ?eddy1973 ha scritto: ?
    20 feb 2020, 10:59
    ...
    Il filtro funziona a patto che entrambe le date sul filtro non siano Null. Ma se una delle due date non è inserita il codice restituisce l'errore "utilizzo non valido di Null". Per una stringa utilizzo isNullString ma per una data come si opera?
    Grazie.
    Tutto qui.
Devi accedere o registrarti per scrivere nel forum
20 risposte