Relazione molti a molti e intergità referenziale

di il
13 risposte

Relazione molti a molti e intergità referenziale

Ciao a tutti,
Ho una tabella A relazionata ad una tabella B molti a molti.
Per fare ciò ho nel mezzo una tabella X, il tutto con integrità referenziale.
Ora, se io immetto dati nella maschera A (che pesca dalla tabella A) e nella sottomaschera B (che pesca dalla tabella B), access mi crea un ID progressivo nella tabella di collegamento X.
Se inserisco dati errati, c' è un modo (tramite maschera) per cancellare i dati dalla tabella di collegamento X, senza doverlo fare a mano?

13 Risposte

  • Re: Relazione molti a molti e intergità referenziale

    Se A è molti-a-molti con B, entrambe sono gerarchicamente sullo stesso livello, ossia sono entrambi madri di X (figlia di entrambi). Parlare di sottomaschera B è errato.
  • Re: Relazione molti a molti e intergità referenziale

    ... Come forse qualcuno ricorderà, sono partito da questa situazione base:
    
                                TblDettaglioFumettiDisegnatore       
    TblFumetti                  [PK]IdDettaglioFD
    IdFumetto[PK](1)<------>(00)IdFumetto[FK]                         TblDisegnatori
    Titolo                      [FK]IdDisegnatore(00)<------------>(1)IdDisegnatore[PK]
    ....                                                              Nome
                                                                      Cognome
    

    OsvaldoLaviosa ha scritto:


    Se A è molti-a-molti con B, entrambe sono gerarchicamente sullo stesso livello, ossia sono entrambi madri di X (figlia di entrambi). Parlare di sottomaschera B è errato.
    Quindi, se io ho un record della tabella A (TblFumetti) composto da più record della tabella B (TblDisegnatori), come posso fare se non con una sottomaschera? (Tenendo presente che un record B può essere presente in più record A).
    Ho già raggiunto lo scopo prefissato (visivamente), ma vorrei "aggiustare" il problema che mi si presenta, in fase di immissione di un record sbagliato, dell' ID progressivo nella Tabella X (TblDettaglioFumettiDisegnatore).
  • Re: Relazione molti a molti e intergità referenziale

    Il tuo scenario tabelle evidenzia che puoi concepire solo 2 visualizzazioni maschera/sottomaschera così:
    TblFumetti/TblDettaglioFumettiDisegnatore
    TblDisegnatori/TblDettaglioFumettiDisegnatore
    Quando si presenta questo dilemma su quale preferire, bisogna cogliere quale aspetto pratico ti torna più utile. Io direi la prima che mi pare tu abbia già progettato.
    Poi, non so se lo hai già fatto, ma solitamente il campo IDDisegnatore (FK) è preferibile progettarlo con casella combinata in modo da rendere agevole l'input all'utente.
    Queste sono le considerazioni base che si possono fare di fronte al tuo scenario.

    Dopo di che, non si capisce qual'è il problema, cosa vuoi fare e perchè continui a parlare di sottomaschera B (errato).

    Filippo70 ha scritto:


    Se inserisco dati errati, c' è un modo (tramite maschera) per cancellare i dati dalla tabella di collegamento X, senza doverlo fare a mano?
    Se inserisci dati errati in un record di sottomaschera X devi selezionare l'intero record, quindi CANC o Elimina record (da menu).
  • Re: Relazione molti a molti e intergità referenziale

    OsvaldoLaviosa ha scritto:


    Se inserisci dati errati in un record di sottomaschera X devi selezionare l'intero record, quindi CANC o Elimina record (da menu).
    E non c'è un modo, tipo con un pulsante?

    OsvaldoLaviosa ha scritto:


    Dopo di che, non si capisce qual'è il problema,
    Io vorrei cancellare un record nella tabella allegata (che mi si compila in automatico essendo relazionata), senza doverla aprire e fare appunto CANC sul record errato.
    Il succo del discorso è che avendo sempre lavorato su tabella singola, non so come comportarmi avendo record relazionati tra di loro. Devo cancellare prima i padri? ... Prima i figli?
    Allegati:
    9927_683c7834ed663f1c5eb723cd2cb41f02.jpg
    9927_683c7834ed663f1c5eb723cd2cb41f02.jpg
  • Re: Relazione molti a molti e intergità referenziale

    Filippo70 ha scritto:


    Il succo del discorso è che avendo sempre lavorato su tabella singola, non so come comportarmi avendo record relazionati tra di loro. Devo cancellare prima i padri? ... Prima i figli?
    Ho la sensazione che ti fai inibire da un uso troppo essenziale di Access. Se lavori così solo in tabella DettagliFumettiDisegnatori con i campi che visualizzano solo il numero ti rendi la vita molto difficile.
    Come fai a ricordardi che IDDisegnatore=4 corrisponde a Mordillo? Per questo primo passo ti consiglio vivamente di usare le caselle combinate "ben organizzate".
    Non basta, stiamo ancora ragionando a livello di semplici tabelle. Se usi maschera/sottomaschera Fumetti/DettagliFumettiDisegnatori hai un quadro visivo e di input molto più efficace e gestire un input agevole minimizza i tuoi eventuali CANC.
    Non so se ho colto il nocciolo della tua questione.
  • Re: Relazione molti a molti e intergità referenziale

    OsvaldoLaviosa ha scritto:


    Se usi maschera/sottomaschera Fumetti/DettagliFumettiDisegnatori hai un quadro visivo e di input molto più efficace e gestire un input agevole minimizza i tuoi eventuali CANC
    Certamente che utilizzo maschera/sottomaschera (mi avete insegnato voi!), altrimenti quei numeri non mi servirebbero davvero a nulla!
    Ed è proprio dalla maschera/sottomaschera che vorrei (con un pulsante) poter cancellare un record che access inserisce in quella tabella.
  • Re: Relazione molti a molti e intergità referenziale

    Filippo70 ha scritto:


    Io vorrei cancellare un record nella tabella allegata (che mi si compila in automatico essendo relazionata), senza doverla aprire e fare appunto CANC sul record errato.
    Il succo del discorso è che avendo sempre lavorato su tabella singola, non so come comportarmi avendo record relazionati tra di loro. Devo cancellare prima i padri? ... Prima i figli?
    Devi accedere sempre da maschere, comunque.
    Si cancellano prima "i figli"... altrimenti il db sarebbe popolato da "orfani" e questo non è possibile con l'integrità referenziale attivata. Che impressione scrivere una roba del genere. Diciamo che prima si cancellano i dati dalla tabella dove ID è chiave esterna.
    Rileggo un po' tutto e cerco di capire. Ho riletto e non capisco.
    In base a quale criterio vuoi cancellare dati dalla tabella [TblDettaglioFumettiDisegnatore]?
    Crea due combobox, una per IDFumetto e un'altra per IDDisegnatore e costruisci una stringa che è una query di eliminazione
    If Len(Me!cboIDFumetto.Value & Me!cboIDDisegnatore.Value & "") = 0 Then
    Msgbox "Occhio che cancellerei tutto!"
    Exit sub
    End If
    
    strSQLDel = "DELETE FROM TblDettaglioFumettiDisegnatore WHERE "
    
    If Len(Me!cboIDFumetto.Value & "") > 0 Then
    strIDFumetto = "IDFumetto = " & Me!cboIDFumetto.Value
    End If
    
    If Len(Me!cboIDDisegnatore.Value & "") > 0 Then
    strIDDisegnatore = "IDDisegnatore = " & Me!cboIDDisegnatore.Value
    End If
    
    If Len(strIDFumetto) > 0 AND Len(strIDDisegnatore) > 0 Then
    strSQLDel = strSQLDel & strIDFumetto & " AND " & strIDDisegnatore
    Else
    strSQLDel = strSQLDel & strIDFumetto & strIDDisegnatore
    che poi puoi eseguire con
    DbEngine(0)(0).Execute strSQLDel
    Se ti intessa eliminare anche IDFumetto e/o IDDisegnatore dalle rispettive tabella, una volta "pulita" [TblDettaglioFumettiDisegnatore] lo puoi fare con un'altra query di eliminazione, una per ogni tabella.
    (ah... fai tante copie di backup prima delle prove)
    (post modificato parecchio dopo alcuni minuti)
  • Re: Relazione molti a molti e intergità referenziale

    Vabbè, ma prima di cancellare un record lo devi SELEZIONARE e manualmente pure. Visto che lo hai selezionato, mi devi dire se fai prima a fare clic sul pulsante ELIMINA oppure sul tasto di tastiera CANC.
    Mi sa che gira e gira siamo lì, ma non ne vedo la sostanza.
    Ci stai dicendo che vuoi proprio quel pulsante che fa quella cosa lì perchè fa bellezza sulla maschera?
  • Re: Relazione molti a molti e intergità referenziale

    Grazie a Osvaldo e Phil per il tempo che mi state dedicando.
    Avrò un pò di prove da fare in questo weekend!
    Phil? Hai modificato il tuo codice perchè avevi paura che mi auto-facessi troppi danni?
    Tranquillo i backup sono all' ordine del giorno! Tuttavia grazie per il pensiero gentile.
    Ma mi sa che non è proprio quello il mio obbiettivo, o meglio è quello ma ci vorrei arrivare in un modo diverso che non riesco a spiegarvi bene. Comunque ci risentiamo lunedì (dopo le prove).
    Intanto grazie ancora e buon weekend a tutti.
  • Re: Relazione molti a molti e intergità referenziale

    Filippo70 ha scritto:


    Grazie a Osvaldo e Phil per il tempo che mi state dedicando.
    Avrò un pò di prove da fare in questo weekend!
    Phil? Hai modificato il tuo codice perchè avevi paura che mi auto-facessi troppi danni?
    Non solo. In generale... metti il caso che non si seleziona nulla nelle due combo e che uno avvii la procedura di cancellazione... la frittata è fatta. Ad esempio si potrebbe impostare a False la proprietà Enabled del pulsante di comando che avvia la cancellazione, modificandola a True solo sull'evento AfterUpdate delle due combobox ma era troppo complicato da studiare subito.

    Filippo70 ha scritto:


    Ma mi sa che non è proprio quello il mio obbiettivo, o meglio è quello ma ci vorrei arrivare in un modo diverso che non riesco a spiegarvi bene. Comunque ci risentiamo lunedì (dopo le prove).
    e in base a quello che ci dici... pensiamo pensiamo pensiamo ( = questo invece è come penso io)
  • Re: Relazione molti a molti e intergità referenziale

    Dopo innumerevoli prove e riprove il succo stava nell' aver spuntato solo la casella applica integrità referenziale e non le altre due!!!
    Ci sono arrivato perchè dovevo scrivere il codice dei nuovi pulsanti (suggerimento di Phil) ma non mi faceva convertire le macro in VBA con access 2010. Allora ho provato a copiarmi il DB su access 2003 e li tutto funzionava regolarmente!!! (perchè ho dovuto riscrivere le relazioni a mano e ho spuntato tutto, già che c' ero). Allora perchè su Access 2003 funzionava e su Access 2010 no? L' ultimo input me l' ha dato Osvaldo facendomi ricontrollare le relazioni. Dovevo semplicemente spuntare tutto, cosicchè Access (con un solo pulsante nella maschera principale) adesso prima mi chiede se voglio veramente cancellare il record e i sui figli, e poi però mi consente la sua cancellazione. Grazie a tutti e due per il tempo che mi avete dedicato e scusate se vi ho fatto un pò "arrabbiare".
    Alla prossima
  • Re: Relazione molti a molti e intergità referenziale

    Filippo70 ha scritto:


    Dopo innumerevoli prove e riprove il succo stava nell' aver spuntato solo la casella applica integrità referenziale e non le altre due!!!
    Ci sono arrivato perchè dovevo scrivere il codice dei nuovi pulsanti (suggerimento di Phil) ma non mi faceva convertire le macro in VBA con access 2010. Allora ho provato a copiarmi il DB su access 2003 e li tutto funzionava regolarmente!!! (perchè ho dovuto riscrivere le relazioni a mano e ho spuntato tutto, già che c' ero). Allora perchè su Access 2003 funzionava e su Access 2010 no? L' ultimo input me l' ha dato Osvaldo facendomi ricontrollare le relazioni. Dovevo semplicemente spuntare tutto, cosicchè Access (con un solo pulsante nella maschera principale) adesso prima mi chiede se voglio veramente cancellare il record e i sui figli, e poi però mi consente la sua cancellazione
    Attento! le tre opzioni da spuntare nelle relazioni tra tabelle sono in ordine crescente di pericolosità (e di frequenza di utilizzo)
    La prima, Applica integrità referenziale: pericolosità quasi nulla e di uso fondamentale. E' pericolosa solo per chi ha scritto codice di pessima qualità o strutturato male il db perché evidenzia immediatamente tutti i difetti
    La seconda, Aggiorna campi correlati a catena: pericolosità intermedia perché pur non cancellando niente è difficile "tornare indietro" in caso di manovre sbagliate. Ma insomma... seppur relazionati male i dati ci sono ancora.
    La terza, Elimina record correlati a catena: pericolosità massima. Qui i record vengono cancellati. Certo, ci sono gli avvisi ma... si possono anche disabilitare, in via permanente, intenzionalmente, da interfaccia grafica o perché inseriti in qualche
    DoCmd.SetWarnings = False
    del codice che si considera innocuo.
    Che sia molto comodo, per quello che volevi fare, averle abilitate è indubbio ma molto pericoloso.
    Tanto che queste operazioni di aggiornamento - cancellazione "a cascata" dovrebbero (a mio avviso) essere oggetto di maschere ad hoc perché hanno un impatto notevole sui dati, delegando il tutto a codice appositamente studiato (che ad esempio può essere inserito in una transaction per avere un'ulteriore possibilità di ripensamento o che automaticamente crea copie di sicurezza delle tabelle o che riepiloga i dati aggiornati - cancellati salvandoli da qualche parte o ad esempio esportandoli in un foglio di calcolo o in un file di testo).
    Se ci metti le mani solo tu: chi è causa del suo mal pianga se stesso. Se ci mettono mano altri... potresti essere sempre tu la causa del mal (solo tuo o di tutti i fruitori del db) avendo permesso troppo facilmente alcune operazioni. Ehi, sia chiaro: anche da codice si possono far danni, ma se studiato bene è meno probabile.
    In qualche sito ricordo di aver visto che un utente aveva indicato nella parte relativa alla personalizzazione dei suoi post una frase che suona, in italiano, più o meno così: il mio codice è a prova di bug, non a prova di utonto (in inglese era user ma utonto rende meglio la traduzione).
  • Re: Relazione molti a molti e intergità referenziale

    Grazie per le delucidazioni Phil!
    p.s. come puoi immaginare, sono l' unico fruitore del db in oggetto, quindi mal che vada cercherò di darmele piano le martellate sulle dita!
Devi accedere o registrarti per scrivere nel forum
13 risposte