Filtro multiplo textbox su sottomaschera

di il
16 risposte

Filtro multiplo textbox su sottomaschera

Buona Domenica a tutti, vi scrivo poichè non riesco a gestire questa tipologia di filtro dinamico o in parte, mi spiego.
Ho una form non collegata tramite campi master alla sottomaschera. Nella sottomaschera, visualizzo le info relative alla tblAnagrafiche con una semplice query di selezione delle varie informazioni con una serie di iif presenti anche nel recordsource della form principale.

Nella form invece, ho creato una serie di campi textbox dove vado a filtrare i campi nella sottomaschera tramite una funzione impostando quindi anche la record source. La funzione e quindi il recordsource è impostato così:
Function SearchCriteria()
Dim DenomStr, CfPivaStr, TelStr, CellStr As String
Dim task, strCriteria As String
  
    If IsNull(Me!txtRagDenom) Then
        DenomStr = "IIf([Ragione Sociale] Is Null,[Cognome]+' '+[Nome],IIf([Ragione Sociale] Is Not Null,[Ragione Sociale])) Like '*'"
    Else
        DenomStr = "IIf([Ragione Sociale] Is Null,[Cognome]+' '+[Nome],IIf([Ragione Sociale] Is Not Null,[Ragione Sociale])) Like ""*"" & txtRagDenom & ""*"""
    End If

    If IsNull(Me!txtCFPiva) Then
        CfPivaStr = "(IIf([PIva] Is Null,[CF],IIf([PIva] Is Not Null,[CF]+' - '+[PIva])) Like '*')"
    Else
        CfPivaStr = "(IIf([PIva] Is Null,[CF],IIf([PIva] Is Not Null,[CF]+' - '+[PIva])) Like ""*"" & txtCFPiva & ""*"")"
    End If
      
    If IsNull(Me!txtTel) Then
        TelStr = "(IIf([Telefono2] Is Null,[Telefono1],IIf([Telefono2] Is Not Null,[Telefono1]+' - '+[Telefono2])) Like '*')"
    Else
        TelStr = "(IIf([Telefono2] Is Null,[Telefono1],IIf([Telefono2] Is Not Null,[Telefono1]+' - '+[Telefono2])) Like ""*""& txtTel & ""*"")"
    End If
    
    If IsNull(Me!txtCell) Then
        CellStr = "(IIf([CellularePersonale2] Is Null,[CellularePersonale1],IIf([CellularePersonale2] Is Not Null,[CellularePersonale1]+' - '+[CellularePersonale2])) Like '*')"
    Else
        CellStr = "(IIf([CellularePersonale2] Is Null,[CellularePersonale1],IIf([CellularePersonale2] Is Not Null,[CellularePersonale1]+' - '+[CellularePersonale2])) Like ""*""& txtCell & ""*"")"
    End If
    
	strCriteria = DenomStr & "And" & CfPivaStr & "And" & TelStr & "And" & CellStr
	task = "SELECT tblAnagrafiche.IDAnagrafica, IIf([Ragione Sociale] Is Null,[Cognome]+' '+[Nome],IIf([Ragione Sociale] Is Not Null,[Ragione Sociale])) AS Denominazione, tblAnagrafiche.Cliente, tblAnagrafiche.Fornitore, tblAnagrafiche.Dipendente, tblAnagrafiche.Attiva, IIf([Telefono2] Is Null,[Telefono1],IIf([Telefono2] Is Not Null,[Telefono1]+' - '+[Telefono2])) AS Telefono, IIf([CellularePersonale2] Is Null,[CellularePersonale1],IIf([CellularePersonale2] Is Not Null,[CellularePersonale1]+' - '+[CellularePersonale2])) AS Cellulare, tblAnagrafiche.Email1, tblAnagrafiche.Fax, IIf([PIva] Is Null,[CF],IIf([PIva] Is Not Null,[CF]+' - '+[PIva])) AS CodFisPiva FROM tblAnagrafiche where " & strCriteria
	
	Me.[FormContattiElenco].Form.RecordSource = task
	Me.[FormContattiElenco].Form.Requery
Dopo l'aggiornamento dei vari campi textbox, viene richiamata la funzione e tutto funziona se non chè, laddove cerco di filtrare i dati tramite la txtTel o txtCell la sottomaschera mi restituisce la schermata vuota laddove sia il campo Cf o Piva sono vuoti...come potrei eludere la cosa? Cosa manca nel codice?
EDIT.
I campi PIva e CF prevedono come formato di input rispettivamente AAAAAAAAAAA;;_ e AAAAAAAAAAAAAAAA;;_

16 Risposte

  • Re: Filtro multiplo textbox su sottomaschera

    Premesso che commetti errori di base abbastanza evidenti nella dichiarazione delle variabili..., tuttavia funziona perché Access nel non essere correttamente istruito dichiara le variabili Variant...

    Ti suggerirei di provare a leggere il 3D sotto e provare a considerare un modo un Po più finito e tecnicamente pulito di strutturare CRITERI MULTIPLI... perché la dove il campo non è valorizzato la soluzione migliore è che non sia usato per un criterio inutile...
  • Re: Filtro multiplo textbox su sottomaschera

    Ciao Alex, grazie mille per l'intervento.
    Ho apportato le dovute modifiche ho adattato il filtro come nel link segnalatomi e poichè ho le 2 maschere, impostato il record source con così:
    	task = "SELECT tblAnagrafiche.IDAnagrafica, IIf([Ragione Sociale] Is Null,[Cognome]+' '+[Nome],IIf([Ragione Sociale] Is Not Null,[Ragione Sociale])) AS Denominazione, tblAnagrafiche.Cliente, tblAnagrafiche.Fornitore, tblAnagrafiche.Dipendente, tblAnagrafiche.Attiva, IIf([Telefono2] Is Null,[Telefono1],IIf([Telefono2] Is Not Null,[Telefono1]+' - '+[Telefono2])) AS Telefono, IIf([CellularePersonale2] Is Null,[CellularePersonale1],IIf([CellularePersonale2] Is Not Null,[CellularePersonale1]+' - '+[CellularePersonale2])) AS Cellulare, tblAnagrafiche.Email1, tblAnagrafiche.Fax, IIf([PIva] Is Null,[CF],IIf([PIva] Is Not Null,[CF]+' - '+[PIva])) AS CodFisPiva FROM tblAnagrafiche where " & strWH
    	Me.[FormContattiElenco].Form.RecordSource = task
    Ho dovuto valutare questo tipo di filtro poichè con gli iif avrei perso la possibilità di filtrare 2 campi uniti ma, correggimi se sbaglio.
    Ora però ho un nuovo problema cioè relativo all'apertuta di un report. Se non filtro, è tutto ok mentre se lascio attivi dei filtri ed apro il report, mi chiede il "value" del campo valorizzato.
    Questo è il codice che ho inserito nel btn per l'apertura del report ( i trattini stanno per le varie operazioni filtro)
    Private Sub btnVisualizzaSel_Click()
    Dim strWH As String
    If Len(Me!txtRagDenom.Value & vbNullString) > 0 Then strWH = strWH & "(IIf([Ragione Sociale] Is Null,[Cognome]+' '+[Nome],IIf([Ragione Sociale] Is Not Null,[Ragione Sociale])) Like ""*"" & txtRagDenom.Value & ""*"")" & " And "
    -
    -
    -
    If Len(strWH) > 0 Then strWH = Mid$(strWH, 1, Len(strWH) - 5)
        
        strCriteria = strWH
        DoCmd.OpenReport "RptElencoAnag", acViewReport, , strCriteria
    End Sub
  • Re: Filtro multiplo textbox su sottomaschera

    zio Ken ha scritto:


    ....
    Questo è il codice che ho inserito nel btn per l'apertura del report ( i trattini stanno per le varie operazioni filtro)
    Private Sub btnVisualizzaSel_Click()
    Dim strWH As String
    If Len(Me!txtRagDenom.Value & vbNullString) > 0 Then strWH = strWH & "(IIf([Ragione Sociale] Is Null,[Cognome]+' '+[Nome],IIf([Ragione Sociale] Is Not Null,[Ragione Sociale])) Like ""*"" & txtRagDenom.Value & ""*"")" & " And "
    -
    -
    -
    If Len(strWH) > 0 Then strWH = Mid$(strWH, 1, Len(strWH) - 5)
        
        strCriteria = strWH
        DoCmd.OpenReport "RptElencoAnag", acViewReport, , strCriteria
    End Sub
    Scusa ma che senso ha questa cosa, che mi pare errata...:
    
    strWH = strWH & "(IIf([Ragione Sociale] Is Null,[Cognome]+' '+[Nome],IIf([Ragione Sociale] Is Not Null,[Ragione Sociale])) Like ""*"" & txtRagDenom.Value & ""*"")" & " And "
    Scritto così non era meglio:
    
    strWH = strWH & "(IIf([Ragione Sociale] Is Null,[Cognome]+' '+[Nome],[Ragione Sociale]) Like '*" & txtRagDenom.Value & "*')" & " And "
    Ovviamente anche per le altre... se serve.
  • Re: Filtro multiplo textbox su sottomaschera

    Ciao Alex, relativamente quel campo il tuo suggerimento è ottimo per gli altri campi aimè, devo continuare con quella formattazione per legare i campi magari, rendere più pulito il codice....relativamente al pulsante? come potrei operare? Perchè è il mio limite più grande cercare di passare i valori...come potrei impostare?
  • Re: Filtro multiplo textbox su sottomaschera

    Rieccomi, ho spulciato su internet ed ho seguito quanto descritto, forse con qualche imprecisazione poichè non funge...
    https://msdn.microsoft.com/en-us/vba/access-vba/articles/docmd-openreport-method-access

    Se lancio il comando sotto descritto, non mi filtra i campi (credo sia il nome filtro poichè l'ho utilizzato nella maschera per filtrare i campi)
            DoCmd.OpenReport "RptElencoAnag", acViewReport, strWH
    Nella maschera ho inserito il comando "Me.Filter = strWH" cercando di passare quindi il filtro sull'apertura report ma nulla...mi dice tipo non corrispondente
        DoCmd.OpenReport "RptElencoAnag", acViewReport, , , Me.Filter
    vi pregherei solo di non lasciarmi così, con il post a metà...grazie mille
  • Re: Filtro multiplo textbox su sottomaschera

    Devi cambiare la riga di codice in
    
        DoCmd.OpenReport "RptElencoAnag", acViewReport, , Me.Filter
    
  • Re: Filtro multiplo textbox su sottomaschera

    Ciao CarlettoFed, grazie mille per la risposta.
    Purtroppo anche in questo caso, impostando l'apertura del report con il codice suggerito, mi richiede di "Immettere valore parametro" relativo al campo cui effettuo il filtro.
    In pratica, sulla maschera principale imposto i criteri filtro tramite le textbox e la sottomaschera mi restituisce i valori filtrati...come potrei passare il parametro dalla maschera al report?
    Perchè con il codice suggeritomi penso che vada bene nel caso in cui i record vengono filtrati nella stessa maschera in cui viene lanciata l'apertura del report (credo )
  • Re: Filtro multiplo textbox su sottomaschera

    Cambia il codice
     DoCmd.OpenReport "RptElencoAnag", acViewReport, , Me.Filter
    in
     DoCmd.OpenReport "RptElencoAnag", acViewReport, , strWH
    perchè la maschera principale non ha il filtro.
    Se non devesse funzionare, l'origine dati del report è una query che ha dei parametri di filtro?
    Nel caso positivo è corretto il comportamento di access, devi cambiare l'origine record del report con una query uguale a quella che usi attualmente ma senza i parametri tanto il filtro poi lo effettua il parametro strWH che passi al report all'atto dell'apertura.
  • Re: Filtro multiplo textbox su sottomaschera

    zio Ken ha scritto:


    Ciao CarlettoFed, grazie mille per la risposta.
    Purtroppo anche in questo caso, impostando l'apertura del report con il codice suggerito, mi richiede di "Immettere valore parametro" relativo al campo cui effettuo il filtro.
    In pratica, sulla maschera principale imposto i criteri filtro tramite le textbox e la sottomaschera mi restituisce i valori filtrati...come potrei passare il parametro dalla maschera al report?
    Perchè con il codice suggeritomi penso che vada bene nel caso in cui i record vengono filtrati nella stessa maschera in cui viene lanciata l'apertura del report (credo )
    Era ovvio non potesse risolvere dal momento che l'anomalia è originata PRIMA, ovvero nel momento della valorizzazione...
    Dirti perchè sinceramente non saprei... personalmente credo che se tu facessi un DEBUG.PRINT della stringa [strWH] potresti quasi certamente comprendere quale elemento stona...
  • Re: Filtro multiplo textbox su sottomaschera

    @Alex ha scritto:


    Era ovvio non potesse risolvere dal momento che l'anomalia è originata PRIMA, ovvero nel momento della valorizzazione...
    Dirti perchè sinceramente non saprei... personalmente credo che se tu facessi un DEBUG.PRINT della stringa [strWH] potresti quasi certamente comprendere quale elemento stona...
    Ciao Alex, ho effettuato quanto suggerito e, nella finestra immediata, mi riporta il seguente codice:
    (IIf([Ragione Sociale] Is Null,[Cognome]+' '+[Nome],[Ragione Sociale]) Like '*a*')
    
    che collegata al RecordSource effettivamente agisce come impostato...
    Nel codice per l'apertura del report ho inserito
    Dim strWH As String
    
    Me.Filter = strWH
    DoCmd.OpenReport "RptElencoAnag", acViewReport, , Me.Filter
    ma giustamente non va perchè non riesce a leggere i valori da trasferire al filtro? Purtroppo sto brancolando nel buio perchè ho spulciato su internet ma non riesco a venirne a capo...
  • Re: Filtro multiplo textbox su sottomaschera

    A cosa serva passare la stringa alla proprietà Filter.... Non so proprio... bastava passare la stringa strWH alla funzione OpenForm... come avevi fatto....
    Quello che ti invito a studiare con attenzione invece è proprio il risultato... del criterio...
    Fai ù a prova banale, apri una query ci metti il predicato SQL della tabella da aprire e gli applichi come condizione WHERE quella stringa che hai postato... e vedi cosa accade...
  • Re: Filtro multiplo textbox su sottomaschera

    @Alex ha scritto:


    A cosa serva passare la stringa alla proprietà Filter.... Non so proprio... bastava passare la stringa strWH alla funzione OpenForm... come avevi fatto....
    Quello che ti invito a studiare con attenzione invece è proprio il risultato... del criterio...
    Fai ù a prova banale, apri una query ci metti il predicato SQL della tabella da aprire e gli applichi come condizione WHERE quella stringa che hai postato... e vedi cosa accade...
    Ecco, ho ripristinato quanto rammentatomi
    Private Sub btnVisualizzaSel_Click()
    	DoCmd.OpenReport "RptElencoAnag", acViewReport, , strWH
    End Sub
    Ho fatto come mi hai detto ma la query restituisce il risultato giusto, inserendo il valore della finestra immediata al posto della where
    SELECT tblAnagrafiche.IDAnagrafica, IIf([Ragione Sociale] Is Null,[Cognome]+' '+[Nome],IIf([Ragione Sociale] Is Not Null,[Ragione Sociale])) AS Denominazione, tblAnagrafiche.Cliente, tblAnagrafiche.Fornitore, tblAnagrafiche.Dipendente, tblAnagrafiche.Attiva, IIf([Telefono2] Is Null,[Telefono1],IIf([Telefono2] Is Not Null,[Telefono1]+' - '+[Telefono2])) AS Telefono, IIf([CellularePersonale2] Is Null,[CellularePersonale1],IIf([CellularePersonale2] Is Not Null,[CellularePersonale1]+' - '+[CellularePersonale2])) AS Cellulare, tblAnagrafiche.Email1, tblAnagrafiche.Fax, IIf([PIva] Is Null,[CF],IIf([PIva] Is Not Null,[CF]+' - '+[PIva])) AS CodFisPiva FROM tblAnagrafiche where
      (IIf([Ragione Sociale] Is Null,[Cognome]+' '+[Nome],[Ragione Sociale]) Like '*a*')
    
    ma adesso, quando pigio sul pulsante per l'apertura del report mi restituisce tutti i valori, non considerando quindi la condizione "where"...
    Potrebbe essere perchè i criteri di filtro sono all'interno di una Function e richiamati sulle textbox tramite la Call?
  • Re: Filtro multiplo textbox su sottomaschera

    Pian piano, a rate, escono gli accrocchi...
    Se la query funziona, il probelma è sicuramente altro..., dove ora lo devi trovare tu facendo DEBUG... che ricorda è INDISPENSABILE.
  • Re: Filtro multiplo textbox su sottomaschera

    ....IIf([Ragione Sociale] Is Null,[Cognome]+' '+[Nome],IIf([Ragione Sociale] Is Not Null,[Ragione Sociale])) AS Denominazione,...
    Intanto, se la RagioneSociale è null, non serve testare anche se non è null quindi :
    
    IIf([Ragione Sociale] Is Null,[Cognome]+' '+[Nome],[Ragione Sociale]) AS Denominazione,
    proseguendo con le approssimazioni, se (ri)definisci nella select un campo che chiami Denominazione tanto vale che nella where poi utilizzi quel campo ... e quindi io scriverei così una parte della where :
    where .... Denominazione Like '*a*' ....
Devi accedere o registrarti per scrivere nel forum
16 risposte