Eliminazione di record con il metodo Delete

L'utilizzo del metodo Delete contrassegna il record corrente o un gruppo di record in un oggetto Recordset per l'eliminazione. Se l'oggetto Recordset non consente l'eliminazione dei record, si verifica un errore. Se si è in modalità di aggiornamento immediato, le eliminazioni vengono eseguite immediatamente nel database. Se un record non può essere eliminato correttamente, ad esempio a causa di violazioni dell'integrità del database, il record rimarrà in modalità di modifica dopo la chiamata ad Update. Ciò significa che è necessario annullare l'aggiornamento usando CancelUpdate prima di spostarsi dal record corrente, ad esempio usando Close, Move o NextRecordset.

Se si è in modalità di aggiornamento in batch, i record vengono contrassegnati per l'eliminazione dalla cache e l'eliminazione effettiva avviene quando si chiama il metodo UpdateBatch. Per visualizzare i record eliminati, impostare la proprietà Filter su adFilterAffectedRecords dopo la chiamata a Delete.

Il tentativo di recuperare valori del campo dal record eliminato genera un errore. Dopo l'eliminazione del record corrente, il record eliminato rimane corrente fino a quando non si passa a un record diverso. Una volta spostato dal record eliminato, non è più accessibile.

Se si annidano le eliminazioni in una transazione, è possibile ripristinare i record eliminati usando il metodo RollbackTrans. Se si è in modalità di aggiornamento in batch, è possibile annullare un'eliminazione in sospeso o un gruppo di eliminazioni in sospeso usando il metodo CancelBatch.

Se il tentativo di eliminazione dei record ha esito negativo a causa di un conflitto con i dati sottostanti (ad esempio, un record è già stato eliminato da un altro utente), il provider restituisce avvisi alla raccolta Errors ma non interrompe l'esecuzione del programma. Si verifica un errore di run-time solo se sono presenti conflitti in tutti i record richiesti.

Se la proprietà dinamica Unique Table è impostata e Recordset è il risultato dell'esecuzione di un'operazione JOIN in più tabelle, il metodo Delete eliminerà le righe solo dalla tabella denominata nella proprietà Unique Table.

Il metodo Delete accetta un argomento facoltativo che consente di specificare quali record sono interessati dall'operazione Delete. Gli unici valori validi per questo argomento sono le costanti enumerate ADO AffectEnum seguenti:

  • adAffectCurrent Influisce solo sul record corrente.

  • adAffectGroup Influisce solo sui record che soddisfano l'impostazione della proprietà Filter corrente. Per usare questa opzione, è necessario impostare la proprietà Filter su un valore FilterGroupEnum o su una matrice di Segnalibri.

Il codice seguente illustra un esempio di specifica di adAffectGroup quando si chiama il metodo Delete. Questo esempio aggiunge alcuni record all'oggetto Recordset di esempio e aggiorna il database. Filtra quindi l'oggetto Recordset usando la costante enumerata adFilterAffectedRecords, che lascia visibili solo i record appena aggiunti nell'oggetto Recordset. Infine, chiama il metodo Delete e specifica che tutti i record che soddisfano l'impostazione della proprietà Filter corrente (i nuovi record) devono essere eliminati.

'BeginDeleteGroup  
    'add some bogus records  
    With objRs  
        For i = 0 To 8  
            .AddNew  
            .Fields("CompanyName") = "Shipper Number " & i + 1  
            .Fields("Phone") = "(425) 555-000" & (i + 1)  
            .Update  
        Next i  
  
        ' update  
        .UpdateBatch  
  
        'filter on newly added records  
        .Filter = adFilterAffectedRecords  
        Debug.Print "Deleting the " & .RecordCount & _  
                    " records you just added."  
  
        'delete the newly added bogus records  
        .Delete adAffectGroup  
        .Filter = adFilterNone  
        Debug.Print .RecordCount & " records remain."  
    End With  
'EndDeleteGroup