Maschera con mix di tabelle

di il
19 risposte

Maschera con mix di tabelle

Ciao a tutti.

Ho creato un database, tra le altre, così composto.

Tabella Anagrafica: ID, Cognome, Nome.
Tabella Riunioni: ID, Data, Note.
Tabella Presenze: ID, IDAnagrafica, IDRiunioni, Presenza (Campo Si/No).

Attualmente per la registrazione delle tabelle utilizzo una maschera dove devo selezionare per ogni record (quindi per ogni nuova riunione) IDRiunione e IDAnagrafica. Ovviamente il lavoro è lungo con possibilità di commettere errori molto elevata.

Quello che vorrei realizzare, che attualmente non riesco a fare, è una maschera Riunioni dove mi viene mostrato, per ogni riunione (record), la lista di tutti i membri (da Anagrafica) con l'aggiunta della voce Presenza come campo Si/No per definirne la presenza oppure no.

E' possibile realizzare una cosa del genere?

Update: Graficamente il risultato vorrebbe essere questo:

19 Risposte

  • Re: Maschera con mix di tabelle

    Sì.
    Costruisci una maschera/sottomaschera (ti consiglio la procedura guidata) Riunioni/Presenze. Durante la procedura, includi tutti i campi di entrambe le tabelle.
    Solo un dubbio. Ti serve veramente il campo Presenza (Sì/No)? Potresti semplicemente elencare solo gli IDAnagrafica che sono presenti, chi non c'è non compare affatto. Ovviamente si tratta di una scelta soggettiva.
  • Re: Maschera con mix di tabelle

    OsvaldoLaviosa ha scritto:


    Sì.
    Costruisci una maschera/sottomaschera (ti consiglio la procedura guidata) Riunioni/Presenze. Durante la procedura, includi tutti i campi di entrambe le tabelle.
    Solo un dubbio. Ti serve veramente il campo Presenza (Sì/No)? Potresti semplicemente elencare solo gli IDAnagrafica che sono presenti, chi non c'è non compare affatto. Ovviamente si tratta di una scelta soggettiva.
    Grazie per la risposta.
    Penso sia necessario il campo Presenza, perchè poi utilizzo dei report per stilare una lista dei presenti alla riunione e degli assenti. Senza tale elemento non riesco a calcolare gli assenti per riunione.

    Update: ho provato a fare come dici tu. Così mi mostra i valori correlati alla riunioni. Da un punto di vista solo espositivo può andare bene, perchè mi consente di vedere subito chi erano i presenti.
    Il problema sta però nel fatto che se passo alla riunione successiva la sottomaschera rimane completamente vuota. Questo perchè non vi sono stati presenti.
    Quello che vorrei avere è:
    1) per ogni Riunione nella maschera avrò la lista di tutti i membri;
    2) questa lista sarà integrata con la casella Si/No presa dalla tabella Presenze;
    3) posso registrare le presenze direttamente dalla maschera Riunioni semplicemente aggiungendo la spunta affianco al nome e tale dato viene registrato nella tabella Presenze.
  • Re: Maschera con mix di tabelle

    LucaDemo ha scritto:


    ...
    Il problema sta però nel fatto che se passo alla riunione successiva la sottomaschera rimane completamente vuota. Questo perchè non vi sono stati presenti.
    Quello che vorrei avere è:
    1) per ogni Riunione nella maschera avrò la lista di tutti i membri;
    2) questa lista sarà integrata con la casella Si/No presa dalla tabella Presenze;
    3) posso registrare le presenze direttamente dalla maschera Riunioni semplicemente aggiungendo la spunta affianco al nome e tale dato viene registrato nella tabella Presenze.
    Secondo me serve una procedura ad hoc per la creazione di una nuova riunione, in modo che oltre ad aggiungere un record alla tabella Riunioni, appena disponibile l'ID della riunione vada a creare un record nuovo per ogni Anagrafica nella tabella Presenze.
    Non so se attualmente hai un pulsante apposito per la creazione di una nuova riunione o usi semplicemente "Aggiungi record" (magari dal pulsantino con l'asterisco in fondo alla maschera).
    Nel primo caso, che a questo punto ti suggerirei di introdurre se non fai già così, è sufficiente inserire il codice lì. Devi però fare in modo che quello sia l'unico modo per aggiungere una riunione, essendo un'operazione abbastanza delicata. Magari lo inserisci in una transaction che permette di fare il rollback se non vuoi confermare l'inserimento.
    Altra via è quella di inserire nell'evento Current della maschera la verifica della proprietà NewRecord che faccia da discriminante tra uno scorrimento tra record (riunioni) già esistenti o uno nuovo e relativo inserimento delle anagrafiche in Presenze.
    Potresti creare una stringa per costruire una query di accodamento da eseguire con DbEngine.Execute N volte prendendo ogni ID da Anagrafiche (cicla il recordset da aprire sulla relativa tabella) oppure usare il metodo .AddNew su un recordset aperto su Presenze.
    Questa è solo la procedura che seguirei io, anche se non l'ho mai fatto. In teoria è così che dovrebbe funzionare.
    Prima cosa da decidere: come vuoi aggiungere una nuova riunione? Se poi hai bisogno di aiuto in fasi specifiche posta il codice che hai abbozzato ed integriamo.
    Mi quoto da solo
    Devi però fare in modo che quello sia l'unico modo per aggiungere una riunione, essendo un'operazione abbastanza delicata.
    Questa frase, anche se espressa come obbligo, in realtà è solo un suggerimento, per "la sicurezza". In realtà puoi avere entrambe le possibilità: pulsante di comando apposito o "aggiungi record" già disponibile in Access. Però devi creare una funzione apposita richiamabile in entrambi gli eventi. Niente di impossibile, dipende da quanto ne sai di vba.
  • Re: Maschera con mix di tabelle

    LucaDemo ha scritto:


    Penso sia necessario il campo Presenza, perchè poi utilizzo dei report per stilare una lista dei presenti alla riunione e degli assenti. Senza tale elemento non riesco a calcolare gli assenti per riunione.
    In assoluto ciò non è proprio vero. Ma se preferisci così per un tuo colpo d'occhio generale: che così sia.

    Per ottenere la lista verticale di tutte le Persone relative a ogni Riunione, Philcattivocarattere ci è andato vicino quando parla di "query di accodamento" che secondo me può essere impostata in maniera relativamente semplice per poi essere opportunamente richiamata all'occorrenza.
    Serve sicuramente una macro o corrispondente codice VBA...per attivare la query di accodamento...come sei messo da questo punto di vista?
  • Re: Maschera con mix di tabelle

    Conosco il VisualBasic ma non riesco proprio a integrarlo con Access, mi mancano le basi in questo senso.

    Però penso di essere riuscito a trovare una sorta di soluzione. Più o meno è come dite voi.

    Inserendo nella maschera un pulsante per l'inserimento di un nuovo Record, tramite macro posso dare esecuzione a un query di accodamento che copia tutti gli ID da Anagrafica e vengono portati in presenze. In questo modo mi visualizza tutti i membri per ogni riunione e posso definire le varie presenze senza problemi.
    Un solo guaio... la query di accodamento non viene eseguita a causa di "Violazione di chiave". Qui non capisco proprio l'errore; sto semplicemente cercando di copiare gli ID, come potete vedere da qui:
  • Re: Maschera con mix di tabelle

    LucaDemo ha scritto:


    ...
    Inserendo nella maschera un pulsante per l'inserimento di un nuovo Record, tramite macro posso dare esecuzione a un query di accodamento che copia tutti gli ID da Anagrafica e vengono portati in presenze. In questo modo mi visualizza tutti i membri per ogni riunione e posso definire le varie presenze senza problemi.
    Un solo guaio... la query di accodamento non viene eseguita a causa di "Violazione di chiave". Qui non capisco proprio l'errore; sto semplicemente cercando di copiare gli ID, come potete vedere da qui:
    è per questo che avevo scritto

    Philcattivocarattere ha scritto:


    Secondo me serve una procedura ad hoc per la creazione di una nuova riunione, in modo che oltre ad aggiungere un record alla tabella Riunioni, appena disponibile l'ID della riunione vada a creare un record nuovo per ogni Anagrafica nella tabella Presenze.
    Sono refrattario alle macro, non so aiutarti se segui quella strada.
  • Re: Maschera con mix di tabelle

    C'è da precisare come e dove vuoi accodare. Per esempio devi avere l'accortezza di accodare solo una volta per ogni Riunione altrimenti ti ritrovi, nella stessa Riunione, "Rossi Mario" ripetuto più volte, e questo tu non lo vuoi.
    A me non è chiaro se da oggi fino al 30/6/2016 hai una lista di Riunioni già preorganizzata, oppure preferisci inserire una Riunione alla volta e, per ogni singola Riunione, accodare UNA SOLA VOLTA.

    LucaDemo ha scritto:


    Conosco il VisualBasic ma non riesco proprio a integrarlo con Access

    Philcattivocarattere ha scritto:


    Sono refrattario alle macro, non so aiutarti se segui quella strada.
    No problem. Cercheremo di uniformare il discorso verso una soluzione VBA.
  • Re: Maschera con mix di tabelle

    No, le riunioni non sono organizzate. Per ora andiamo avanti inserendola di volta in volta.
  • Re: Maschera con mix di tabelle

    LucaDemo ha scritto:


    No, le riunioni non sono organizzate. Per ora andiamo avanti inserendola di volta in volta.
    Prova a prendere anche l'ID di riunione più elevato e ad inserirlo nella query, senza collegare la Tabella Riunione con le altre due tabelle. Dovresti avere come risultato un "prodotto matriciale" (mi sembra che si chiami così) che riporta l'ID della riunione su tutti i record.
    Prima prova come query di select, solo dopo trasformala in query di accodamento.
    Dovrebbe funzionare anche da macro in questo modo.
  • Re: Maschera con mix di tabelle

    Sì, così la query di accodamento funziona!
    Solo che invece che darmi l'ID della nuova riunione che andiamo ad inserire, lo accoda con l'ID dell'ultima riunione registrata
  • Re: Maschera con mix di tabelle

    Allora ragioniamo per piccoli passi.
    1. Devi considerare una query che prenda in considerazione la tabella Riunioni e, grazie al fatto che "in quel momento" la tua maschera Riunioni è posizionata su IDRiunione=4 tu possa filtrarne tale valore "corrente". Quindi
    2. Apri una query in visualizzazione struttura e importa la tabella Riunioni
    3. Trascina nella griglia il campo IDRiunione
    4. In corrispondenza di Criterio, scrivi
    [Maschere]![Riunioni]![IDRiunione]
    5. Importa la tabella Anagrafica
    6. Trascina nella griglia il campo ID (non aver paura di chiamarlo IDAnagrafica (io lo chiamerei così) come il corrispondente campo nella tabella figlia)
    7. Trasforma la tua query di selezione in query di accodamento, dicendo di voler accodare in Presenze
    8. Salva la tua query con nome AccodaAnagrafica

    Nella maschera (singola) Riunioni (in visualizzazione struttura) aggiungi un Pulsante al quale associare il seguente codice
    Private Sub NomePulsante_Click()
    DoCmd.OpenQuery "AccodaAnagrafica"
    Me![Nome sottomaschera].Requery
    End Sub
    Per ora ho scritto il minimo indispensabile, ma ovviamente servirebbe ottimizzare/vincolare il fatto di non poter eseguire tale click più di una volta, ossia non deve essere eseguito se nella sottomaschera sono presenti già dei record. Ci sarebbero vari trucchetti...io per esempio vincolo il fatto che se il DCount di una query simile alla precedente è >0, allora dico alla proprietà Visible del pulsante di impostarsi su False.
  • Re: Maschera con mix di tabelle

    LucaDemo ha scritto:


    Sì, così la query di accodamento funziona!
    Solo che invece che darmi l'ID della nuova riunione che andiamo ad inserire, lo accoda con l'ID dell'ultima riunione registrata
    Perché l'inserimento della riunione fatto da maschera non è ancora definitivo e nella tabella non c'è ancora. Questa è la spiegazione, Osvaldo ha già provveduto alla soluzione.
  • Re: Maschera con mix di tabelle

    Ho fatto quello che mi ha scritto però accoda 0 record.
  • Re: Maschera con mix di tabelle

    LucaDemo ha scritto:


    Ho fatto quello che mi ha scritto però accoda 0 record.
    Mostra la SQL della query e il codice che attiva la macro (o equivalente). In quale evento l'hai inserito?
Devi accedere o registrarti per scrivere nel forum
19 risposte