Filtro in una casella combinata ad apertura maschera

Forum dedicato interamente a Microsoft Access

Moderatore: Toki

Regole del forum
Leggi: IProgrammatori.it - Regolamento Forum
bean_bandit
Utente Semi-Senior
Messaggi: 128
Iscritto il: 10 giu 2014, 15:10

Filtro in una casella combinata ad apertura maschera

Messaggioda bean_bandit » 19 mag 2017, 15:28

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

Codice: Seleziona tutto

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

Codice: Seleziona tutto

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...
Avatar utente
max.riservo
Utente Junior
Messaggi: 86
Iscritto il: 15 ago 2016, 10:45
Località: Torino e dintorni

Re: Filtro in una casella combinata ad apertura maschera

Messaggioda max.riservo » 19 mag 2017, 17:02

Riporta esattamente tutto il codice presente nell'evento Form_Load (compresa la definizione dell'evento) .....
Philcattivocarattere
Utente Senior
Messaggi: 908
Iscritto il: 06 giu 2014, 10:35
Località: Verona-Mantova

Re: Filtro in una casella combinata ad apertura maschera

Messaggioda Philcattivocarattere » 22 mag 2017, 08:37

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.
bean_bandit
Utente Semi-Senior
Messaggi: 128
Iscritto il: 10 giu 2014, 15:10

Re: Filtro in una casella combinata ad apertura maschera

Messaggioda bean_bandit » 22 mag 2017, 10:11

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 è

Codice: Seleziona tutto

Forms![Nomeform].Utente_Riferimento.RowSource = strSQL

Grazie siete stati comunque gentilissimi!
Philcattivocarattere
Utente Senior
Messaggi: 908
Iscritto il: 06 giu 2014, 10:35
Località: Verona-Mantova

Re: Filtro in una casella combinata ad apertura maschera

Messaggioda Philcattivocarattere » 22 mag 2017, 10:25

bean_bandit ha scritto:...
La sintassi corretta da usare nella function è

Codice: Seleziona tutto

Forms![Nomeform].Utente_Riferimento.RowSource = strSQL
Però è una function da riutilizzo limitato a quella sola maschera.

Codice: Seleziona tutto

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).
bean_bandit
Utente Semi-Senior
Messaggi: 128
Iscritto il: 10 giu 2014, 15:10

Re: Filtro in una casella combinata ad apertura maschera

Messaggioda bean_bandit » 22 mag 2017, 11:32

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 è:

Codice: Seleziona tutto

Public Var_BT_Tipo_Commessa As String
Public Tipo_commessa As String


FORM1

Codice: Seleziona tutto

Call Apri elenco()

Codice: Seleziona tutto

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

Codice: Seleziona tutto

Call Modella()

Codice: Seleziona tutto

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:

Codice: Seleziona tutto

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"

Codice: Seleziona tutto

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?
Philcattivocarattere
Utente Senior
Messaggi: 908
Iscritto il: 06 giu 2014, 10:35
Località: Verona-Mantova

Re: Filtro in una casella combinata ad apertura maschera

Messaggioda Philcattivocarattere » 22 mag 2017, 13:23

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:

Codice: Seleziona tutto

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, è

Codice: Seleziona tutto

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.
bean_bandit
Utente Semi-Senior
Messaggi: 128
Iscritto il: 10 giu 2014, 15:10

Re: Filtro in una casella combinata ad apertura maschera

Messaggioda bean_bandit » 22 mag 2017, 14:41

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
Philcattivocarattere
Utente Senior
Messaggi: 908
Iscritto il: 06 giu 2014, 10:35
Località: Verona-Mantova

Re: Filtro in una casella combinata ad apertura maschera

Messaggioda Philcattivocarattere » 23 mag 2017, 08:12

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

Codice: Seleziona tutto

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

Codice: Seleziona tutto

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.
bean_bandit
Utente Semi-Senior
Messaggi: 128
Iscritto il: 10 giu 2014, 15:10

Re: Filtro in una casella combinata ad apertura maschera

Messaggioda bean_bandit » 23 mag 2017, 15:17

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 :D

Torna a “Microsoft Access”

Chi c’è in linea

Visitano il forum: @Alex, Bing [Bot], Google [Bot] e 40 ospiti