Riferimento a sottomaschera

di il
20 risposte

Riferimento a sottomaschera

Buon giorno a tutti,
sono un 40enne alla sua primissima esperienza di programmazione e sto realizzando un piccolo applicativo in Access 2019 per un azienda che si occupa di revisionare veicoli industriali.

Prima di tutto vorrei ringraziare tutti voi per l'aiuto che fornite a persone come me. Moltissimi argomenti trattati in questo forum sono stati per me fondamentali e chiarificatori.

Non sono riuscito a trovare nessun post relativo a questo piccolo problema che non riesco a risolvere (spero di aver cercato per bene!!).

Ho una maschera all'interno della quale ho creato 2 ComboBox (che selezionano dei dati provenienti dalle relative tabelle) che l'utente utilizza per effettuare delle ricerche rapide:
- cmbRicercaRapidaRagSoc: "Ragione Sociale" con 2 colonne (di cui solo la seconda visibile all'utente): IDCliente, RagioneSociale
- cmbRicercaRapidaTarga: "Targa" con 3 colonne (di cui solo quella con il campo "Targa" visibile al cliente): Targa, IDCliente, VeicoloAttivo

Se l'utente fa una ricerca indicando la Ragione Sociale del cliente ho creato una routine in modo che dopo l'aggiornamento della combobox venga applicato un filtro sulla maschera principale (mscGestioneCliente) in base all'IDCliente. Di conseguenza la sottomaschera presente collegata alla mschera (mscSubVeicoli) mostra tutti i veicoli posseduti da quello specifico cliente. Fin qui tutto bene.

Ora vorrei che quando l'utente utilizza la combobox "Targa" (inserendo o selezionando il numero di targa del veicolo), non solo visualizzi i dettagli relativi al cliente che possiede quel veicolo (cosa che riesco a fare filtrando la maschera in base all'IDCliente associato alla targa inserita) ma, nella sottomaschera (mscSubVeicoli) visualizzi solamente il veicolo ricercato e non tutti quelli posseduti dal cliente.

Per fare questo ho pensato di applicare un filtro anche alla sottomaschera, ma non riesco a riferirmi a quest'ultima:

Per applicare il filtro alla maschera principale utilizzo:
Me.Filter = "IDCliente = " & Me.cmbRicercaRapidaTarga.Value
Me.FilterOn = True

Per quanto riguarda la sottomaschera:
Dim sTarga As String
sTarga = Me.cmbRicercaRapidaTarga.Column(0)

(Vorrei ora filtrare la sottomaschera in base al numero di targa)

Ho provato tutte le seguenti soluzioni:
Me.mscSubVeicoli.Filter = "Targa = " & sTarga
Me.mscSubVeicoli.FilterOn = True
e
Me.subVeicoli.Filter = "Targa = " & sTarga
Me.subVeicoli.FilterOn = True

(Errore di compilazione: Impossibile trovare il metodo o il membro dei dati)

Poi:
Me!mscSubVeicoli.Filter = "Targa = " & sTarga
Me!mscSubVeicoli.FilterOn = True
e
Forms!mscGestioneClienti!mscSubVeicoli.Form.Filter = "Targa = " & sTarga
Forms!mscGestioneClienti!mscSubVeicoli.Form.FilterOn = True
(Errore di run-tim ‘2465’: Microsoft Access impossibile trovare il campo ‘mscSubVeicoli’ a cui viene detto riferimento nell’espressione.)

Di sicuro sbaglio qualcosa ma… cosa ?

