Eliminare record correlati -Access

Anonimo
2016-06-27T14:35:04+00:00

Buon pomeriggio, ho creato il codice sottostante per eliminare il record selezionato, ma non elimina nulla poiché mi compare il messaggio di errore allegato.

Come fare per poter eliminare il record selezionato con tutti i record correlati nelle altre tabelle?

Ciao Nicola.

Private Sub Comando216_Click()

Dim intAnswer As Integer

If Me.CognomeNome.Value & "" = "" Then

 MsgBox "Non è stato selezionato nessun Record da cancellare, campo Cognome e Nome Vuoto.", vbInformation, "OPERAZIONE IRREVERSIBILE"

Exit Sub

Else

intAnswer = MsgBox("Sei sicuro di voler eliminare questo record?", vbCritical + vbDefaultButton2 + vbYesNo, "ELIMINA RECORD")

    If intAnswer = vbYes Then

        If MsgBox("Sei proprio sicuro?" & Chr(13) _

        & " Non potrai piu' recuperare i dati cancellati!!!", vbCritical + vbYesNo + vbDefaultButton2, "OPERAZIONE IRREVERSIBILE") = vbNo Then

        Exit Sub

        Else

        DoCmd.SetWarnings False

        RunCommand acCmdSelectRecord

        DoCmd.RunCommand acCmdDeleteRecord

        DoCmd.SetWarnings True

        End If

    End If

Me.Requery

Me.Refresh

End If

End Sub

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2016-06-27T19:10:15+00:00

ciao Nicola,

un milione di anni fa....qui ....

http://web.mclink.it/MC5884/ faq.3.100 Individuare, in fase di cancellazione di un record, la correlazione di quel record con record di altre tabelle

avevo sviluppato una funzione appoggiandomi al metodo IsDependentUpon.

Se scarichi la demo trovi la funzione applicata a diverse maschere, trovi un bidone che ti permette di mostrare le correlazioni.

da qui, a cancellare il record correlato credo manchi poco.

Non ricordo nulla circa il suo funzionamento, ma testandolo gira ancora....forse anche da rivedere nella logica...magari se ho un attimo controllo....

Dacci un occhio...

Ciao, Sandro.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

