Relazioni tra più tabelle.

di il
9 risposte

Relazioni tra più tabelle.

Buongiorno, nonostante abbia spulciato diversi post, non sono riuscito a trovare una soluzione al mio problema. Dovrebbe essere una questione piuttosto banale, ma non riesco a venirne a capo.
Devo realizzare un'interfaccia per la gestione di un servizio di vigilanza.
Ho una tabella principale (MAIN) con:
- ID_MAIN (PK)
- DATA
- ORA
- VARI CAMPI TESTO

VARIE TABELLE (REGISTRI) CON
- ID_REGISTRO1 (PK)
- TESTO1
- TESTO2
- ID_MAIN_EXT

Ho collegato con relazione UNO A MOLTI il campo ID_MAIN con i campi ID,_MAIN_EXT delle tabelle registro in modo da fare una query che ricerchi l'ID_MAIN (che identifica il turno di servizio) per effettuare un riepilogo degli inserimenti effettuati durante il turno di servizio.

Il mio problema è che non riesco a riportare il valore del campo ID_MAIN nei vari campi ID_MAIN_EXT delle tabelle registro.

Mi potete dare una mano?

Grazie

https://drive.google.com/file/d/1-O4fGZaHfTsc0KI97HsZc3y_iwOUdErI/view?usp=drivesdk

