Filtro in una casella combinata ad apertura maschera

di il
9 risposte

Filtro in una casella combinata ad apertura maschera

Ho l'esigenza di filtrare i dati in una casella combinata all'apertura della maschera, quindi eseguo il seguente codice nell'evento Form_Load:
Public Tipo_commessa As String

Dim strSQL As String
    
    strSQL = "SELECT Tabella1.* FROM Tabella1 WHERE (((Tabella1.Campo2)= """ & Tipo_commessa & """));"
    Me!Utente_Riferimento.RowSource = strSQL
Tipo_commessa è una variabile che arriva da selezioni su altre maschere

Fin qui tutto bene ma se invece di eseguire il codice all'evento Form_Load richiamo una function dove ho tutti i parametri di configurazione della maschera "ME" mi da utilizzo non valido, ho provato con
Forms![Nomeform].Utente_Riferimento.RowSource = strSQL

ma nulla, metodo non supportato.

qual'è la sintassi per selezionare la combobox durante l'esecuzione della function? ho provato diverse cose ma nulla...

9 Risposte

  • Re: Filtro in una casella combinata ad apertura maschera

    Riporta esattamente tutto il codice presente nell'evento Form_Load (compresa la definizione dell'evento) .....
  • Re: Filtro in una casella combinata ad apertura maschera

    bean_bandit ha scritto:


    ...
    qual'è la sintassi per selezionare la combobox durante l'esecuzione della function? ho provato diverse cose ma nulla...
    Pubblica anche il codice della funzione. Probabilmente è sufficiente aggiungere un parametro di tipo Form alla funzione.
  • Re: Filtro in una casella combinata ad apertura maschera

    Ciao,

    Ho risolto, nel riscrivere il codice nella function ho inavvertitamente saltato una lettera di "Me!Utente_Riferimento"... non capivo perche da una parte funzionava e dall'altra no, dopo un paio di ore mi sono accorto che mancava la "i" -.-

    La sintassi corretta da usare nella function è
    Forms![Nomeform].Utente_Riferimento.RowSource = strSQL
    Grazie siete stati comunque gentilissimi!
  • Re: Filtro in una casella combinata ad apertura maschera

    bean_bandit ha scritto:


    ...
    La sintassi corretta da usare nella function è
    Forms![Nomeform].Utente_Riferimento.RowSource = strSQL
    Però è una function da riutilizzo limitato a quella sola maschera.
    Public Function nomefunction(ByVal strNomeMaschera as String, ByRef miaCombo As ComboBox...) As ...
         Dim frm as Form
         Set frm = Forms(strNomeMaschera)
         frm.miaCombo.RowSource = strSQL
         ...
         Set frm = Nothing
    ...
    ed è chiamabile da qualsiasi maschera e per qualsiasi combo (a grandi linee, non sapendo cos'altro fa quella funzione).
  • Re: Filtro in una casella combinata ad apertura maschera

    Mi interessa poter riutilizzare la function, ma non sono sicuro di come applicare il tuo esempio, Io avevo ipotizzato un'altra strada, ti spiego prima cosa fa: all'apertura del DB seleziono un tipo di commessa da visualizzare dalla Form1, al click mi si apre una maschera (Form2) con i dati filtrati e selezionando una delle voci mi si apre una terza maschera (Form3) che viene personalizzata in funzione della selezione fatta nella prima form.

    Attualmente il codice semplificato è:
    Public Var_BT_Tipo_Commessa As String
    Public Tipo_commessa As String
    FORM1
    Call Apri elenco()
    Function Apri_elenco()
    
        Select Case Screen.ActiveControl.Name
            Case "Bt_Archivio_Commesse": Var_BT_Tipo_Commessa = "[Progetti]!Tipo_commessa=""commessa_a"" And ([Progetti]!Stato=""Completato"")": Tipo_commessa_selezionata = "Commessa_chi"
            Case "Bt_Commesse_Attive": Var_BT_Tipo_Commessa = "[Progetti]![Tipo_commessa]=""commessa_c"" And ([Progetti]![Stato]=""In Corso"")": Tipo_commessa_selezionata = "Commessa_att"
        End Select
    
        DoCmd.OpenForm "Elenco", acNormal, "Tipo Commessa", Var_BT_Tipo_Commessa, acFormEdit, acNormal
    Form3
    Call Modella()
    Function Modella()
    
    If Tipo_commessa = "commessa_att" Then
    
        Forms![Commesse].IntestazioneMaschera.BackColor = vbRed
        ...	
        GoTo 100
    End If
    
    If Tipo_commessa_selezionata = "commessa_chi" Then
        Forms![Commesse].IntestazioneMaschera.BackColor = vbBlue
        ...
        GoTo 100
    End If
    
    100
    Forms![Commesse].Etichetta1049.TextAlign = 2
    
    ' filtra utenti
        Dim strSQL As String
        strSQL = "SELECT [Utenti].* FROM [Utenti] WHERE ((([Utenti].[Tipo_commessa])= """ & Tipo_commessa & """));"
        Forms![Commesse].Utente_riferimento.RowSource = strSQL
        ...
    End Function
    mentre usando il tuo esempio sarebbe:
    Call modella([Commesse], Utente_Riferimento)
    Giusto? pero mi dice subito "impossibile trovare il campo |1 a cui fa riferimento" e Utente_Riferimento mi viene visto come il valore contenuto nella combobox Utente_Riferimento = "pippo"
    Public Function modella(ByVal strNomeMaschera as String, ByRef miaCombo As ComboBox)
    
         Dim frm as Form
         Dim strSQL As String
         strSQL = "SELECT [Utenti].* FROM [Utenti] WHERE ((([Utenti].[Tipo_commessa])= """ & Tipo_commessa & """));"
         Set frm = Forms(strNomeMaschera)
         frm.miaCombo.RowSource = strSQL
         Set frm = Nothing
    
    end function
    Dove sbaglio?
  • Re: Filtro in una casella combinata ad apertura maschera

    bean_bandit ha scritto:


    Mi interessa poter riutilizzare la function, ma non sono sicuro di come applicare il tuo esempio,
    E' difficile dire se la funzione è riutilizzabile anche in altre maschere. Ovviamente deve trattarsi della stessa operazione, nel tuo caso assegnare un valore alla proprietà RowSource di una combobox. Se hai altre situazioni "simili" allora si può approfondire, altrimenti lasciala com'è.

    bean_bandit ha scritto:


    ...
    mentre usando il tuo esempio sarebbe:
    Call modella([Commesse], Utente_Riferimento)
    Giusto? pero mi dice subito "impossibile trovare il campo |1 a cui fa riferimento" e Utente_Riferimento mi viene visto come il valore contenuto nella combobox Utente_Riferimento = "pippo"
    ...
    Sul discorso di "Utente_Riferimento" visto come il valore e non come l'oggetto hai ragione. La soluzione volante, sul momento, è
    Public Function modella(ByVal strNomeMaschera as String, ByVal strNomeCombo As String)
    
         Dim frm as Form
         Dim strSQL As String
         strSQL = "SELECT [Utenti].* FROM [Utenti] WHERE ((([Utenti].[Tipo_commessa])= """ & Tipo_commessa & """));"
         Set frm = Forms(strNomeMaschera)
         frm(strNomeCombo).RowSource = strSQL
         Set frm = Nothing
    
    end function
    Visto che la funzione "modella" fa anche molto altro e alla fine agisce solo sulla maschera [Commesse] probabilmente non vale la pena metterci le mani.
    Capisci da solo che non stai scrivendo codice riutilizzabile (e quindi l'eventuale funzione deve essere rivista) quando cominci a scrivere sempre lo stesso blocco di codice in continuazione, cambiando solo poche parti.
    Visto che sono stato io a tirare in ballo il discorso del codice riutilizzabile, mi sento anche in dovere di dire che questo esula dal thread. Se dopo aver valutato un po' tutto ritieni che ci sia qualcosa da approfondire per questo aspetto è il caso di aprire una nuova discussione.
  • Re: Filtro in una casella combinata ad apertura maschera

    Ti ringrazio, in effetti andrei a riutilizzare solo una porzione minima di codice, in ogni caso intanto mi studio il nuovo esempio che mi hai dato poi vedo se è il caso di applicarlo
  • Re: Filtro in una casella combinata ad apertura maschera

    bean_bandit ha scritto:


    ...intanto mi studio il nuovo esempio che mi hai dato poi vedo se è il caso di applicarlo
    Ultima annotazione sulla funzione, per l'uso del GoTo che è (da quello che si vede) inutile.
    Puoi fare una cosa del tipo
    Function Modella()
    If Tipo_commessa = "commessa_att" Then
        Forms![Commesse].IntestazioneMaschera.BackColor = vbRed
        ...   
    ElseIf Tipo_commessa_selezionata = "commessa_chi" Then
        Forms![Commesse].IntestazioneMaschera.BackColor = vbBlue
        ...
    End If
    
    Forms![Commesse].Etichetta1049.TextAlign = 2
    ...
    End Function
    oppure usando Select Case
    I puristi dicono che l'unico GoTo da usare è quello per la gestione degli errori. Nel senso che c'è probabilmente un modo migliore di scrivere il codice che evita di fare quei "salti". Se proprio invece serve, evita di fare riferimento ad un numero ma usa un'etichetta come riferimento. Attenzione al fatto che all'interno del codice l'etichetta deve essere seguita dai duepunti
    GoTo NomeEtichetta
    ...
    NomeEtichetta:
    (codice vario)
    Lo suggerisce anche Microsoft GoTo Statement
    Too many GoTo statements can make code difficult to read and debug. Use structured control statements (Do...Loop, For...Next, If...Then...Else, Select Case) whenever possible.
    e in quella pagina trovi anche un esempio un po' più articolato del mio.
  • Re: Filtro in una casella combinata ad apertura maschera

    Hai ragione Phil, il goto non serve a nulla in questo caso, mi era rimasto da un vecchio copia ed incolla e me lo trascinavo dietro senza pensarci... il "100" mi è rimasto addosso dai programmi in basic sul 64 di 30 e passa anni fa, mi sa che è arrivato il momento di evolvere
Devi accedere o registrarti per scrivere nel forum
9 risposte