IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Supprimer enregistrements avec ADO [XL-2019]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 231
    Points : 93
    Points
    93
    Par défaut Supprimer enregistrements avec ADO
    Bonjour,

    Je cherche à supprimer les enregistrements d'une base de données dont la date (MV_DECH) est plus ancienne que la date du jour.

    Voici mon premier essai non concluant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Sub Purge()
    Dim Jour As String
    Dim cnx As ADODB.Connection
    Dim rst As ADODB.Recordset
    Set cnx = New ADODB.Connection
    Set rst = New Recordset
    Jour = Format(Date, "mm/dd/yy")
     
    cnx.Open "Driver={Microsoft Visual FoxPro Driver};SourceDB=C:\Fichiers;SourceType=DBF;Exclusive=No"
     
    rst.Open "SELECT * FROM GPMOURES WHERE GPMOURES.MV_DECH < {" & Jour & "}", cnx, adOpenDynamic, adLockOptimistic
    rst.Delete
    rst.Update
    rst.Close
     
    cnx.Close
    End Sub
    La procédure s’exécute sans erreur mais les enregistrements sont toujours dans la bdd à la fin...

    Pouvez-vous m'aider ?

    Merci d'avance

  2. #2
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 422
    Points : 2 181
    Points
    2 181
    Par défaut
    Bonsoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SQL="delete GPMOURES WHERE GPMOURES.MV_DECH < {" & Jour & "}"
    cnx.execute sql

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 231
    Points : 93
    Points
    93
    Par défaut
    Merci beaucoup ça fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Purge()
    Dim Jour As String
    Dim cnx As ADODB.Connection
    Dim rst As ADODB.Recordset
    Set cnx = New ADODB.Connection
    Set rst = New Recordset
    Jour = Format(Date, "mm/dd/yy")
     
    cnx.Open "Driver={Microsoft Visual FoxPro Driver};SourceDB=C:\Fichiers;SourceType=DBF;Exclusive=No"
     
    rst.Open "DELETE FROM GPMOURES WHERE GPMOURES.MV_DECH < {" & Jour & "}", cnx, adOpenDynamic, adLockOptimistic
     
    cnx.Close
    End Sub
    Le but de l'opération est de réduire la taille de la bdd (env 700 mo) pour accélérer des requêtes SELECT.
    Or le fait de supprimer les champs avec DELETE ne réduit pas la taille de la bdd, mais pourtant les enregistrements ont bien été supprimés, saurais-tu pourquoi ?

    Merci

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 231
    Points : 93
    Points
    93
    Par défaut
    D'après ce lien (datant de plus 15 ans ), l'utilisation d'une requête DELETE sur une bdd DBF via ADO à pour effet de marquer les lignes sans les supprimer définitivement.

    Pour y remédier il faut utiliser la commande "PACK".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Sub Purge()
    Dim Jour As String
    Dim cnx As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim cmd As New ADODB.Command
    Set cnx = New ADODB.Connection
    Set rst = New ADODB.Recordset
    Set cmd = New ADODB.Command
     
    Jour = Format(Date, "mm/dd/yy")
    cnx.ConnectionString = "Provider=vfpoledb;Data Source=C:\Fichiers\;Extended Properties=dBASE IV;"
     
    'Tag les lignes à supprimer
    cnx.Open
    rst.Open "DELETE FROM [GPMOURES] WHERE MV_DECH < {" & Jour & "}", cnx, adOpenDynamic, adLockOptimistic
    cnx.Close
     
    'Purge les lignes à supprimer
    cnx.Open
    cmd.CommandType = adCmdText
    Set cmd.ActiveConnection = cnx
    cmd.CommandText = "Set Exclusive On"
    cmd.Execute
    cmd.CommandText = "PACK GPMOURES.DBF"
    cmd.Execute
    cnx.Close
     
    Set cnx = Nothing
    Set rst = Nothing
    Set cmd = Nothing
    End Sub
    Pour info ma base de données est passée de 708 à 3,7 mo

    Sujet résolu, merci.

  5. #5
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 422
    Points : 2 181
    Points
    2 181
    Par défaut
    Tout système de base de données flag les enregistrement à supprimer ?

    Ça veut dire qu'une requête de sélection n'affichera pas les enregistrement qui on subient une requête delete!

    Notes également qu'une requête de sélection ajoute à la base de données une table temporaire qui bien que dropper après utilisation reste persistante.

    Imagine un fichier texte on peut ajouter, modifié mais pas supprimer des lignes. Toutes les bases de données fonctionne comment ça.

    Pour réduire la base de données il faut en créer une autre sans implementer les enregistrement supprimer. En un mot il faut compacter la base de données et c'est vraisemblablement ce que fait l'instruction PACK!

    Notes également que tu peux ouvrir un Dbf avec Excel .

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 231
    Points : 93
    Points
    93
    Par défaut
    Merci pour les explications Thumb Down

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/07/2014, 11h48
  2. [AC-2003] supprimer enregistrements avec code vba sql
    Par maclolo2 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/07/2012, 08h05
  3. Mise à jour d'un enregistrement avec ADO
    Par muzele dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 05/11/2010, 21h12
  4. Recherche enregistrement avec ADO
    Par soso78 dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 24/05/2007, 22h00
  5. Enregistrer table Access triée avec ADO
    Par fikou dans le forum VBA Access
    Réponses: 2
    Dernier message: 08/05/2006, 18h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo