Partager via


Suppression d’enregistrements avec la méthode Delete

L’utilisation de la méthode Delete marque l’enregistrement actif ou un groupe d’enregistrements dans un objet Recordset pour suppression. Si l’objet Recordset n’autorise pas la suppression des enregistrements, une erreur se produit. Si vous êtes en mode mise à jour immédiate, les suppressions se produisent immédiatement dans la base de données. Si un enregistrement ne peut pas être supprimé avec succès (en raison de violations de l’intégrité de la base de données, par exemple), l’enregistrement reste en mode édition après l’appel à Update. Cela signifie que vous devez annuler la mise à jour à l’aide de CancelUpdate avant de quitter l’enregistrement actif (par exemple, en utilisant Close, Move ou NextRecordset).

Si vous êtes en mode de mise à jour par lot, les enregistrements sont marqués pour suppression du cache, et la suppression réelle se produit lorsque vous appelez la méthode UpdateBatch. (Pour afficher les enregistrements supprimés, définissez la propriété Filter sur adFilterAffectedRecords une fois Delete appelé.)

La tentative de récupération des valeurs de champ à partir de l’enregistrement supprimé génère une erreur. Après avoir supprimé l’enregistrement actif, l’enregistrement supprimé reste actif jusqu’à ce que vous accédiez à un autre enregistrement. Une fois que vous quittez l’enregistrement supprimé, il n’est plus accessible.

Si vous imbriquez des suppressions dans une transaction, vous pouvez récupérer des enregistrements supprimés à l’aide de la méthode RollbackTrans. Si vous êtes en mode de mise à jour par lot, vous pouvez annuler une suppression en attente ou un groupe de suppressions en attente à l’aide de la méthode CancelBatch.

Si la tentative de suppression d’enregistrements échoue en raison d’un conflit avec les données sous-jacentes (par exemple, si un enregistrement a déjà été supprimé par un autre utilisateur), le fournisseur retourne des avertissements à la collection Errors, mais ne cesse pas l’exécution du programme. Une erreur d’exécution ne se produit que s’il existe des conflits sur tous les enregistrements demandés.

Si la propriété dynamique Unique Table est définie et que l’objet Recordset est le résultat de l’exécution d’une opération JOIN sur plusieurs tables, la méthode Delete supprime uniquement les lignes de la table nommée dans la propriété Unique Table.

La méthode Delete accepte un argument facultatif qui vous permet de spécifier les enregistrements affectés par l’opération Delete. Les seules valeurs valides pour cet argument sont l’une des constantes énumérées AffectEnum ADO suivantes :

  • adAffectCurrent Affecte uniquement l’enregistrement actif.

  • adAffectGroup Affecte uniquement les enregistrements qui répondent au paramètre de propriété Filter actuel. La propriété Filter doit être définie sur une valeur FilterGroupEnum ou un tableau de Bookmarks à utiliser cette option.

Le code suivant montre un exemple de spécification pour adAffectGroup lors de l’appel de la méthode Delete. Cet exemple montre comment ajouter des enregistrements à l’exemple Recordset et mettre à jour la base de données. Ensuite, il filtre l’objet Recordset à l’aide du filtre adFilterAffectedRecords, qui laisse uniquement les enregistrements nouvellement ajoutés visibles dans l’objet Recordset. Enfin, il appelle la méthode Delete et spécifie que tous les enregistrements qui répondent au paramètre de propriété Filter actuel (les nouveaux enregistrements) doivent être supprimés.

'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