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

IHM Discussion :

[VBA-A97] DAO : Suppression d'enregistrements sur plusieurs tables suivant conditions


Sujet :

IHM

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 310
    Points : 139
    Points
    139
    Par défaut [VBA-A97] DAO : Suppression d'enregistrements sur plusieurs tables suivant conditions
    Bonjour à tous...

    Je me tourne vers vous car je bloque sur un cas un peu particulier !!!
    J'ai X Tables dans ma database, sur ces tables je supprime déjà X champs grâce à l'excellent tutos de Tofalu sur tout ce qui concerne DAO. Pour ce faire j'ai crée une tblChampASupprimer dans laquelle j'ai 2 champs : [TableSource] et [Champ], rien de bien compliqué je boulcue sur cette table et supprime donc les champs.

    Par contre maintenant j'aimerais supprimer des enregistrements sur ces tables selon des conditions...en bouclant bien sur sur une table qui donne les élements...
    En brut cela donnerais
    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
        Set oRst = oDB.OpenRecordset("SELECT * FROM tbl1 WHERE champ1=0")
        While Not oRst.EOF
            'Supprime l'enregistrement
            oRst.Delete
            'Passe au suivant
            oRst.MoveNext
        Wend
        Set oRst = oDB.OpenRecordset("SELECT * FROM tbl2 WHERE champ2=0")
        While Not oRst.EOF
            'Supprime l'enregistrement
            oRst.Delete
            'Passe au suivant
            oRst.MoveNext
        Wend
        Set oRst = oDB.OpenRecordset("SELECT * FROM tbl6 WHERE champ4=Null")
        While Not oRst.EOF
            'Supprime l'enregistrement
            oRst.Delete
            'Passe au suivant
            oRst.MoveNext
        Wend
        ...
    Vous comprendrez bien que ce n'est pas raisonnable ;-)

    L'idée serait donc de boucler sur une Table où j'aurais 3 champs : [Table], [Champ] et [Condition] par exemple et une idée du code serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Set oRst = oDB.OpenRecordset("tblEnregistrementASupprimer", dbOpenTable)
            With oRst
            While Not .EOF
                Set oRst = oDB.OpenRecordset("SELECT * FROM " & oRst![Table] & " WHERE " & oRst![Champ] &" =" & oRst![Condition])
                    While Not oRst.EOF
                        'Supprime l'enregistrement
                        oRst.Delete
                        'Passe au suivant
                        oRst.MoveNext
                    Wend
                .MoveNext
            Wend
        End With
    Mais là où ça me fait peur c'est sur l'imbrication des Set oRst, je le définis une 1ère fois pour dire où trouver les éléments servant à la boucle et je le définis de suite derrière pour lui dire quls enregistrements supprimer dans la table concerné !!! Ca risque de ne pas marcher !!!

    J'espère avoir été assez clair, ce n'était pas évident ;-)

    Merci à tous pour vos conseils :-)
    @+

  2. #2
    Membre régulier

    Inscrit en
    Août 2005
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 102
    Points : 119
    Points
    119
    Par défaut
    Pour ce que tu veux faire (et plus généralement, pour tous les cas où tu veux faire exactement la même chose sur plusieurs enregistrements), SQL est beaucoup plus concis et plus performant que DAO.

    Je réécris ton premier code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DoCmd.SetWarnings False
    DoCmd.RunSQL "DELETE * FROM tbl1 WHERE champ1=0"
    DoCmd.RunSQL "DELETE * FROM tbl2 WHERE champ2=0"
    DoCmd.RunSQL "DELETE * FROM tbl6 WHERE champ4=Null"
    DoCmd.SetWarnings True
    Et là si tu es un fan de boucles tu peux t'amuser. Voici l'équivalent de ton deuxième code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Set oRst = oDB.OpenRecordset("tblEnregistrementASupprimer", dbOpenTable)
     
    DoCmd.SetWarnings False
     
    While Not oRst.EOF
          DoCmd.RunSQL "DELETE * FROM " & oRst!Table & " WHERE " & oRst!Champ & oRst!Condition
          oRst.MoveNext
    Wend
     
    DoCmd.SetWarnings True
    Note : pour que le deuxième code marche il faut respecter la syntaxe SQL dans le champ Condition. Par exemple :

    =0
    IS NULL (avec une espace devant)
    ='nom'
    <>0
    IN ('nom1','nom2','nom3') (avec une espace devant)

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 310
    Points : 139
    Points
    139
    Par défaut
    Bonjour à tous,

    Merci pour ces conseils Meduse je test de suite ;-)

    @+

    Edit : C'est PARFAIT Merci encore :-)

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

Discussions similaires

  1. [VBA-E]Insertion d'un enregistrement sur plusieurs lignes
    Par gantec dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/03/2007, 11h43
  2. [SQL] Derniers enregistrement sur plusieurs tables
    Par bibom dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 28/07/2006, 23h22
  3. [VBA-A97] DAO : Suppression champs et création MCD...
    Par JeremieT dans le forum VBA Access
    Réponses: 27
    Dernier message: 01/06/2006, 17h34
  4. Réponses: 3
    Dernier message: 01/12/2005, 10h17
  5. enregistrement sur plusieurs tables
    Par vovor dans le forum Access
    Réponses: 2
    Dernier message: 03/10/2005, 11h25

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