20 Risposte

  • Re: Riferimento a sottomaschera

    Io non ho capito:
    - come si chiama la maschera, su quale tabella poggia, quali campi ha
    - come si chiama la sottomaschera, su quale tabella poggia, quali campi ha
  • Re: Riferimento a sottomaschera

    Ciao Osvaldo,

    piacere di conoscerti, grazie per l'attenzione e la tua risposta.

    La maschera principale si chiama mscGestioneClienti e si poggia si una tabella (tblClienti) che contiene i seguenti campi:
    IDCliente (presente ma non visibile sulla maschera)
    RagioneSociale
    CodiceFiscale
    PartitaIva
    Indirizzo
    Cap
    Città
    Provincia
    Telefono1
    Telefono2
    Fax
    EMail
    SitoInternet
    Note

    La sottomaschera si chiama mscSubVeicoli e si poggia su di una query (qryVeicoliScadenze) che contiene i seguenti campi di una tabella chiamata tblVeicoli:
    IDVeicolo (presente ma non visibile sulla sottomaschera)
    IDCliente
    Tipologia
    NTarga
    NTelaio
    DataRevisioneVeicolo
    TipoCronotachigrafo
    DataRevCronotachigrafo
    Note
    Attivo (nella query impostato il criterio = Vero in modo da non mostrare nei risultati i veicoli "Disattivati")

    ed in più due campi calcolati:
    ScadenzaRevisione: DateAdd("aaaa";1;[DataRevisione])
    ScadenzaCronotachigrafo: DateAdd("aaaa";1;[DataCronotachigrafo])

    Le due tabelle (tblClienti e tblVeicoli) sono relazionate attraverso il campi IDCliente presente in entrambe.

    Fammi sapere se hai bisogno di altri chiarimenti

    Grazie
  • Re: Riferimento a sottomaschera

    Non so se può essere d'aiuto vedere la maschera con la sottomaschera:
  • Re: Riferimento a sottomaschera

    Salve,
    qui dici
    - cmbRicercaRapidaRagSoc: "Ragione Sociale" con 2 colonne (di cui solo la seconda visibile all'utente): IDCliente, RagioneSociale
    - cmbRicercaRapidaTarga: "Targa" con 3 colonne (di cui solo quella con il campo "Targa" visibile al cliente): Targa, IDCliente, VeicoloAttivo
    chiedo la combo "cmbRicercaRapidaTarga" ha le colonne in quell'ordine?
    poi sostieni di fare un filtro sulla principale così
    Per applicare il filtro alla maschera principale utilizzo:
    Me.Filter = "IDCliente = " & Me.cmbRicercaRapidaTarga.Value
    Me.FilterOn = True
    Qualcosa non quadra

    Prova così dalla combo "cmbRicercaRapidaTarga" :
    Dim CriterioTarga as string
    Me.Filter = "IDCliente = " & Me.cmbRicercaRapidaTarga.column(1)
    Me.FilterOn = True
    CriterioTarga ="IDCliente = " & Me.cmbRicercaRapidaTarga.column(1) & "And Targa = " & me.cmbRicercaRapidaTarga.value
    Me.mscSubVeicoli.Form.Filter =  CriterioTarga 
    Me.mscSubVeicoli.Form.FilterOn = True
    Saluti
  • Re: Riferimento a sottomaschera

    Direi che questa soluzione
    Forms!mscGestioneClienti!mscSubVeicoli.Form.Filter = ...
    Forms!mscGestioneClienti!mscSubVeicoli.Form.FilterOn = True
    oppure
    Me.mscSubVeicoli.Form.Filter = ...
    Me.mscSubVeicoli.Form.FilterOn = True
    moficando la prima riga nel seguente modo
    Forms!mscGestioneClienti!mscSubVeicoli.Form.Filter = "Targa = """ & sTarga & """"
    oppure nel seguente
    Forms!mscGestioneClienti!mscSubVeicoli.Form.Filter = "Targa = " & Chr(34) & sTarga & Chr(34)
    essendo il campo Targa di tipo testo.
    Vorrei anche sottolineare che la struttura del database non è corretta in quanto se il Veicolo un giorno diventasse di proprietà di un'altro Cliente si perderebbe lo storico relativo a quello precedente.
  • Re: Riferimento a sottomaschera

    Gianni e Stifone, grazie tante per i vostri interventi... purtroppo ho avuto una giornata infernale. Domani, appena riesco, metto in pratica i vostri consigli e vi do un feedback!
  • Re: Riferimento a sottomaschera

    Salve,
    premetto che concordo con Stifone per quanto attiene la struttura del Db in riguardo allo storico del veicolo e chiedo venia per lo svarione
    (non ho tenuto conto del campo Targa di tipo testo, ma insisto sul fatto di filtrare preventivamente la maschera principale prima di applicare il filtro Targa.

    Io ho filtrato così : (per una questione di leggibilità nel codice ho sostituito il nome della combo "cmbRicercaRapidaTarga" in "CcTarga"
    Dim CriterioTarga as string
    Me.Filter = "IDCliente = " & Me.CcTarga.column(1)
    Me.FilterOn = True
    CriterioTarga ="IDCliente = " & Me.CcTarga.column(1) & "And  Targa = "   & Chr(34) & me.CcTarga.value & Chr(34)
    Me.mscSubVeicoli.Form.Filter =  CriterioTarga 
    Me.mscSubVeicoli.Form.FilterOn = True
    Purtuttavia va osservato che la combo non può contenere 2 volte la stessa targa anche se appartenente a due clienti diversi motivo per cui se il veicolo passa ad altro proprietario bisogna "disattivarlo" dal vecchio proprietario e caricarlo ex novo al nuovo proprietario.

    Per questo l'origine riga della combo deve essere:
    
    SELECT TbVeicoli.Targa, TbVeicoli.IdCliente, TbVeicoli.Attivo FROM TbVeicoli WHERE (((TbVeicoli.Attivo)=True));
    Saluti Gianni
  • Re: Riferimento a sottomaschera

    Ciao Stifone e Gianni,
    e grazie ancora per i vostri suggerimenti.

    Per quanto riguarda lo storico del veicolo, non ho previsto che sia possibile tenere traccia dei proprietari passati di un veicolo (ma questa non è una funzionalità richiesta, ne tantomeno utile, ai fini dell'attività del centro revisioni). E' invece possibile, nella maschera "Modifica Veicolo" cambiare il proprietario del veicolo (scegliendolo, ovviamente, tra quelli inseriti nella tabella Clienti). Qualora il veicolo fosse acquistato da un nuovo cliente, va prima inserito quest'ultimo in tblClienti e poi è possibile assegnargli il veicolo in precedenza registrato come appartenente ad un cliente diverso.

    Ho provato le soluzioni da voi suggerite ma continuo ad ottenere degli errori di cui vi allego gli screenshots:
    Allegati:
    30193_e3b60b6a43a96e13986da52395b04205.png
    30193_e3b60b6a43a96e13986da52395b04205.png

    30193_1c085ff637cda38de00b29a11856e2e6.png
    30193_1c085ff637cda38de00b29a11856e2e6.png
  • Re: Riferimento a sottomaschera

    VincMc ha scritto:


    Ho provato le soluzioni da voi suggerite ma continuo ad ottenere degli errori di cui vi allego gli screenshots:
    In quale evento l'hai messo? Verifica il nome del container, con la finestrella "proprietà" del controllo selezionato aperta, che aiuta tantissimo.
  • Re: Riferimento a sottomaschera

    Ciao Philcattivocarattere, grazie per il tuo contributo,

    Spero di aver capito quello che mi hai chiesto:

    il codice l'ho scritto in relazione all'evento "Dopo Aggiornamento"
    (lo stesso che utilizzo per la ricerca del campo Ragione Socilae)
    Private Sub cmbRicercaRapidaTarga_AfterUpdate()
    
        If Not IsNull(Me.cmbRicercaRapidaTarga.Value) Then
            Me.Filter = "IDCliente = " & Me.cmbRicercaRapidaTarga.Value
            Me.FilterOn = True
            Me.cmbRicercaRapidaRagSoc.Value = Null
            Me.cmbRicercaRapidaTelaio.Value = Null
            AttivaModificaReport
                   
        End If
    End Sub
    Così come lo vedi, funziona il filtro nella maschera principale... il mio problema rimane fare riferimento in maniera efficace alla sottomaschera (mscSubVeicoli) come spiegato sopra.

    Qualora potesse essere inerente (ma non credo) la Sub Routine "AttivaModificaReport" non fa altro che abilitare i tasti presenti sulla maschera.
  • Re: Riferimento a sottomaschera

    VincMc ha scritto:


    Spero di aver capito quello che mi hai chiesto:
    Una parte sì, hai risposto a quello che avevo chiesto.
    Hai guardato in visualizzazione struttura della maschera principale il nome del container, il controllo che ospita la sottomaschera?
    Con la finestra delle proprietà aperta (F4) vedi subito che tipo di controllo hai selezionato e il suo nome.
    Altrimenti puoi sempre dalla finestra delle proprietà scorrere l'elenco dei controlli presenti nella maschera ed uno alla volta li vedrai selezionati con i "quadratini agli angoli".
    Altro sistema ma che alla fine segue lo stesso principio: uso dell'intellisense da VBA. Nel codice relativo alla maschera principale scrivi Me, seguito dal punto (non dal punto esclamativo) e inizia a guardare cosa ti propone, fino a trovare quello che "ad intuito" in base al nome è il controllo container.
    Senza avere la maschera (e quindi il db) a disposizione più di tanto non possiamo aiutarti perché il nome giusto degli oggetti lo puoi vedere solo tu.
    Evento raro, sono riuscito a trovare la pagina in cui oltre alla spiegazione c'è anche la "dimostrazione visiva" di come si distingue il container dalla sottomaschera
    https://btabdevelopment.com/easy-way-to-remember-how-to-refer-to-subforms/
  • Re: Riferimento a sottomaschera

    Philcattivocarattere grazie per la pazienza,

    ho effettivamente verificato quello che hai chiesto e, nonostante la maschera che ho utilizzato come sottomaschera è chiamata mscSubVeicoli, nell'elenco della finestra proprietà è indicata solo come SubVeicoli.
    Ho letto l'articolo che mi hai linkato ed ho quindi risolto così:
            sCriterioFiltro = "NTarga = " & Chr(39) & Me.cmbRicercaRapidaTarga.Column(0) & Chr(39)
            Me.subVeicoli.Form.Filter = sCriterioFiltro
            Me.subVeicoli.Form.FilterOn = True
    Grazie a tutti per il prezioso aiuto e per gli spunti di riflessione
  • Re: Riferimento a sottomaschera

    VincMc ha scritto:


    Philcattivocarattere grazie per la pazienza,

    ho effettivamente verificato quello che hai chiesto e, nonostante la maschera che ho utilizzato come sottomaschera è chiamata mscSubVeicoli, nell'elenco della finestra proprietà è indicata solo come SubVeicoli.
    Ho letto l'articolo che mi hai linkato ed ho quindi risolto così:
            sCriterioFiltro = "NTarga = " & Chr(39) & Me.cmbRicercaRapidaTarga.Column(0) & Chr(39)
            Me.subVeicoli.Form.Filter = sCriterioFiltro
            Me.subVeicoli.Form.FilterOn = True
    Grazie a tutti per il prezioso aiuto e per gli spunti di riflessione
    Mah questo codice filtra una targa nella sottomaschera senza NESSUNA relazione al proprietario, dai un'occhiata al nome del titolare NON lo può
    trovare, essendo in relazione Maschera/Sottomaschera (sempre che lo sia).
    In questo modo filtri la targa "XX111SS" ma il titolare dell'auto non filtrato non cambia.

    Inoltre nel suddetto criterio scrivi :
     sCriterioFiltro = "NTarga = " & Chr(39) & Me.cmbRicercaRapidaTarga.Column(0) & Chr(39)
    mentre nel post precedente asserisci che:
    Private Sub cmbRicercaRapidaTarga_AfterUpdate()
        If Not IsNull(Me.cmbRicercaRapidaTarga.Value) Then
            Me.Filter = "IDCliente = " & Me.cmbRicercaRapidaTarga.Value
            Me.FilterOn = True
            Me.cmbRicercaRapidaRagSoc.Value = Null
            Me.cmbRicercaRapidaTelaio.Value = Null
            AttivaModificaReport
                   
        End If
    End Sub
    Così come lo vedi, funziona il filtro nella maschera principale...
    Quindi :
     sCriterioFiltro = "NTarga = " & Chr(39) & Me.cmbRicercaRapidaTarga.Column(0) & Chr(39)
    e:
     Me.Filter = "IDCliente = " & Me.cmbRicercaRapidaTarga.Value
    Farebbero la stessa cosa?
    Chiariamo che scrivere: (Me.cmbRicercaRapidaTarga.Value) e ( Me.cmbRicercaRapidaTarga.Column(0) ) è la stessa cosa
    quindi mi chiedo la colonna(0) della "cmbRicercaRapidaTarga" contiene "IdCliente" o la "Targa" ?

    Nel mio post prima di questo o Postato e Testato una soluzione suggerendo anche l'origine dati della combo "cmbRicercaRapidaTarga"
    ma pare sia stato ignorato.
    Mah
  • Re: Riferimento a sottomaschera

    Gianni55 ha scritto:


    ....
    Chiariamo che scrivere: (Me.cmbRicercaRapidaTarga.Value) e ( Me.cmbRicercaRapidaTarga.Column(0) ) è la stessa cosa...
    Gianni non è cosi assoluto come stai facendo passare...!
    La tua affermazione passa per dare per sacontato che la Colonna associata sia la 1°(Indice 0).... a prescindere.... non è così.
    Di fatto quindi non è vero che Value=Column(0), ma lo è solo SE la BoundColumn è la (0).

    Quindi se vogliamo essere più precisi, possiamo affermare che la Proprietà VALUE espone il valore Column di Indice BoundColumn, che poi sia 99% dei casi la [0] è un dettaglio tecnico, non una regola fissa.
    NomeCombo.Value=NomeCombo.Column(NomeCombo.BoundColumn)
    Se imposti infatti come BoundColumn la 2(terza colonna), la proprietà VALUE esporrà il valore di Column(2).
Devi accedere o registrarti per scrivere nel forum
20 risposte