9 Risposte

  • Re: Relazioni tra più tabelle.

    Io non capisco:
    1. Perché hai VARIE/MOLTE tabelle Registri?
    2. Perché parli di una "tabella principale MAIN" e non gli dai un nome proprio, magari al "plurale"?
  • Re: Relazioni tra più tabelle.

    1) Ho diverse tabelle (registri) perchè le informazioni da inserire sono molteplici, con diversi tipi di record e non possono essere raggruppate in un'unica tabella.
    2) la tabella "MAIN" è stata così chiamata proprio per fare capire che è la tabella madre da cui dipendono le altre; in quella tabella metterò la data e il turno di lavoro con inseriti i nominativi del personale in servizio per quel turno. Possiamo chiamarla anche "TURNI" per capirci meglio.
    Ad esempio
    ID_TURNI 1
    DATA 19/03/2019
    TURNO SERALE
    RESPONSABILE TIZIO CAIO

    se riuscissi ad associare l'ID_TURNI a dei campi con lo stesso valore sulle atre tabelle, potrei poi con facilità reperire le informazioni per stilare un rapporto delle attività nel turno ricercato.

    Spero di essere stato esauriente, in caso contrario sono a disposizione per ulteriori chiarimenti.

    Grazie.
  • Re: Relazioni tra più tabelle.

    Le relazioni tra tabelle sono frutto sempre e comunque di LOGICA. Quindi è molto importante capire di cosa si sta parlando. Tabella TURNI (al plurale): OK. Ma IDTurno (nome campo al singolare).
    Le altre tabelle hanno tutte campi UGUALI. Se hanno qualcosa che le contraddistingue l'una dall'altra basta aggiungere un ulteriore campo che ne discrimini il significato di ogni singolo record. Potremmo chiamare la tabella figlia DettagliTurni, con i campi:
    IDDettaglio (chiave primaria)
    Campo1
    Campo2
    Campo3
    IDTurno (chiave esterna)
    quindi devi creare la relazione (nella Finestra Relazioni) Turni.IDTurno uno-a-molti DettagliTurni.IDTurno.
  • Re: Relazioni tra più tabelle.

    Buonasera Osvaldo, i nomi dei campi delle tabelle sono fittizzi, non ho specificato il loro nome perchè non mi sembrava necessario.
    Come ho già scritto sopra, le tabelle conengono dati diversi; durante ogni turno di servizio, le tabelle verranno compilate dal personale indicato nella tabella TURNI (al plurale perchè prevede 4 turni al giorno per più giorni); ID_TURNO al singolare pechè identifica il personale in servizio, il turno e la data (per cui voglio che sia un contatore).
    Ho già creato le relazioni come può vedere dall'immagine https://drive.google.com/file/d/1-O4fGZaHfTsc0KI97HsZc3y_iwOUdErI/view?usp=drivesdk (ho erroneamente scritto ORA invece di TURNO).
    Il mio problema consiste nel fatto che vorrei che i campi ID_MAIN_EXT prendessero il valore di ID_MAIN al momento della loro compilazione come se fossero delle sottomaschere. Non so se è possibile effettuarlo direttamente dalle tabelle o devo scrivere del codice VBA nelle maschere.

    Grazie per la pazienza.
  • Re: Relazioni tra più tabelle.

    Cantack ha scritto:


    Il mio problema consiste nel fatto che vorrei che i campi ID_MAIN_EXT prendessero il valore di ID_MAIN al momento della loro compilazione come se fossero delle sottomaschere. Non so se è possibile effettuarlo direttamente dalle tabelle o devo scrivere del codice VBA nelle maschere.
    Ho capito che il tuo problema fondamentale è questo. Quindi non approfondisco più l'argomento "normalizzazione" e mi fido della tua struttura tabellare.
    La soluzione maschera/sottomaschera sarebbe quella ideale. Nel tuo caso direi obbligata. Se costruisci tutto con la procedura guidata e scegli l'opzione "Maschera/sottomaschera", Access imposta automaticamente la "sincronizzazione" da te voluta.
    Ora però tu hai una situazione più ingarbugliata, in quanto hai 1 tabella madre e 3 tabelle figlie. Quando vai a fare la procedura guidata sei costretto a scegliere solo una tabella figlia. Io direi di farlo per MAIN--->REGISTRO_1. Poi
    1. Apri la maschera MAIN in visualizzazione struttura
    2. Tra i comandi che trovi in alto ti suggerisco di attivare l'opzione "procedura guidata controllo"
    3. Aggiungi manualmente 2 sottomaschere e durante i suggerimenti guidati gli dici che vuoi REGISTRO_2, poi REGISTRO_3
    4. Non so se Access imposta automaticamente, in ogni caso, dopo aver creato le 2 sottomaschere, clicca al centro di una di esse e noterai evidenziata una CORNICE. Avvicina il mouse lungo la sua linea e clicca con il tasto destro per vedere le sue Proprietà. Quindi devi avere le impostazioni così:
    Collega campi secondari: ID_MAIN_EXT
    Collega campi master: ID_MAIN
    5. Ti consiglio anche di andare alle proprietà di tutti i campi ID_MAIN_EXT (quelli delle sottomaschere) e impostare
    Valore predefinito: [Maschere]![MAIN]![ID_MAIN]
    6. Salva tutto

    Volendo sfruttare la sincronizzazione a livello di tabelle, dovresti aggiungere un "Foglio dati secondario", quindi poi però sei costretto a scegliere solo una tabella tra REGISTRO_1, REGISTRO_2, REGISTRO_3. Nella creazione del foglio dati secondario ti apparirà una finestra dove devi anche lì impostare le proprietà "Collega campi secondari" e "Collega campi master".
  • Re: Relazioni tra più tabelle.

    Ottimo, ti ringrazio. Provo la soluzione e proposta e faccio sapere. Grazie.
  • Re: Relazioni tra più tabelle.

    Buongiorno, mi scuso per rispondere soltanto ora.
    Ho provato ad applicare la soluzione proposta e alcune varianti, ma non sono giunto ad una soluzione soddisfacente, pertanto, Vi chiedo cortesemente se è possibile utilizzare semplicemente un pulsante che copi l'ID della tabella principale (PK) nel campo correlato della tabella collegata (numerico).

    ID_main_ext (della tabella "figlia") prende il valore da ID_main della tabella principale).

    Mi potreste aiutare con il codice vba da associare ad un pulsante sulla tabella "figlia"?

    Grazie.

    PS ho cercato nel forum e ho trovato una situazione simile, ma non riesco ad applicarla perché sbaglio qualcosa nella sintassi.
  • Re: Relazioni tra più tabelle.

    In linea generale potresti concepire la cosa così:
    1. Il pulsante dalla maschera Main deve fare questo
    DoCmd.OpenForm "Nome maschera figlia", , , "[ID_main_ext] = " & Me![ID_main]
    2. In visualizzazione struttura maschera figlia, al campo ID_main_ext, imposta
    Valore predefinito: [Maschere]![Main]![ID_main]
  • Re: Relazioni tra più tabelle.

    @ Osvaldo
    Grazie, mi sono dimenticato di dirti che la tua soluzione mi ha risolto il problema.

    Grazie ancora.
Devi accedere o registrarti per scrivere nel forum
9 risposte