Un filtro sotto il click

di il
13 risposte

Un filtro sotto il click

Di certo l'argomento non sarà nuovissimo per i saggi a cui mi vedo costretto a rivolgermi ancora, ma per me lo è tanto.
Questo database che sto organizzando per la mia associazione, è utilizzato da più persone che hanno esigenze diverse per la sua consultazione.
Un solo filtro per tutti non basta!
Ho quindi creato una piccola tabella con quattro campi e per ogni campo alcune "voci" che diventeranno l'oggetto della ricerca.
L'utente seleziona a video il testo e la sua scelta viene salvata in un'altra tabella con un solo record e i quattro campi scelti, che per esempio contengono: "Roma" "2012" "bonifico" "Giovanni".
Nota che fra le voci scelte potrebbe trovarsi anche il carattere jolly " * ".
- Cosa mi consigliereste di fare per ricavare da questo un filtro valido (tutte condizioni AND) e,
- come darlo in pasto ad un REPORT per la stampa del file ?
P.S. se la soluzione dovesse trovarsi in VBA avrei bisogno di tutte quelle istruzioni accessorie tipo APRI, CHIUDI, CLONA, BOOKMAKER ecc (di cui non ho ancora capito bene il funzionamento), e non del costrutto logico di cui mi sento più padrone.
Grazie a chi mi ha letto
Saluti Antonio

