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 :

[Access97] Automatiser une procédure


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Par défaut [Access97] Automatiser une procédure
    Bonjour,

    Je rencontre a présent un petit problème, j'ai récupérer une base de données a remettre en forme, mais celle ci étant très différente de la forme demandée, il me faut supprimer certains enregistrements. Pour cela, j'ai commencer a filtrer une table de ma base, en supprimant les enregistrements de ma base qui ne me servent plus.

    De plus au sein d'un des formulaires de la base apparait une fonction de destruction qui elimine l'enregistrement de la table dont je parlai précédemment, et supprime tous les enregistrement liés dans les autres tables.

    Or mon problème est que cette procédure ne permet la destruction que d'un enregistrement à la fois. j'ai donc essayé de l'automatiser afin de supprimer l'ensemble des enregistrements que je ne souhaite pas garder.

    C'est pour cela que je m'en remet a vous afin de m'indiquer une marche a suivre afin de pouvoir rendre cette procédure utilisable sur l'ensemble des enregistrements .

    Cordialement Cyric

  2. #2
    Membre Expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Par défaut
    Citation Envoyé par Cyric Voir le message
    Or mon problème est que cette procédure ne permet la destruction que d'un enregistrement à la fois. j'ai donc essayé de l'automatiser afin de supprimer l'ensemble des enregistrements que je ne souhaite pas garder.
    Bonjour,

    De manière globale, tu peux faire ce genre de traitement à l'aide de requêtes et en profitant éventuellement des mécanismes de suppression en cascade disponibles dans les définitions de relations d'intégrité référentielle.

    Il faut que tu donnes plus de détails techniques pour que l'on puisse t'aider d'avantage. Montre par exemple le code existant pour supprimer un enregistrement et explique comment ce qui définit l'ensemble des enregistrements à traiter.

  3. #3
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bonjour

    Personnellement, je suggère la création d'une requête sur laquelle tu filtres les enregistrements à supprimer, puis tu les sélectionnes et tu les supprimes... menu Enregistrements/Supprimer les enregistrements ou bouton de barre d'outils.

    Il faut peut-être adapter les paramètres de l'intégrité référentielle dans la fenêtre des liaisons.

    Ok?
    "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...
    ---------------

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Par défaut
    Merci bien, j'avais deja pensé aux requetes, mais le nombre d'enregistrement dans cette base, me dérange un peu... enfin bon je garde cette technique sous le coude, voici en attendant le code qui me pose problème :

    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
    32
    33
    34
    35
     
    Public Function Destruction(dad As Long)
     Dim rSQL As String
     Dim BD As Database, enr As Recordset
    Set BD = DBEngine.Workspaces(0).Databases(0)
     
     
            ' DESTRUCTION COMPLETE
            ' destruction intervenants
            rSQL = "DELETE _responsable.* FROM _responsable WHERE (([NUM_dossier] = " & [dad] & " )) ;"
            DoCmd.RunSQL rSQL
            ' destruction liens
            rSQL = "DELETE _images.* FROM _images WHERE (([NUM_dossier] = " & [dad] & " )) ;"
            DoCmd.RunSQL rSQL
            ' destruction historique'
            rSQL = "DELETE _historique.* FROM _historique WHERE (([NUM_dossier] = " & [dad] & " )) ;"
            DoCmd.RunSQL rSQL
            ' destruction ouvrages'
            rSQL = "SELECT _ouvrages.* INTO destroy FROM _ouvrages;"
            DoCmd.RunSQL (rSQL)
            rSQL = "DELETE destroy.* FROM destroy WHERE (([NUM_dossier] <> " & [dad] & " )) ;"
            DoCmd.RunSQL (rSQL)
            Set enr = CurrentDb.OpenRecordset("destroy", dbOpenDynaset)
            If Not (enr.EOF) Then
               enr.MoveFirst
               While Not (enr.EOF)
                 destr_iota (enr!NUM_SIG)
                 enr.MoveNext
               Wend
            enr.Close
            End If
            'destruction fiche'
            rSQL = "DELETE _intitulé_dossier.* FROM _intitulé_dossier WHERE (([NUM_dossier] = " & [dad] & " )) ;"
            DoCmd.RunSQL rSQL
    End Function
    Pour le moment, "dad" ou Dossier A Détruire est en fait le numéro de dossier affiché dans le formulaire sur lequel se trouve le bouton qui fait appel a la destruction (tout fonctionne au poil si j'utilise pour chaque enregistrement, sauf qu'il y en a plusieurs milliers)

    Pour une meilleur compréhension, je vais tenter d'expliquer comment choisir les enregistrement a supprimer:

    Donc le principe est de rendre ma base dans un format type pour plusieurs autres bases de données, le probleme c'est que la mienne est très compliquée. Pour la simplifier on a décider de supprimer quelques types d'actes enregistrés, afin de supprimer les dossier qui n'ont plus d'actes pour élaguer dans la base. voila pourquoi le code est bien sympa puisqu'il s'occupe de tout, surtout que la structure relationnelle de cette base est un vrai foutoir.

    Cordialement

  5. #5
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Une solution serait de créer un recordset contenant les enregistrements à supprimer, puis de boucler sur ce recordset en appelant la fonction. Cela revient à créer une requête, mais en VBA... (solution 1)

    Une autre solution est de créer la requête dans Access, puis de créer un recordset qui boucle sur cette requête. (Solution 2)

    Solution 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    dim rs as adodb.recordset
     
    rs.open "select NUM_Dossier from MaBase where ...",currentproject.connection
    do while not rs.eof
        destruction rs!num_dossier
        rs.movenext
    loop
    Solution 2
    Créer une requête nommé, par exemple rqy_dad

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    dim rs as adodb.recordset
     
    rs.open "select num_dossier from rqy_dad",currentproject.connection
    do while not rs.eof
        destruction rs!num_dossier
        rs.movenext
    loop
    Cela t'aide-t'il?
    "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 averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Par défaut
    Ca ressemble effectivement a une solution, je m'en vais de ce pas tester tout ca, merci grandement

    Cordialement

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Par défaut
    Visiblement, cela ne fonctionne pas il m'affiche un message d'erreur "Memebre de méthode ou de données introuvable", et me surligne rs.Open


    Pour etre plus clair, j'ai dans le code de mon formulaire d'affichage, le code fourni précédemment et le code de destruction. et je demande a un bouton sur mon formulaire d'apeller la fonction fourni par Pierre Fauconnier, mais cela m'affiche le message.

    Mais je doit certainement mal m'y prendre, si vous pouviez me guider.

    Cordialement

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 22/11/2013, 05h18
  2. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  3. Réponses: 12
    Dernier message: 27/08/2003, 11h04
  4. Problème avec une procédure stockée
    Par in dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/05/2003, 15h33
  5. Fin de programme dans une procédure
    Par Sinclair dans le forum Langage
    Réponses: 13
    Dernier message: 29/11/2002, 22h30

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