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

VBA Access Discussion :

Suppression des données dans toutes les tables d'une base en un clic


Sujet :

VBA Access

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 120
    Points : 65
    Points
    65
    Par défaut Suppression des données dans toutes les tables d'une base en un clic
    Bonjour à tous,

    C'est peut-être une question bête mais

    J'ai une base données MsAccess qui contient plusieurs tables. Je veux supprimer toutes les données de toutes les tables de cette base de données en un seul clic. En dehors de " delete from nomtable", existe-t-elle une autre possibilité pour le faire tout en gardant les structures de ces tables?

    Merci de votre réponse à cette question qui frise la bétise!

    __________________________________________________________________
    Demander n'est pas bête!

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Tu peux voir dans ce post comment récupérer toutes les tables de la base de données en cour.

    Il te suffit ensuite d'adapter la boucle pour supprimer toutes les données de toutes les tables.
    Amicalement

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour.

    Non spécialiste d'Access, voilà comment je procèderait :

    Je créerait (soit par les assistants, soit par le code) une requête de suppression d'enregistrement pour chaque table à "vider".

    Ensuite, les regrouper sous une macro reliée à un bouton de formulaire.

    Ou bien tout écrire en code derrière un bouton de formulaire.
    En code pour une table, ça donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DoCmd.RunSQL "DELETE MATABLE.UNNOMDECHAMPDEMATABLE
    FROM MATABLE;"
    Une ligne par table à netoyer

    Et voila !

  4. #4
    Membre actif Avatar de spaiku
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Septembre 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2007
    Messages : 209
    Points : 293
    Points
    293
    Par défaut
    Bonsoir,

    il y a mieux que la solution que tu envisages, c'est-à-dire plus évolutif. Le principe est le suivant : tu écris une boucle qui fait le tour de toutes les tables de ta base, et à chaque fois, tu supprimes les enregistrements. Mais attention, il existe des tables système auxquelles il vaut mieux ne pas toucher. Le mieux est donc de nommer tes tables en commençant par T_ (ex : T_Client, T_Commande, T_Produit, etc.) Dans une fonction, tu peux ensuite écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim Tbl as TableDef
    For Each Tbl in CurrentDb
        If Left(Tbl.Name, 2) = "T_" Then
            Docmd.RunSQL "DELETE FROM " & Tdf.Name & ";"
        End If
    Next Tbl
    Dans ton premier post, tu demandes "en dehors de Delete From NomTable". Pourquoi ? Cette requête ne supprime pas la table, donc te permet de conserver la structure.

  5. #5
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Bonsoir

    Il est vachement préférable "d'oublier" les tables systèmes, et s'appuyer (désolé, spailu) sur les noms des tables qui commencent pas "T" est à mon avis un peu léger.

    Les tables systèmes commencent par "MSys"...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Test()
        Dim MaTable As DAO.TableDef
        Dim sql As String
     
        For Each MaTable In CurrentDb.TableDefs
            If Left(MaTable.Name, 4) <> "MSys" Then
                sql = "delete from " & MaTable.Name
                DoCmd.RunSQL sql
            End If
        Next
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 350
    Points : 1 701
    Points
    1 701
    Par défaut
    Bonsoir,

    Dans bien des cas on risque de rencontrer quelque soucis avec l'intégrité référentielle.

    Il semble préférable de créer une table pour assurer l'ordre de suppression.
    D'abord les tables "côté plusieurs" avant les tables "côté un" apparentées.

    La table --> zTbl_DeleTout--> deux champs :
    __ Ordre --> Numérique
    __ NomTable --> Texte

    Dans un module :
    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
    Public Function SupDansTbl() As Boolean
    On Error GoTo Erreur_SupDansTbl
        Dim db As DAO.Database
        Dim rst As DAO.Recordset
         Set db = CurrentDb()
         Set rst = db.OpenRecordset( _
         "zTbl_DeleTout", dbOpenSnapshot)
     
        Do Until rst.EOF
            db.Execute "DELETE * FROM " & rst!NomTable
            rst.MoveNext
        Loop
     
        rst.Close
        Set rst = Nothing
        SupDansTbl = True
    ExitHere:
        Exit Function
     
    Erreur_SupDansTbl:
        SupDansTbl = False
        MsgBox "Erreur " & Err & ": " & Err.Description, , _
         "SupDansTbl()"
        Resume ExitHere
        Resume
    End Function
    Cordialement.
    Questions techniques par MP
    Le peu que je sais, c'est à mon ignorance que je le dois.
    ...............................................................................Sacha Guitry

  7. #7
    Membre actif Avatar de spaiku
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Septembre 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2007
    Messages : 209
    Points : 293
    Points
    293
    Par défaut
    GBAGO : je pense que tu es en de bonnes mains...

    Pierre : Merci pour la remarque, c'est vrai que se baser sur le début du nom des tables système est plus cohérent.

  8. #8
    Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 120
    Points : 65
    Points
    65
    Par défaut Merci pour vos multiples réponses
    Je remercie les uns et les autres pour vos réponses!

    Vos réponses aideront certainement ceux qui sont dans la même situation que moi.
    Je suis toujours ravi que je poste ma demande sur notre excellent site d'entraide!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/04/2015, 09h29
  2. Réponses: 1
    Dernier message: 06/11/2009, 16h54
  3. Réponses: 2
    Dernier message: 14/11/2008, 17h42
  4. Rechercher une donnée dans toutes les tables d'une BDD
    Par TheYoMan dans le forum Paradox
    Réponses: 2
    Dernier message: 23/10/2008, 20h24
  5. Réponses: 2
    Dernier message: 25/06/2006, 20h06

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