15 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2016-06-29T13:05:26+00:00

    ciao Nicola,

    lo scopo della funzione è individuare le correlazione non di cancellarle, ma come le individui  le cancelli.

    prova a condividere una demo, non credo di  riuscire a capire la ragione del non funzionamento con le info che metti a disposizione.

    In ogni  caso, come ti  raccomando sempre....prova a  impostare un punto di interruzione e seguire il codice e personalizzarlo....altrimenti  resta un infruttuoso copia incolla...!

    hai provato  e debuggare la routine? :-)

    Ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2016-06-29T11:33:17+00:00

    Ciao Sandro proprio per verificare quello che mi segnala l'amico Mimmo, cioè che non risulterebbero tabelle correlate, ho importato nel mio DB dal tuo Db questo:

    1)

    Option Compare Database

    Option Base 1

    Option Explicit

    Public Function MostraTabelleCorrelate(OrigineDati As String, chiavePrimaria As String)

    Dim nuovaOrigineDati As Variant

    nuovaOrigineDati = Null

    Dim dbs As DAO.Database

    Dim tbl As DAO.TableDef

    Dim idx As DAO.index

    Dim parc As Integer

    Dim fld As DAO.Field

    Dim rel As DAO.Relation

    Dim i As Integer, j As Integer, nTables As Integer, nFields As Integer, MaxNumField As Integer, nCiclo As Integer

    Dim MyTablesName() As String, pk As String, TabPrimEst() As String

    Dim myTable As Variant

    Dim rst As DAO.Recordset

    Set dbs = CurrentDb

    If identificaOggetto(OrigineDati) = False Then

        Dim objQ As AccessObject, objT As AccessObject, dbst As Object

        Dim esciFor As Boolean

        Set dbst = Application.CurrentData

        ' Search for open AccessObject objects in AllQueries collection.

        For Each objQ In dbst.AllQueries

            If objQ.Name = OrigineDati Then

                For Each objT In dbst.AllTables

                    If objQ.IsDependentUpon(acTable, objT.Name) Then

                        Set tbl = dbs.TableDefs(objT.Name)

                        For Each tbl In dbs.TableDefs

                           If tbl.Name = objT.Name Then

                                For Each idx In tbl.Indexes

                                    If idx.Primary = True Then

                                        nuovaOrigineDati = objT.Name

                                        esciFor = True

                                    End If

                                Next

                            End If

                            If esciFor Then

                                Exit For

                            End If

                        Next

                    End If

                    If esciFor Then

                        Exit For

                    End If

                Next

            End If

            If esciFor Then

                Exit For

            End If

        Next

    ' se l'origine dati è una query composta da più tabelle determino la tabella della pk della form sottostante

    ' gli esciFor sono li utilizzo per uscire prima dal ciclo for each ... next quando non serve

        Set objQ = Nothing

        Set objT = Nothing

        Set dbst = Nothing

    End If

    If Not IsNull(nuovaOrigineDati) Then

            OrigineDati = nuovaOrigineDati

    End If

    nTables = dbs.TableDefs.Count ' numero delle tabelle in dbs

    Set tbl = dbs.TableDefs(OrigineDati)

    i = 1

    Set tbl = dbs.TableDefs(0)

    MaxNumField = 0

    For Each tbl In dbs.TableDefs

        If tbl.Fields.Count > MaxNumField Then

            MaxNumField = tbl.Fields.Count

        End If

    Next ' trovo il numero massimo di campi delle tabelle di dbs

    ReDim TabPrimEst(1, MaxNumField)

    For Each rel In dbs.Relations

        If rel.Table = OrigineDati Then

            TabPrimEst(1, i) = rel.ForeignTable

            i = i + 1

            TabPrimEst(1, i) = rel.Fields(0).ForeignName

            i = i + 1

        End If

    Next ' matrice con nome tabella esterna/e,pk esterna/e

    nCiclo = i

    ReDim MyTablesName(nTables, MaxNumField) ' ridimensiono la matrice per contenere i nomi delle tabelle e il numero massimo di campi

    i = 1

    j = 3

    For Each tbl In dbs.TableDefs

        If Left(tbl.Name, 4) <> "Msys" Then

            MyTablesName(i, 1) = tbl.Name

            j = 2

            For Each idx In tbl.Indexes

                If idx.Primary Then

                    Set fld = tbl.Fields(0)

                    If InStr(idx.Fields, ";") > 0 Then

                        For parc = 1 To nCiclo

                            If TabPrimEst(1, parc) = MyTablesName(i, 1) Then

                                MyTablesName(i, 2) = TabPrimEst(1, parc + 1)

                                Exit For

                            End If

                        Next

                    Else

                        MyTablesName(i, 2) = Mid(idx.Fields, 2, Len(idx.Fields))

                    End If

                End If

                If idx.Foreign = True Then

                    j = j + 1

                    MyTablesName(i, j) = Mid(idx.Fields, 2, Len(idx.Fields))

                End If

            Next

            i = i + 1

        End If

    Next ' memorizzo nella matrice il nome delle tabelle nella colonna1, la pk nella colonna2 e le chiavi esterne nella colonna3

    myTable = Null

    For i = 1 To nCiclo - 1

        For j = 1 To nTables

            If TabPrimEst(1, i) = MyTablesName(j, 1) Then

            Set rst = dbs.OpenRecordset(MyTablesName(j, 1), dbOpenTable)

               While Not rst.EOF

                     If rst(TabPrimEst(1, i + 1)) = chiavePrimaria Then

                        myTable = (myTable + ", " + vbCrLf) & MyTablesName(j, 1) & " con questo riferimento " & rst(MyTablesName(j, 2))

                        'Debug.Print myTable

                     End If

                     rst.MoveNext

                Wend

             End If

        Next

    Next

    myTable = myTable & "."

    If myTable <> "." Then

        'MsgBox ("Non puoi cancellare questo record in quanto contiene record correlati in queste tabelle:" + vbCrLf + myTable), vbCritical

        ' è possbile utilizzare anche un msgbox, se il numero delle correlazione non è elevato.

        ' in caso contrario non sono completamente visibili

        DoCmd.OpenForm "ErroreTabelleCorrelate", , , , , , myTable

    End If

    Set tbl = Nothing

    Set idx = Nothing

    Set dbs = Nothing

    Set fld = Nothing

    Set rel = Nothing

    Set rst = Nothing

    End Function

    2) Private Sub DelRecord_Click()

    On Error GoTo Err_DelRecord_Click

        Call MostraTabelleCorrelate(Me.RecordSource, Me.IDCliente)

    Exit_DelRecord_Click:

        Exit Sub

    Err_DelRecord_Click:

        Resume Exit_DelRecord_Click

    End Sub

    3) Form_ErroreTabelleCorrelate

    4) attivata la libreria Microsoft DAO 3.6 Object Library

    e facendo click sul pulsante al punto 2 non accade nulla, non compare la Form che mi avvisa delle tabelle collegate.

    Cosa non va?

    Ciao Nicola.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-06-29T09:17:59+00:00

    Ciao Sandro, ciao Mimmo, scusatemi per il ritardo della risposta, ho lavorato fuori paese per 2 giorni consecutivi

    Per Sandro: ho analizzato il tuo suggerimento e aperto il Db da te creato tanto tempo fa ed ho notato che mi segnala le tabelle correlate ma non mi elimina il record evidenziato e i correlati nelle altre tabelle.

    Per questo ti chiedo, ma l'eliminazione in questo caso è impossibile farla con codice oppure devo necessariamente eliminare i record correlati a mano e poi eliminare il record evidenziato nella maschera principale?

    Ciao Nicola.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2016-06-28T12:49:21+00:00

    Ciao,

    dalle relazioni sembra proprio che non vi siano tabelle figlie ecc.

    io aggiungerei un Id proprio come chiave primaria alla tabella tblAutoFinanziamento mantenendo Id_Socio come chiave esterna.

    Facci sapere

    Mimmo

    P.S. Quale è l'origine record della maschera su cui hai il pulsante Comando216 ?

    La risposta è stata utile?

    0 commenti Nessun commento