ACCESS - VBA; VERIFICA DI UN DATO CONTENUTO IN UNA SOTTOMASCHERA

di il
25 risposte

ACCESS - VBA; VERIFICA DI UN DATO CONTENUTO IN UNA SOTTOMASCHERA

Buongiorno a tutti,

ho un database access con una maschera principale chiamata [Inserimento] ed una sottomaschera chiamata [subRischio].

entrambe le maschere fanno riferimento alla medesima tabella “Inserimento”. ho creato la sottomaschera per non visualizzare alcuni dati che servono solo a richiamo (mediante un pulsante che visualizza o nasconde appunto la sottomaschera).

Nella sottomaschera [subRischio], tra gli altri esiste il campo “tipologia”.

Vorrei che nella maschera [Inserimento] venga visualizzato (in un campo dedicato chiamato “rischio”) il messaggio “tipologia non indicata” qualora il campo “tipologia” fosse vuoto.

ho provato con il seguente  codice ma non funziona.

Private sub Form_Current()

If [subRischio].[Form]![tipologia.Value] Is Null Then
   rischio = "tipologia non indicata"
   Else
   rischio = " "
   End If

end Sub

potete aiutarmi?

grazie

25 Risposte

  • Re: ACCESS - VBA; VERIFICA DI UN DATO CONTENUTO IN UNA SOTTOMASCHERA

    Marco_bs:

    ho un database access con una maschera principale chiamata [Inserimento] ed una sottomaschera chiamata [subRischio].

    entrambe le maschere fanno riferimento alla medesima tabella “Inserimento”.

    Non conosco una situazione progettuale così. Che senso ha avere maschera/sottomaschera che puntano entrambe sulla stessa tabella? Generalmente una sottomaschera punta su una tabella figlia relazionata a una tabella madre…ecc…

    Anche i nomi propri delle tabelle li trovo inusuali. Andrebbero nominati al PLURALE.

  • Re: ACCESS - VBA; VERIFICA DI UN DATO CONTENUTO IN UNA SOTTOMASCHERA

    Il Senso di usare una SubForm è di visualizzare e/o Gestire dati relazionati con Logica 1-M

    Se la Tabella è la stessa… direi che non stai operando in modo corretto, anzi estremamente errato a livello concettuale.

    Quello che dici si realizza con una Struttura a schede eventualmente, rendendo VISIBILE o NON VISIBILE le schede con i dati che serve o non serve visualizzare.

    Ti suggersco di rivedere questa configurazione, oltretutto i dati lato 1 e lato M della SubForm potrebbero innescare un conflitto transazionale nel salvataggio… 

  • Re: ACCESS - VBA; VERIFICA DI UN DATO CONTENUTO IN UNA SOTTOMASCHERA

    Vi ringrazio per le precisazioni. cercherò di rivedere lo schema specifico di configurazione.

    ad ogni modo, riuscireste a dirmi quale codice usare avendo ipoteticamente:

    una maschera chiamata [Dati] con un campo ipoteticamente chiamato ‘controllo’

    una sottomaschera chiamata [subDati] con un campo ipoteticamente nominato ‘dato’

    in modo che nella maschera [Dati] il campo ‘controllo’ scriva “compila i campi” se il campo ‘dato’ della submaschera [subDati] non è compilato?

    Qualsiasi esempio trovato in rete non funziona, l'ultimo che ho trovato era questo

    Private sub Form_Current()

    If [subDati].[Form]![dato.Value] Is Null Then
       controllo = "compila i campi"
       Else
       controllo = " "
       End If

    end Sub

    vi chiedo già scusa se ho sbagliato a usare ' e/o " nella descrizione per nominare i campi ma avrete sicuramente compreso.

    vi ringrazio infinitamente

  • Re: ACCESS - VBA; VERIFICA DI UN DATO CONTENUTO IN UNA SOTTOMASCHERA

    Sia io che @Alex ti abbiamo detto che maschera/sottomaschera hanno motivo di esistere se Dati è “maschera singola” e mostra un solo dato alla volta, mentre subDati è (quasi sempre) in “foglio dati” con MOLTI record correlati. Cosa dovrebbe controllare [controllo] se in basso il campo [dato] “dovrebbe” apparire molte volte? 

    Secondo me c'è qualcosa di sbagliato nell'approccio di partenza. Consiglio di esporre tutta la problematica a più ampio respiro, ossia:
    - di cosa parla il database
    - nomi propri delle tabelle/maschere in relazione
    - nomi propri di tutti i loro campi
    - le relazioni
    - rispiega tutto passo passo secondo una logica relazionale di dati, usando i nomi propri dei campi, se necessario esponi un esempio pratico della tua problematica

  • Re: ACCESS - VBA; VERIFICA DI UN DATO CONTENUTO IN UNA SOTTOMASCHERA

    Grazie e scusami ancora per la poca completezza delle info. Non ho messo tutte le info perché si tratta di decine di campi e decine di informazioni.

    In realtà la sumaschera è correlata univocamente ai dati della maschera principale attraverso un ID univoco. Diciamo quindi che per la pratica numero 1a submaschera si apre filtrata sia in lettura che in inserimento esclusivamente su quell’ID. Non ho alcun rischio di trovarmi né una tabella né più record riferiti a quel campo.

    Il database funziona correttamente, ma c’è sto benedetto campo che è inserito nella submaschera e che li deve stare perché tratta un argomento a parte che vorrei poter sapere se è stato compilato o meno senza aprire la sottomaschera. 

    Vorrei solo, a prescindere dal progetto specifico di questo database capire come:

    da una maschera principale io possa valorizzare un campo di testo che mi dica se nella submaschera un determinato campo è stato compilato (per quello specifico numero che è esclusivo). I nomi che ho messo di maschere e campi erano semplicemente esempi per avere un codice poi più semplicemente intuibile. Possiamo chiamarli 

    [maschera1] , campo1, numeroctr

    [submaschera], campo2, numeroctr

    Dove numeroctr è la variable che mostra per la submaschera solo ed esclusivamente i campi riferiti al numetoctr visualizzato nella form [maschera1].
    Quindi campo1 deve scrivere “inserisci i dati” se campo2 nella [submaschera] è null
    Spero di aver chiarito. Grazie 

  • Re: ACCESS - VBA; VERIFICA DI UN DATO CONTENUTO IN UNA SOTTOMASCHERA

    Per me ti mantieni ancor troppo sulle generali. Siccome io sono molto duro di comprendonio, vorrei che tu esponessi

    19/01/2024 - OsvaldoLaviosa ha scritto:


    un esempio pratico della tua problematica

    19/01/2024 - marco_bs ha scritto:


    Non ho messo tutte le info perché si tratta di decine di campi e decine di informazioni.

    Io sento cattivo odore di NON NORMALIZZAZIONE…per questo ti ho posto tutte quelle linee di domande/informazioni.

  • Re: ACCESS - VBA; VERIFICA DI UN DATO CONTENUTO IN UNA SOTTOMASCHERA

    Allora: 

    [Inserimento] contiene tutti i dati di immobili di proprietà (circa 600 immobili): ndg identificativo (che è il codice univoco di cui parlavo nel precedente post), se esiste una due diligence (campo si/no), se l’immobile è trasferibile (campo si/no), campo regolarizzazione edilizia (si/no), campo incarico regolarizzazione (a tendina con scelta provider), campo data regolarizzazione ecc… ecc… ecc… ce ne sono altri 20 che è totalmente inutile elencare. Si ripete la cosa ma su argomenti diversi.

    Poi ci sono 6 sottomaschere in stile a linguetta.

    [subIndirizzi], [subDatiCatastali], [SubDueDiligence], [SubApe], [SubCertificazioni], [subAgenda]. Ognuna di queste sottomaschere è collegata in maniera UNIVOCA al campo ndg. Per cui compilando l’indirizzo nella sottomaschera [subIndirizzi] salvo l’indirizzo di quell’immobile, ecc.
    Esiste poi una ulteriore sottomaschera che si chiama [subDati]. Questa maschera però non è a linguetta come tutte altre. Si attiva (visible = true) solo su pressione di un tasto. Questo perché è volere che non sia sempre visibile. In questa [subDati] sono presenti i seguenti campi:

    Tipologia, Contesto, ScoreComune, fungibilità, Mercato, Manutenzione.

    Come tutte le altre è in maniera univoca collegata alla maschera principale con ndg.

    Nella maschera principale [Inserimento] esattamente sopra al pulsante che attiva la maschera [subDati] ho previsto un campo testo che mi dica se il campo Tipologia nella sottomaschera [subDati] sia stato compilato indicando il messaggio “compila i campi”.

    Premetto che il database funziona da oltre 2 anni, è preciso nel salvare i dati in modo univoco per ogni singolo immobile identificato in maschera e sottomaschere mediante ndg.

    Quindi la domanda è: in form_current ovvero nella maschera [Inserimento], nel campo di testo che chiamerò ‘controllo’ , come dicevo sopra al pulsante, che codice posso scrivere affinché se in [subDati] il campo ‘tipologia’ è compilato non esca alcun messaggio mentre se non è compilato nel campo ’controllo’ si visualizzi il msg “compila i dati”? Questo codice non funziona:

    Private sub Form_Current()

    If [subDati].[Form]![tipologia.Value] Is Null Then
       controllo = "compila i campi"
       Else
       controllo = " "
       End If
    End sub

    Più completo di così non saprei che aggiungere

    Grazie ancora .

  • Re: ACCESS - VBA; VERIFICA DI UN DATO CONTENUTO IN UNA SOTTOMASCHERA

    In realtà ci dovresti solo dire quante tabelle hai e quali campi sono contenuti in ogni tabella.
    E se metti in forum una immagine della pagina relazioni, sicuramente potremo essere più di aiuto.

    Ho l'impressione, come già ti hanno fatto notare che non hai le idee ben chiare sul significato di maschera principale e sottomaschera e che tu confonda la struttura del database, con la semplice visualizzazione dei dati, e che confonda la sottomaschera con altri tipi di controlli, tipo i controlli a schede.

    Se è vero che tutti i campi che hai nominato sono contenuti in una unica tabella, non puoi avere nemmeno le sottomaschere.

    E se le hai inserite, a parte gli effetti sui dati delle tabelle che non conosco, visto che non ho mai creato una maschera ed una sottomaschera che faccia riferimento alla stessa tabella e quindi ad uno stesso record, hai praticamente inserito elementi inutili al funzionamento vero e proprio del database.

    Quindi, facci vedere la struttura delle relazioni.

  • Re: ACCESS - VBA; VERIFICA DI UN DATO CONTENUTO IN UNA SOTTOMASCHERA

    Come ti hanno detto, non ha senso usare la stessa tabella in una subform.

    Se hai la necessità di nascondere dati in base a eventuali permessi, puoi suddividere la tabella e relazionarla 1 a 1 alla principale.

    Avrai la tabella “Inserimenti” (anche se il nome non ha senso in quanto la fase inserimento potrebbe riferirsi ad uno StatusMode della tabella ed il nome non ti fa capire cosa contiene la tabella) così composta:

    IdInserimento pk; altri campi visualizzabili.

    Tabella InfoInserimenti (o il nome che ti viene più consono allo scopo della tabella figlia) così composta:

    IdInfoInserimento pk (dove IdInfoInserimento=IdInserimento); altri campi che richiedono permessi per essere visualizzati).

    Quando apri la tabella Inserimenti, la tabella infoinserimenti si posiziona sullo stesso id e a quel punto puoi controllare il campo che ti serve sulla figlia e modificarlo, altrimenti, per come l'hai pensata tu, il controllo e la modifica devi farla sulla tabella riferita alla maschera “inserimento” ed eventualmente refreshare i dati della subform (lavoro superfluo).

    Suddividere una tabella serve per non portarsi dietro campi inutili che potrebbero essere tutti null

    Es. Nominativi: IdNominativo; bla bla… e InfoCommerciali: IdNominativo; fido; Contatto; Bla Bla… 

    Se devi lavorare sul nominativo e non servono info aggiuntive non alimenti la tabella info evitando di appesantire il db, ovviamente non per un singolo campo “tipologia”.

  • Re: ACCESS - VBA; VERIFICA DI UN DATO CONTENUTO IN UNA SOTTOMASCHERA

    Va bene tutto ciò che dite (a parte il fatto che come dicevo il programma non solo funziona benissimo ma è utilizzato da anni su un patrimonio che gestisce 600 immobili). 
    La mia domanda è una ed una soltanto:

    [Maschera1]; campo1,  campo univoco;

    [subMaschera], campo x, campo univoco legato a quello di [Maschera1].
     
    Quale codice si può scrivere affinché in campo1 esca un messaggio che dica se il campo x di [subMaschera] è compilato o meno?

    La domanda è solo ed esclusivamente quella. Esiste o non esiste un codice che legga il dato di un campo di una sottomaschera? Se esiste, potreste dirmi quale sia dato che quello riportato non funziona?

    Grazie 

  • Re: ACCESS - VBA; VERIFICA DI UN DATO CONTENUTO IN UNA SOTTOMASCHERA

    20/01/2024 - sihsandrea ha scritto:


    Come ti hanno detto, non ha senso usare la stessa tabella in una subform.

    Se hai la necessità di nascondere dati in base a eventuali permessi, puoi suddividere la tabella e relazionarla 1 a 1 alla principale.

    Avrai la tabella “Inserimenti” (anche se il nome non ha senso in quanto la fase inserimento potrebbe riferirsi ad uno StatusMode della tabella ed il nome non ti fa capire cosa contiene la tabella) così composta:

    IdInserimento pk; altri campi visualizzabili.

    Tabella InfoInserimenti (o il nome che ti viene più consono allo scopo della tabella figlia) così composta:

    IdInfoInserimento pk (dove IdInfoInserimento=IdInserimento); altri campi che richiedono permessi per essere visualizzati).

    Quando apri la tabella Inserimenti, la tabella infoinserimenti si posiziona sullo stesso id e a quel punto puoi controllare il campo che ti serve sulla figlia e modificarlo, altrimenti, per come l'hai pensata tu, il controllo e la modifica devi farla sulla tabella riferita alla maschera “inserimento” ed eventualmente refreshare i dati della subform (lavoro superfluo).

    Suddividere una tabella serve per non portarsi dietro campi inutili che potrebbero essere tutti null

    Es. Nominativi: IdNominativo; bla bla… e InfoCommerciali: IdNominativo; fido; Contatto; Bla Bla… 

    Se devi lavorare sul nominativo e non servono info aggiuntive non alimenti la tabella info evitando di appesantire il db, ovviamente non per un singolo campo “tipologia”.

    Questo credo sia utilissimo ad esempio per alleggerire il database, dovrei approfondire con te questa tematica, ma per ora mi servirebbe solo capire come in una maschera posso sapere con un messaggio di testo se un campo di una sottomaschera è compilato o no.

  • Re: ACCESS - VBA; VERIFICA DI UN DATO CONTENUTO IN UNA SOTTOMASCHERA

    20/01/2024 - marco_bs ha scritto:


    è compilato o no.

    Ti ho risposto: non è complicato ma lavora sulla tabella principale (visto che ha lo stesso campo nascosto) e poi fai un refresh della seconda.

    Oppure una sql update bla bla …. Where id=xyz magari al messaggio “campo da aggiornare” fai seguire il valore da aggiornare con la sql.

    Poi fai il refresh alla prima tabella e la seconda avrà il dato corretto.

  • Re: ACCESS - VBA; VERIFICA DI UN DATO CONTENUTO IN UNA SOTTOMASCHERA

    Ti chiedo scusa non avevo colto. Però mi manca proprio la base per tradurlo in codice.

  • Re: ACCESS - VBA; VERIFICA DI UN DATO CONTENUTO IN UNA SOTTOMASCHERA

    Io ho capito che hai troppi campi (magari molti non sempre necessari) che non ci stanno tutti in un'unica videata di maschera singola. Questa questione la risolvi con la struttura a schede (maschera/sottomaschera assolutamente no), mettendo i “restanti” campi in un'altra scheda.

    Brancolando nel “tuo” buio…prova questa soluzione

    Private Sub Form_Current()
    If IsNull(DLookUp("[dato]", "TuaTabella", “[IDDato] = ” & Me!IDDato)) Then
        Me!controllo = “compila i dati”
        Else
        Me!controllo = “”
    End If
    End Sub
Devi accedere o registrarti per scrivere nel forum
25 risposte