13 Risposte

  • Re: Un filtro sotto il click

    Ciao,

    non ho ben capito cosa vuoi fare.

    Potresti fare un esempio di input e di output che vuoi ottenere

    grazie
  • Re: Un filtro sotto il click

    Grazie a te innanzitutto.

    Al momento, dopo aver inputato i dati in una maschera, potrei ritrovarmi, per esempio, nella tabella monorecord Sel_Dati, i seguenti valori:

    nome campo: --> -----fonte ----------mezzo------anno------dipartimento
    valore ---------->--Quote sociali----contanti-----2012---------cultura

    Lo scopo finale è: utilizzare i nomi dei campi e i valori per costruire una stringa "filtro", sempre diversa e "fresca di giornata" per inserirla come filtro (o condizione where) (non so però né dove né come) in un report che lancerei, allo scopo di filtrare i record da stampare.

    La seguente è proprio una stringa tipo (da costruire) che utilizza i dati provvisori sopra riportati :
    ' [fonte]="Quote sociali" And [mezzo]="contanti" And [anno]="2012" And [dipartimento]="Cultura" '

    Può facilmente accadere che il contenuto di uno o più campi inputati siano un ' * '. In quel caso dovrei saltare il campo relativo, dalla composizione della stringa.
    E' tutto.
  • Re: Un filtro sotto il click

    Dovresti fare una query parametrica:
    ti crei una maschera, che chiameremo "ricerca_frm", non associata contenente tutti i campi che vuoi filtrare,
    successivamente crei una query, che chiameremo "ricerca" basata sulla tua tabella e nei criteri dei vari campi inserisci questo codice (questo è relativo al filtro 'fonte')
    Like IIf(IsNull([Forms]![ricerca_frm]![fonte]);"*";"*" & [Forms]![ricerca_frm]![fonte] & "*")
    in particolare con questo esempio, se lasci il campo vuoto vengono inseriti tutti i record altrimenti vengono filtrati quei record che contengono la stringa che hai digitato nella casella "fonte" nella tua maschera di ricerca.
    Fai così per tutti i campi che vuoi filtrare. Alla fine nella tua maschera "ricerca_frm" inserisci un pulsante che ti apre il report di ricerca, che ha come origine dati la tua query "ricerca"
  • Re: Un filtro sotto il click

    PRemesso che non ti daremo codice pronto da incollare, ma indicazioni per portarti a raggiungere la soluzione con i tuoi tempi.

    I filtri o altre azioni utente devono essere gestite da un'interfaccia gestibile.
    In qualsiasi modo questa è una MASCHERA.

    Dovrai pertanto avere nella maschera di visualizzazione la possibilità di inserire o rimuovere i filtri da applicare ai dati, e già nella maschera rendere evidente l'effetto della selezione, se coerente con la richiesta, si passa alla STAMPA del voluto.

    Personalmente eviteri di usare la soluzione suggerita sopra, vale a dire una query PARAMETRICA perchè poco funzinonale nello specifico utilizzo.

    In questo caso la soluzione migliore è adottare la proprietà FILTER della maschera, componendo la STRINGA di CRITERIO leggendo le selezioni dai controlli preposti all'inserimento dei CRITERI.

    Si usa la proprietà FILTER perchè una volta composta, si passa direttamente alla funzione OPENREPORT al parametro WHERE, senza alcuna modifica.

    Ora se tutto quanto ti è stato suggerito è ARABO, è evidente tu debba preoccuparti di colmare un minimo di base, se invece qualche cosa ti è chiaro prova ad approcciare al problema con questi suggerimenti e se trovi difficoltà proponi il tuo codice e vediamo di renderlo funzioante.
  • Re: Un filtro sotto il click

    CAro Alex, ringrazio molto te e anche Marco.
    Condivido pienamente le tue riflessioni a proposito del foraggiamento gratuito di codice, sai, io vengo dalla gavetta e ho passato molti anni della mia vita a programmare e progettare macchine automatiche e quindi non sono alieno a certi tipi di approccio.
    Tant'è vero, nell'attesa ho comunque raggiunto un certo risultato proprio nella direzione da te suggerita non con poche difficoltà e non ti nascondo anche scopiazzando un pò.
    Quello che al momento non mi funziona allegramente è l'aggiornamento della tabella, dove, per comodità, conservo l'ultima inputazione dei dati come default per una occasione successiva.
    Stranamente, ho notato che l'aggiornamento ( a tastiera ferma) avviene anche dopo trenta secondi dal momento che ho digitato l'ultimo tasto.
    Inoltre, quando chiudo la maschera di inputazione del "filtro", mi ripete che ci sono dei dati nel buffer da scaricare ???
    Credo che la cosa faccia lavorare male la procedura e magari a lungo andare compromettere anche i risultati.
    Puoi fare qualcosa per me in questo senso? Ti allego il codice VBA.
    Esso fa un check sui dati della maschera attiva; fa un pacchetto, e alla fine inserisce il tutto nella condizione WHERE della OpenReport. Infine, salva (?) i dati nella tabella "Sel_ent".
    Un'altra cosa strana che ho notato è che qualunque filtro io imponga, la query mi visualizzata solo quei record in cui, in un certo campo ID (che c'entra come un cavolo a merenda), c'è inserito un dato.

    Private Sub Comando17_Click()

    Dim DBCorrente As DAO.Database
    Dim rsEnt As DAO.Recordset
    Dim a, b, c, d, e, f As String

    Set DBCorrente = CurrentDb 'Apertura DB
    Set rsEnt = DBCorrente.OpenRecordset("Sel_Ent", dbOpenDynaset) 'Apertura tabella

    a = "([Q_ST_Ent].[entrata]>0)"
    b = " and [Q_ST_Ent].[canale]=[fonte]"
    c = " and [Q_ST_Ent].[mezzo]=[tramite]"
    d = " and year([Q_ST_Ent].[data_mov])=val([anno])"
    e = " and [Q_ST_Ent].[dipartimento]=[dipartim]"
    f = a

    If (Trim(Me![CasellaCombinata0]) <> "*") And Len(Trim(Me![CasellaCombinata0]) > 0) Then
    f = f & b
    End If
    If (Trim(Me![CasellaCombinata2]) <> "*") And Len(Trim(Me![CasellaCombinata2]) > 0) Then
    f = f & c
    End If
    If (Trim(Me![CasellaCombinata4]) <> "*") And Val(Me![CasellaCombinata4]) > 0 Then
    f = f & d
    End If
    If (Trim(Me![CasellaCombinata6]) <> "*") And Len(Trim(Me![CasellaCombinata6]) > 0) Then
    f = f & e
    End If
    rsEnt.Edit 'abilita la modifica dei dati del record
    rsEnt.Fields("fonte") = Me![CasellaCombinata0]
    rsEnt.Fields("tramite") = Me![CasellaCombinata2]
    rsEnt.Fields("anno") = Me![CasellaCombinata4]
    rsEnt.Fields("dipartim") = Me![CasellaCombinata6]
    rsEnt.Fields("elenca") = f
    rsEnt.Update
    rsEnt.Close 'Chiusura tabella
    DBCorrente.Close 'Chiusura DB
    DoCmd.OpenReport "R_Entrate", acViewPreview, , f
    End Sub
  • Re: Un filtro sotto il click

    La logica è corretta anche se semplificabile.
    Quello che mi sfugge è il motivo per cui apri un recordset gli inserisci i criteri e poi apri un report basato sui dati appena inseriti...... veramente illogico e strano.
  • Re: Un filtro sotto il click

    A quanto pare mi sfugge la logica allora...
    Il mio concetto ispiratore era quello di creare una stringa filtro e darla in pasto al report. Tutto qua.
    Non vedo sinceramente la ridondanza che mi fai rilevare e che sicuramente ci sarà.
    Puoi essere più terra terra? Cosa avrei dovuto o potuto fare in alternativa o per migliorare la fluidità?

    A proposito del fatto che a chiusura della mia mascherina per inputare i parametri-filtro ( e ciò dopo la stampa e quindi dopo la [routine evento]), mi viene segnalato che ci sono dei dati in memoria da scaricare, i quali potrebbero collidere con le modifiche che un altro utente (probabilmente si riferisce alla routine) avrebbe apportato , cosa posso fare ? Mi appare un bel messaggione in mezzo al monitor, sta proprio male.
    come si fa a forzare una chiusura di una tabella da codice VBA tale da forzare il salvataggio dei dati vecchi della maschera, prima di riprendere a manipolarli col codice ?
  • Re: Un filtro sotto il click

    Il recordset non serve assolutamente a nulla nel tuo caso, ma usato in quel modo non serve a nulla in nessun caso...
    L'unica cosa che dovevi fare dopo la costruzione del criterio contenuto nella stringa [f] era aprire il report basato sulla tabella, il parametro Where della funzione OpenReport passa il Criterio alla proprieta Filter del report stesso.

    Per i Recordset suggerisco un'approfondita lettura di qualche testo con i concetti avanzati.
  • Re: Un filtro sotto il click

    Caro Alex, tu mi trovi molto d'accordo, ma io quella strada l'avevo già percorsa ma senza successo.
    Usando una macro condizionale, avevo creato il pacchetto "where" depositando di volta in volta in un campo libero della maschera di input la " f " che cresceva, ma quando alla fine alla funzione ApreReport gli ho dovuto passare la stringa f, in essa mi sono ritrovato giustamente : [Maschere]![M_Selez_entrate]![elenca].[Value] che, a quanto pare, ad Access non diceva niente.
    Era per questo che mi sono rivolto al VBA e quindi a te.
    Il risultato del filtro l'ho colto, sebbene rabberciato come dici tu.
    L'unico inconveniente, nato per conseguenza, è il messaggio che mi da, quando chiudo la maschera di input definitivamente. Poiché non so chiudere la maschera prima di andare in VBA, ACCESS considera il VBA alla stregua di un altro utente che ha manipolato i dati.
    Il messaggio è: "Modifica contemporanea di record"
    Per risolvere questo dilemma, non basteranno tre manuali da leggersi, ma basta una esperienza come la tua e del forum.
    Ti ringrazio sin da ora se potrai darmi una mano.
    Antonio
    Anch'io sono contrario al crossposting ......
  • Re: Un filtro sotto il click

    Credo tu abbia una grande ma grande confusione... alla quale tuttavia noi possiamo dare poco in quanto credo ci siano molti errori di fondo.

    Io il codice lo avrei scritto così
    
    Private Sub Comando17_Click()
    	Dim strSQL As String
    
    	strSQL = "([Q_ST_Ent].[entrata]>0) AND "
    
    	If Len(Trim(Me![CasellaCombinata0].Value) & vbNullstring) > 0 Then strSQL=strSQL & " Q_ST_Ent].[canale]=[fonte] AND "
    	If Len(Trim(Me![CasellaCombinata2].Value) & vbNullstring  > 0 Then strSQL=strSQL & "[Q_ST_Ent].[mezzo]=[tramite] AND "
    	If Len(Trim(Me![CasellaCombinata4].Value) & vbNullstring) > 0 Then strSQL=strSQL & "year([Q_ST_Ent].[data_mov])=val([anno]) AND "
    	If Len(Trim(Me![CasellaCombinata6].Value) & vbNullstring) > 0 Then strSQL=strSQL & "[Q_ST_Ent].[dipartimento]=[dipartim] AND "
    
    	If Len(strSQL)>0 Then strSQL=Mid$(strSQL,1,Len(strSQL)-5)
    
    	DoCmd.OpenReport "R_Entrate", acViewPreview , , strSQL
    End Sub
    Nel tuo codice proposto ci sono gravi errori di dichiarazioni come ti dicevo e molta confusione non utile...!
    La mia proposta è più pulita e semplice, vedi tu...

    Mi rimane tuttavia un grosso dubbio sui CRITERI che mi sono limitato a COPIARE, solo a titolo di esempio:
    
    [Q_ST_Ent].[mezzo]=[tramite]
    da dove viene [tramite]....?
  • Re: Un filtro sotto il click

    Mi rendo conto Alex che scopiazzare il lavoro altrui impone percorsi molto lunghi per raggiungere efficienza e linearità, ma sai anche bene che mi ci vorrebbe una vita per raggiungere le tue competenze a menadito. E' facile che i miei sforzi, dopo questo mio secondo impegno di cui mi sono caricato per conto della mia associazione debbano finire e così anche le rudimentali conoscenze finiscano nel dimenticatoio.
    Ma non si sa mai.
    In questo caso prenderei la strada maestra per affrontare con serietà le nuove difficoltà.
    Per ora ringrazio molto coloro che mi hanno aiutato e a cui debbo molto; te compreso.

    Sì il tuo tocco aveva della professionalità anche osservando il fatto che hai sottratto l'ultimo " AND " (ormai inutile) dalla stringa finale.
    Spero, approfondendo ancora, e accrescendo le mie conoscenze, di rimpiazzare completamente la procedura che ti avevo sottoposto, con altro codice più adatto.
    Infatti a intorbidire ulteriormente la minestra avevo creato una tabella con la quaterna di campi di cui faceva parte anche "tramite", e bla. bla.. bla.

    Comunque anche questo problema è superato. Spero di poterne proporre altri meno banali in seguito.

    Ciao
  • Re: Un filtro sotto il click

    Ciao a tutti,
    sono un novellino di access e mi è successo questo:
    ho la versione 2013 e mi hanno dato un programma con un db da migrare a sql.
    prima della migrazione non dava errori, da quando l'ho collegato al db sql ,in una sottomaschera esce l'errore di cui parlate e cioè :
    durante la corrente sessione di modifica il record è stato modificato da un altro utente. salvando le proprie modifiche si sovrascriveranno i cambiamenti dell'altro utente
    nello specifico succede che io seleziono dalla combo box una stringa e fin qui tutto ok, poi vado a mettere la spunta su una check box ed esce l'errore.

    il "codice" che trovo in "dopo aggiornamento" di propietà\evento della combo box è :

    Private Sub DescrizioneCiclo_AfterUpdate()
    Me.Form.Requery
    End Sub

    mentre quello che trovo nella ceck box che va in errore è :
    Private Sub Preferenziale_AfterUpdate()
    DoCmd.SetWarnings False
    DoCmd.RunMacro "EliminaFlagPreferenzialeneiCicli"
    End Sub

    la macro esegue un comando aggiorna
    e questa query:

    UPDATE Tab002ElencoCicli SET Tab002ElencoCicli.Preferenziale = No
    WHERE (((Tab002ElencoCicli.IDciclo)<>[Forms]![Tab001AnagraficaArticoli1]![Sottomaschera Tab002ElencoCicli].[Form]![IDciclo]) AND ((Tab002ElencoCicli.CodiceArticolo)=[forms]![Tab001AnagraficaArticoli]![CodiceArticolo]));

    se serve e mi spiegate come fare inserisco anche degli screenshot

    Vi prego potete aiutarmi?
    grazie a tutti in anticipo!

    Ps. mi scuso per eventuali errori, ma come dicevo sono un novellino.
  • Re: Un filtro sotto il click

    X xyz.net: per richiedere aiuto devi creare una nuova discussione.
    Hai postato su una discussione altrui e tra l'altro del 2013.

    Chiudo il thread
Devi accedere o registrarti per scrivere nel forum
13 risposte