CASELLE DI RIEPILOGO

di il
85 risposte

85 Risposte - Pagina 2

  • Re: CASELLE DI RIEPILOGO

    29/06/2023 - @Alex ha scritto:


    Un po meno spocchia… io non ho bisogno…, e studiare è possibile a tutti anche senza l'accesso al Forum e senza incappare in malattie croniche…!

    La tua NON E' una Query Parametrica, è un pasticcio che viene usato da chi usa Access e non sa usare le query parametriche, questo metodo è decisamente poco utile, anzi pericoloso, non scalabile deleterio quando si usano RDBMS ecc…

    L'uso dei PARAMETERS è un'altra cosa, tutt'altra cosa…  leggi, anzi studia quello che ti ho postato.

    Nel tuo caso avendo una MultiSelezione devi usare la CLAUSOLA SQL IN, ed inserire l'elenco Valori, gestendo appropriatamente la sintassi a seconda siano Valori di tipo Numerico, Testo o Date… ovviamente quel metodo non può andare bene.

    Le listbox quando impostate in MultiSelezione, possono essere iterate nella Collection ItemSelected, ben documentato nel Sito MS, che ti invito a cercare, nel quale trovi anche il codice utile.

    Grazie mille! 

    cerco!

  • Re: CASELLE DI RIEPILOGO

    29/06/2023 - Pattygirl ha scritto:


    29/06/2023 - By65Franco ha scritto:


    Ciao,

    la query che devi filtrare da dove la richiami? 

    Ho inserito il percorso della casella di riepilogo nei criteri della query. Ma non filtra gli items

    Voglio dire:

    • hai una Form con una Casella di Riepilogo Multi Scelta: SI
    • selezioni le voci che ti interessano (uno o più elementi della casella di riepilogo) ESATTO
    • apri la query in visualizzazione 
      • come apri la Query? vai nel riquadro di spostamento ed esegui la query o la richiami dalla FORM: fatto un pulsante dove ho inserito dopo aggiornamento me. Requery

    Concordo con @Alex in merito alla Query Parametrica…

    Ma visto che sei agli inizi e che hai già creato la tua form e la tua casella di riepilogo, a mio avviso potrebbe essere più semplice continuare a lavorare sulla Form e utilizzare la Query che hai per alimentare una SubForm da inserire nella tua Form.

    Il mio suggerimento potrebbe essere questo:

    • Hai una Form
    • Hai una Casella di Riepilogo
    • Hai una Query
    1. Inserisci nella Form una SubForm con origine dati la tua Query alla quale toglierai la parte parametrica che in questo caso non servirà.
    2. La SubForm sarà in Visualizzazione Foglio Dati e in questo modo visualizzi la tua Query popolata esattamente come prima. 
    3. Inserisci due Pulsanti uno per applicare il Filtro e uno per Resettare il Filtro
    4. Inserisci in Vba su Pulsante Filtro, la lettura degli elementi selezionati nella Casella di Riepilogo
    5. Inserisci in Vba su Pulsante Reset, il ripristino del filtro e delle selezioni eseguite nella Casella di Riepilogo 

    Per darti una traccia ho preso una tabella qualsiasi di un DB che ho fatto quanto segue:

    • Tbl_Colori … tabella
    • Qry_Colori … query su Tbl_Colori 
    • Frm_Colori  … la form contiene due Pulsanti, una Casella di Riepilogo e una SubForm
      • btnFilter … pulsante per applicare il filtro
      • btnFiltreReset … pulsante per resettare filtro e selezioni casella di riepilogo
      • ElencoColori … casella di riepilogo con multi scelta estesa
      • SFrm_Colori … sub form con origine record la query Qry_Colori

    La form si presenta semplicemente in questo modo (è solo un esempio)  ;)

          

    e il codice in Vba per la Form, la subform e per i pulsanti sarà:

    Option Compare Database
    Option Explicit
    
    ' APPLY FILTER
    Private Sub btnFilter_Click()
    Me.SFrm_Colori.Form.Filter = MyFilterForm
    Me.SFrm_Colori.Form.FilterOn = True
    End Sub
    
    ' RESET FILTER
    Private Sub btnFilterReset_Click()
    Me.SFrm_Colori.Form.FilterOn = False
    Me.ElencoColori.Requery
    End Sub
    
    ' SET FILTER
    Private Function MyFilterForm() As String
    MyFilterForm = vbNullString
    Dim varSel As Variant
    For Each varSel In Me.ElencoColori.ItemsSelected
       If MyFilterForm <> vbNullString Then MyFilterForm = MyFilterForm & " OR "
       MyFilterForm = MyFilterForm & "Colore = '" & Me.ElencoColori.ItemData(varSel) & "'"
    Next varSel
    End Function

    n.b. in MyFilterForm viene costruita la stringa del filtro da passare alla subform 

    Tutto qua… un semplice e banale esempio che ti porterà a conosce le sub form e come applicare i filtri alle form


    p.s. Ho utilizzato l'operatore = per filtrare i Colori Selezionati nella Casella di Riepilogo, ma ovviamente puoi utilizzare le Like e tutti gli altri operatori di confronto disponibili. 
    Ho utilizzato OR per congiungere i confronti, ma puoi utilizzare le AND e le OR combinate come meglio credi.

  • Re: CASELLE DI RIEPILOGO

    29/06/2023 - By65Franco ha scritto:


    vbNullString

    Grazie mille! ci provo :)

  • Re: CASELLE DI RIEPILOGO

    29/06/2023 - Pattygirl ha scritto:


    29/06/2023 - By65Franco ha scritto:


    vbNullString

    Grazie mille! ci provo :)

    ;))   vbNullString è come assegnare ad una variabile il valore = “”

    Per la SubForm se non l'hai mai utilizzata, naviga ed explora bene tutte le proprietà della stessa e vedrai che puoi personalizzare diverse cose utili. (ci devi perdere un po' di tempo e fare dei test)
    Con la visualizzazione Layout puoi personalizzare le dimensioni delle colonne e quando premi Salva ti rimarranno come le hai impostate.

    Per Origine Record vedrai che la creazione guidata ti dà una buona mano e ad ogni modo puoi personalizzarla successivamente dalla proprietà Origine Record nella sceda Dati:

    Ma l'Origine Record può contenere una Select e la realizzerai e manuterrari come normalmente fai con le Query:

    Qui avrai la possibilità di personalizzare la tua Query come meglio credi:

    Dopo aver personalizzato la tua Select etc… chiudi e salva e nelle proprietà avrai :

    Ma se tieni la tua Query come Riferimento per le successive modifiche e/o implementazioni, allora ti conviene sempre avere il Nome della Query su Origine Record.

  • Re: CASELLE DI RIEPILOGO

    29/06/2023 - Pattygirl ha scritto:


    Grazie mille! ci provo :)

    Se poi hai difficoltà nel creare la stringa per il Filtro, fai sapere … siamo qua.  ;))

  • Re: CASELLE DI RIEPILOGO

    Franco, 2 considerazioni:

    29/06/2023 - By65Franco ha scritto:

    vbNullString è come assegnare ad una variabile il valore = “”

    Non è proprio così… prova a verificare con la funzione [strptr(…)] la differenza tra vbNullstring e “”, funzionalmente equivalgono ma non sono la stessa cosa, una impegna un Pointer l'altra NO.

    Secondo non fare mai una condizione con OR …OR …OR  con valori Multipli è molto poco efficiente, come ho suggerito si privilegia la Clausola IN suggerisco di orientare li… 

  • Re: CASELLE DI RIEPILOGO

    29/06/2023 - @Alex ha scritto:


    Franco, 2 considerazioni:

    29/06/2023 - By65Franco ha scritto:

    vbNullString è come assegnare ad una variabile il valore = “”

    Non è proprio così… prova a verificare con la funzione [strptr(…)] la differenza tra vbNullstring e “”, funzionalmente equivalgono ma non sono la stessa cosa, una impegna un Pointer l'altra NO.

    Secondo non fare mai una condizione con OR …OR …OR  con valori Multipli è molto poco efficiente, come ho suggerito si privilegia la Clausola IN suggerisco di orientare li… 

    Ottimo !!!!    come sempre grazie @Alex per precisazioni e info preziose!

  • Re: CASELLE DI RIEPILOGO

    Mi consigliate un bel libro, semplice da studiare? 

  • Re: CASELLE DI RIEPILOGO

    29/06/2023 - Pattygirl ha scritto:


    Mi consigliate un bel libro, semplice da studiare? 

    A che punto sei arrivata ?

    Hai realizzato la subForm alimentata dalla tua query ?

    ‘mo di semplice direi che non c’è proprio nulla. Ma puoi fare riferimento al supporto Microsoft dove trovi tutto di più e meglio di un libro a mio avviso ;))

    A che livello senti di essere e quali argomenti vorresti approfondire ?

    Una buona consultazione sarebbe questa, tanto per iniziare ed assimilare dei concetti basi di Access:
    Informazioni sulla struttura di un database di Access - Supporto tecnico Microsoft

    a seguire trovi alla fine dell'articolo gli argomenti principali e così via:



  • Re: CASELLE DI RIEPILOGO

    Utilizzando i consigli che ti sono stati dati e volendo usare una listbox con multiselezione io farei cosi:

    Associa la query ad una visualizzazione in foglio dati o sottomaschera. Costruisci la listbox a due colonne associando i campi della tabella che contiene il tipo di analisi che vuoi filtrare. Ad esempio i campi:  idanalisi, analisi.

    Costruisci un pulsante che ad evento click sfrutti il metodo filter utilizzando la clausola IN applicata però agli indici idanalisi associata alla prima colonna della listbox dopo aver fatto la selezione.

  • Re: CASELLE DI RIEPILOGO

    29/06/2023 - Antony73 ha scritto:


    Utilizzando i consigli che ti sono stati dati e volendo usare una listbox con multiselezione io farei cosi:

    Associa la query ad una visualizzazione in foglio dati o sottomaschera. Costruisci la listbox a due colonne associando i campi della tabella che contiene il tipo di analisi che vuoi filtrare. Ad esempio i campi:  idanalisi, analisi.

    Costruisci un pulsante che ad evento click sfrutti il metodo filter utilizzando la clausola IN applicata però agli indici idanalisi associata alla prima colonna della listbox dopo aver fatto la selezione.

    Come anche suggerito da @Alex vado ad utilizzare la Clausola IN e aggiorno il codice che avevo proposto sopra a titolo di esempio:

    Option Compare Database
    Option Explicit
    
    ' APPLY FILTER
    Private Sub btnFilter_Click()
    Me.SFrm_Colori.Form.Filter = MyFilterForm
    Me.SFrm_Colori.Form.FilterOn = True
    End Sub
    
    ' RESET FILTER
    Private Sub btnFilterReset_Click()
    Me.SFrm_Colori.Form.FilterOn = False
    Me.ElencoColori.Requery
    End Sub
    
    ' SET FILTER
    Private Function MyFilterForm() As String
    MyFilterForm = vbNullString
    Dim varSel As Variant
    For Each varSel In Me.ElencoColori.ItemsSelected
        If MyFilterForm <> vbNullString Then MyFilterForm = MyFilterForm & ", "
        MyFilterForm = MyFilterForm & "'" & Me.ElencoColori.ItemData(varSel) & "'"
    Next varSel
    If MyFilterForm <> vbNullString Then MyFilterForm = "Colore IN (" & MyFilterForm & ")"
    End Function
    

    Io la uso raramente e devo dire che è molto indicata allo scopo.
    Grazie ad entrambe per l'ottimo suggerimento!!!

  • Re: CASELLE DI RIEPILOGO

    Dici serva il Requery…?

    ' RESET FILTER
    Private Sub btnFilterReset_Click()
    Me.SFrm_Colori.Form.FilterOn = False
    Me.ElencoColori.Requery
    End Sub

    Farei così:

    ' APPLY FILTER
    Private Sub btnFilter_Click()
    	Me.SFrm_Colori.Form.Filter = MyFilterForm()
    End Sub
    
    ' RESET FILTER
    Private Sub btnFilterReset_Click()
    	Me.SFrm_Colori.Form.FilterOn = False
    End Sub
    
    ' SET FILTER
    Private Function MyFilterForm() As String
    	MyFilterForm = vbNullString
    	Dim varSel As Variant
    	For Each varSel In Me.ElencoColori.ItemsSelected
        	MyFilterForm = MyFilterForm & "'" & Me.ElencoColori.ItemData(varSel) & "',"
        	' Ovviamente se si usa l'Indice PK Numerico non servono gli APICI
        	' se invece il campo è Data converto in cLng(CampoData)
    	Next varSel
    	If MyFilterForm <> vbNullString Then 
    		MyFilterForm = MID$(MyFilterForm ,1,LEN(MyFilterForm)-1)
    		MyFilterForm = "Colore IN (" & MyFilterForm & ")"
    		Me.SFrm_Colori.Form.FilterOn=True
    	Else
    		Me.SFrm_Colori.Form.FilterOn=False
    	End if
    End Function

    Quì un vecchio demo:

    https://1drv.ms/u/s!Are2sGzrs4WChnsuxsSx8We0BHbX?e=91KKUS

  • Re: CASELLE DI RIEPILOGO

    30/06/2023 - @Alex ha scritto:


    Dici serva il Requery…?

    ' RESET FILTER
    Private Sub btnFilterReset_Click()
    Me.SFrm_Colori.Form.FilterOn = False
    Me.ElencoColori.Requery
    End Sub

    Serve solo per togliere le eventuali selezioni sugli elementi…. basterebbe un Me.ElencoColori = vbNullstring ?

    Tu non lo sai @Alex , ma ben più di 10 anni fa l'uso del vbNullString è una di quelle cose che ho imparato da te, mo' tante altre cose sicuramente non le ricordo, ma questa e altre forme di convalida e di confronto, ogni volta che le uso i ricordi ritornano a quei tempi ormai andati ;)) 


    Per il resto del codice ottimo !!! Grazie

  • Re: CASELLE DI RIEPILOGO

    30/06/2023 - By65Franco ha scritto:

    Serve solo per togliere le eventuali selezioni sugli elementi…. basterebbe un Me.ElencoColori = vbNullstring ?

    Intendi resettare la ListBox in Multiselezione…?
    se così basta una riga così:

    Me!NomeListBox.RowSource=Me!NomeListBox.RowSource

    Tu non lo sai @Alex , ma ben più di 10 anni fa l'uso del vbNullString è una di quelle cose che ho imparato da te, mo' tante altre cose sicuramente non le ricordo, ma questa e altre forme di convalida e di confronto, ogni volta che le uso i ricordi ritornano a quei tempi ormai andati ;)) 


    Per il resto del codice ottimo !!! Grazie

    Intendi dire che sono vecchio… ho capito…! ;-)

    Ciao

  • Re: CASELLE DI RIEPILOGO

    Questo weekend mi ci metto a sistemare la maschera con i Vs suggerimenti. Grazie davvero per le dritte! 

Devi accedere o registrarti per scrivere nel forum
85 risposte