Filtrare query

di il
9 risposte

Filtrare query

Ciao a tutti e intanto grazie a tutti,

volevo sapere se esite un metodo più rapido per filtrare colonne e mi spiego:

ho filtrato due colonne utilizzndo il comando:

me.filter=(condizione)

e funziona. 

del risultato devo filtrare una terza colonna testo dove però devo ricercare una parte di stringa. Il quesito è devo leggere tutti i dati della colonna rimanenti e controllarli con un “like”  il che vorrebbe dire estrarre una nuova query, oppure c'è un metodo più rapido?

Grazie 

9 Risposte

  • Re: Filtrare query

    Non ho compreso bene ma mi chiedo perchè non aggiungi il criterio nella condizione 

  • Re: Filtrare query

    Forse perchè non lo conosco. Io uso ad esempio

    me.filter="[ID_Lotti]"  &  bp

    me.requery

    ora sto provando ad usare 

    Dim z1 as string

    z1=me.filtro_testo  

    me.filter ="[descrizione] LIKE ‘ “ & z1 “ ' ” 

    me.requery

    ma non mi retituisce nulla

    Grazie

  • Re: Filtrare query

    Parli di aver filtrato due colonne ma ne vedo una e mi sembra scritta anche male. Poi quale sarebbe la terza e come devi filtrata

     Praticamente dicci i nomi dei campi e le condizioni da verificare in AND 

  • Re: Filtrare query

    Ho corretto scrivendo il codice. Ora inserisco il codice:

    Private Sub filtro_bpark_AfterUpdate()
    Dim bp As Long
    Dim stringaSQL2 As String, variabile As Integer
    bp = Me.filtro_bpark
    Me.Filter = "[ID_BPark]= " & bp
    Me.FilterOn = True
    Me.Requery
    filtro_lotto.Value = Null
    variabile = bp
    stringaSQL2 = "SELECT A0100_Lotti.ID_Lotti, A0100_Lotti.Nome1 FROM A0100_Lotti, D0000_Coll_B_Park_Lotti WHERE (((A0100_Lotti.ID_Lotti)=[D0000_Coll_B_Park_Lotti].[Lotti]) AND ((D0000_Coll_B_Park_Lotti.B_Parks) =" & bp & "));"
    filtro_lotto.ColumnCount = 2
    filtro_lotto.ColumnWidths = "0in.;1in."
    filtro_lotto.RowSourceType = "Table/Query"
    filtro_lotto.RowSource = stringaSQL2
    End Sub
    
    Private Sub filtro_lotto_AfterUpdate()
    Dim bp As Long
    Dim stringaSQL2 As String, variabile As Integer
    bp = Me.filtro_lotto
    Me.Filter = "[ID_Lotti]= " & bp
    Me.Requery
    End Sub
    
    Private Sub filtro_testo_LostFocus()
    Dim z1 As String
    z1 = Me.filtro_testo
    Me.Filter = "[DESCRIZIONE] LIKE '" & z1 & "'"
    Me.Requery
    End Sub
    

    Il campo [ID_Bpark] viene filtrato da filtro_bpark che proviene da una casella combinata.

    Il campo [ID_Lotti] viene filtrato da filtro_lotto che proviene da una casella combinata ma in cascata da [ID_Bpark].

    quello che non funziona è

    il campo [Descrizione] che viene filtratoda  filtro_testo che proviene da una casella testo

    Ho provato anche

    Me.Filter = "[DESCRIZIONE]= SELECT  H0000_Property_visualizza.[DESCRIZIONE] FROM H0000_Property_visualizza WHERE (((H0000_Property_visualizza.[DESCRIZIONE]) Like " * proget * "));"

    dove cercavo la stringa *proget*

    ma non funziona

    Grazie

     
  • Re: Filtrare query

    Ciao.

    Quando dici non funziona, perchè non funziona?
    Da errore il codice, da un risultato vuoto?

    Inoltre non ho mai passato in modo diretto una query al comando filter.

    Dirò una castroneria, ma secondo me non è possibile ottenere il risultato desiderato passando direttamente la query. Nel senso che non viene eseguita la query. Ma come detto devo approfondire la cosa.
    Solitamente si passa solo il parametro da ricercare dopo aver eseguito la query,

  • Re: Filtrare query

    Ciao 

    nella prima versione da' risultato vuoto, nella seconda errore tipo o errore di sintassi.

    Non volevo ripassare attraverso query, perchè sarebbe ripetizione di ripetizione. 

    Se non risolvo farò cosi'

  • Re: Filtrare query

    Ciao, se posso permettermi… giusto un paio di cosucce.

    C’è un po’ di confusione e di errorini basici

    Per esempio:

    • La Me.Requery non seve ai fini dell’azione Filter
      • Se sei su Maschera la Me.Requery non serve
      • Se sei su Maschere Continue la Me.Requery non serve
      • se devi fare il refresh di una Sub Form allora Me,SubForm.Requery
    • Dopo l’impostazione Filter è bene anche impostare il FilterOn = True
    • La LIKE richiede il passaggio degli Asterischi che vanno a racchiudere la stringa da ricercare
      • un solo * iniziale per la ricerca “Finiscecon”
      • un solo * alla file per la ricerca "Inizia  con"
      • due * per la ricerca “in Parte” (che contiene la stringa da ricercare)

    Nel tuo caso … Esempio:

    Me.Filter = "[DESCRIZIONE] Like '*" & z1 & "*'"
    Me.FilterOn = True

    Mentre in questa parte di codice c’è un po’ di confusione e dichiarazioni un po’ strane e inutili

    Private Sub filtro_bpark_AfterUpdate()
    Dim bp As Long
    Dim stringaSQL2 As String, variabile As Integer
    bp = Me.filtro_bpark
    Me.Filter = "[ID_BPark]= " & bp
    Me.FilterOn = True
    Me.Requery
    filtro_lotto.Value = Null
    variabile = bp
    stringaSQL2 = "SELECT A0100_Lotti.ID_Lotti, A0100_Lotti.Nome1 FROM A0100_Lotti, D0000_Coll_B_Park_Lotti WHERE (((A0100_Lotti.ID_Lotti)=[D0000_Coll_B_Park_Lotti].[Lotti]) AND ((D0000_Coll_B_Park_Lotti.B_Parks) =" & bp & "));"
    filtro_lotto.ColumnCount = 2
    filtro_lotto.ColumnWidths = "0in.;1in."
    filtro_lotto.RowSourceType = "Table/Query"
    filtro_lotto.RowSource = stringaSQL2
    End Sub

    Assegnare un nome ad una variabile come variabile… fa un po’ strano e non si capisce cosa sia variabile
    Idem per altre dichiarazioni.
    Se dichiari un Integer per esempio usare:    intTuoNome
    per una variabile Long per esempio:             lngTuoNome
    per una variabile Stringa per esempio:          strTuoNomeù

    Esempio:

    Dim intVariabile As Integer
    Dim lngBl As Long
    Dim strSql2 As String

    Quando si dichiarano le variabili, oggetti, etc… il nome assegnato deve, a colpo d’occhio, ricondurre (far capire) al tipo di variabile dichiarata senza dover andarsi a cercare nel codice dove e quando è stata definita per capire di cosa si tratta.

    Insomma, va risistemato un po’ tutto, la scrittura, la logica, le dichiarazioni, l’assegnazione dei nomi alle variabili, etc…

    Poi per carità, in qualche modo le due righe di codice funzioneranno pure, …ma così non si fa! ..per essere garbati diciamo che è incomprensibile? ;))

    A scanso di equivoci potrei anche riscriverti il codice da te postato… però non sarebbe giusto  ;)) 
    …Chissà perchè, ma non c'è neanche una Dim o variabili da dichiarare.

    Private Sub filtro_bpark_AfterUpdate()
    ' set data source
    filtro_lotto.RowSource = "SELECT A0100_Lotti.ID_Lotti, A0100_Lotti.Nome1 FROM A0100_Lotti, D0000_Coll_B_Park_Lotti WHERE (((A0100_Lotti.ID_Lotti)=[D0000_Coll_B_Park_Lotti].[Lotti]) AND ((D0000_Coll_B_Park_Lotti.B_Parks) =" & bp & "));"
    filtro_lotto.RowSourceType = "Table/Query"
    filtro_lotto.ColumnCount = 2
    filtro_lotto.ColumnWidths = "0in.;1in."
    ' set Filter 
    Me.Filter = "[ID_BPark]= " & Val(Me.filtro_bpark)
    Me.FilterOn = True
    End Sub
    
    Private Sub filtro_lotto_AfterUpdate()
    Me.Filter = "[ID_Lotti]= " & Val(Me.filtro_lotto)
    Me.FilterOn = True
    End Sub
    
    Private Sub filtro_testo_LostFocus()
    Me.Filter = "[DESCRIZIONE] LIKE '*" & Me.filtro_testo & "*'"
    Me.FilterOn = True
    End Sub

    Forse così è un pochettino più chiaro…. non entro nel merito del perchè su evento LostFocus e non entro in merito al contenuto della stringa Sql… sembra sia destinata ad un elenco TextBox o Combox… mancherebbe, visto che lo fai da codice, la dichiarazione per le proprietà Colonna Associata…. 
    ma forse sarà meglio parlarne quando il resto del codice è funzionante secondo le tue aspettative.
    Ciao 

  • Re: Filtrare query

    Quando si gestiscono N criteri serve avere una logica di lavoro…

    Se deleghi il codice al singolo Controllo fallisci subito.

    Il Criterio va sempre ricostruito partendo da zero, quindi riprocessando tutti i controlli che fannno parte delle Opzioni.

    A quel punto usare Filter invece che una Query Parametrica può essere utile… (ci sarebbe poi da fare un discorso serio su SQL Injection).

    Quindi scrivi una funzione che, leggendo tutti i controlli costruisce la Stringa da passare a Filter, e poi a prescindere da quale controllo hai modificato richiami la funzione e ripassi a Filter.

    Esempio:

    Function fFilter()
    	On Error Goto Err_Handler
    	Dim sWHR	As String
    	If Len((Me.filtro_lotto & vbNullstring)>0 Then sWHR=sWHR & "[ID_Lotti]= " & Val(Me.filtro_lotto) & " AND "
    	If Len((Me.filtro_testo & vbNullstring)>0 Then sWHR=sWHR & "[DESCRIZIONE] LIKE '* " & (Me.filtro_testo ) & "*' AND "
    	If Len((Me.filtro_XX1 & vbNullstring)>0 Then sWHR=sWHR & "[Campo_XX1]= " & Me.filtro_XX1 & " AND "
    	If Len((Me.filtro_XX2 & vbNullstring)>0 Then sWHR=sWHR & "[Campo_XX2]= " & Me.filtro_XX2 & " AND "
    	If Len((Me.filtro_XXn & vbNullstring)>0 Then sWHR=sWHR & "[Campo_XXn]= " & Me.filtro_XXn & " AND "
    		
    	If Len(sWHR)>0 Then
    	   sWHR=Mid$(sWHR,1, Len(" AND ")-1)
    	   Me.Filter=sWHR
    	   Me.FilterON=True
    	Else
    Exit_Here:
    	   Me.FilterOn=False
    	End If
    	Exit Function
    Err_Handler:
    	Select Case Err.Number
    		' Case Is=nnn: MsgBox.....
    		Case Else: Resume Exit_Here
    	End Select
    End Function

    Fatto questo da qualsiasi parte o in qualsiasi controllo vai a modificare un criterio… ti basta richiamare la Funzione, uso la funzione così richiamabile da Proprietà dell'evento senza scrivere la Routine evento…

    Ad esempio su [filtro_bpark] invece di attivare la RoutineEvento, basta scrivere:

    DopoAggiornamento 	=fFilter()
  • Re: Filtrare query

    Ciao grazie a tutti,

    ho risolto inserendo un pulsante.

    Grazie

Devi accedere o registrarti per scrivere nel forum
9 risposte