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 :

[VBA][DAO]MoveFirst qui renvoie n'importe où...


Sujet :

VBA Access

  1. #1
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut [VBA][DAO]MoveFirst qui renvoie n'importe où...
    Bonjour, j'aurai besoin de votre aide

    Alors voilà je souhaite supprimer les premiers enregistrements de ma table MAIS le movefirst ne marche pas... il supprime les enregistrement à partir de la 7ième ligne...
    j'ai regardé un peu partout mais je n'ai pas trouvé d'où venait mon problème.

    Voilà un bout de mon code:
    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
    'dans la table SYSTEME
     
            a% = rst_S.RecordCount
     
            'on enlève au nombre total d'enregistrements la différence pour que ce soit l'équivalent de 4 mois
            'pour les systèmes il faudrait 372 enregistrements pour avoir 4 mois
            'on enlève 1 pour l'enregistrement test et 1 encore pour avoir bien 372 enregistrements
     
            For d% = 0 To (a% - 372 - 1 - 1)
     
                With rst_S
                    .MoveFirst
                    .Delete
                End With
     
            Next
    ~ Lola ~

  2. #2
    Membre expérimenté
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Points : 1 664
    Points
    1 664
    Par défaut
    Non! J'affirme que MoveFirst positionne le poiteur au premier enregistrement d'un jeu d'enregistrements (recordset). Ce qu'il faut savoir c'est qu'un jeu d'enregistrements peut être une table ou une requête (SQL SELECT). Pour cette dernière, le premier enregistrement varie selon le fait que dans ton isntruction SQL il y a un filtre (critère) ou un tri au niveau de certains champs.
    Nous serons fixés dès que tu nous donnes des informations plus complètes comme l'objet de ton recordset, la contruction de la table, etc.
    Mais à vue d'oeil, ton code devrait supprimer le premier enregistrement.
    Bon courage et @+
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici nous avons réuni théorie et pratique: Rien ne fonctionne ... et personne ne sait pourquoi!
    Albert Einstein

  3. #3
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Merci d'avoir répondu tout d'abord.
    On veut supprimer les enregistrements d'une table.
    La table a été crée manuellement car les données ont été transférées de Excel vers Access.
    Il n'y a pas de filtre que j'ai créé personnellement. Est-ce que des critères ou des filtres peuvent apparaître par la suite?
    ~ Lola ~

  4. #4
    Membre expérimenté
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Points : 1 664
    Points
    1 664
    Par défaut
    Bonjour,
    Citation Envoyé par lola06
    Merci d'avoir répondu tout d'abord.
    On veut supprimer les enregistrements d'une table.
    La table a été crée manuellement car les données ont été transférées de Excel vers Access.
    Il n'y a pas de filtre que j'ai créé personnellement. Est-ce que des critères ou des filtres peuvent apparaître par la suite?
    Je suis d'accord mais je parle de ton objet recordset. Comment l'as-tu initialisé.
    Donc c'est au niveau de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set rst = Currentdb.OpenRecordSet(...)
    Est-ce que c'est le nom de la table que tu as mis entre les parenthèses ou une instruction SQL?
    Il serait mieux de placer ici le code entier, tu ne crois pas?
    Bon courage et @+
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici nous avons réuni théorie et pratique: Rien ne fonctionne ... et personne ne sait pourquoi!
    Albert Einstein

  5. #5
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Voilà le code en entier :

    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
     
    Sub ProdayQuotidien()
    Dim a%, d%
    'on définit la base de données
    Dim db As DAO.Database
    Dim rst_S As DAO.Recordset
     
    Set db = OpenDatabase("S:\DI.VE.QS\DIVE_EX_QDS\access\proday_quotidien.mdb")
    Set rst_S = db.OpenRecordset("SYSTEME2")
     
    'on supprime le premier enregistrement dans les différentes tables
     
     
        'dans la table SYSTEME
            'on compte le nombre total d'enregistrement dans la table
            a% = rst_S.RecordCount
     
            'on enlève au nombre total d'enregistrements la différence pour que ce soit l'équivalent de 4 mois
            'pour les systèmes il faudrait 372 enregistrements pour avoir 4 mois
            'on enlève 1 pour l'enregistrement test et 1 encore pour avoir bien 372 enregistrements
     
            For d% = 0 To (a% - 372 - 1 - 1)
                With rst_S
     
                    .MoveFirst
                    .Delete
     
                End With
            Next
     
    'on ferme les objets
    db.Close
    Set rst_S = Nothing
     
    End Sub
    je n'ai pas mis de SQL car je ne maitrise pas très bien...
    ~ Lola ~

  6. #6
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Quelques précisions :

    Au tout début ça supprimait à partir du 7ième enregistrement.
    Dans le forum j'ai vu qu'il fallait ajouter MoveLast avant MoveFirst, et du coup ça supprime tout à la fin, c'est comme s'il ne reconnaissais plus du tout MoveFirst.

    Je ne vois pas du tout quoi faire, je n'arrète pas de chercher mais rien n'y fait...
    ~ Lola ~

  7. #7
    Membre expérimenté
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Points : 1 664
    Points
    1 664
    Par défaut
    Bon pour commencer, j'ai des questions:
    1. La base de données
    Est-ce que la base de données S:\DI.VE.QS\DIVE_EX_QDS\access\proday_quotidien.mdb est la base de données courante dans laquelle se trouve le code à exécuter?
    Si oui, il suffit que tu l'initialises comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set db = CurrentDb

    2. La table SYSTEM2

    Est-ce que lors de l'importation des données (depuis Excel) vers cette table, as-tu défini un champ clé primaire parmi les champs de la table?
    Si oui, il faut regarder les propriétés de ce champ car il est de toute manière indéxé.
    Qutre question sur cette table: est-ce que les enregistrements contenus dans la table ont un identifiant automatique, du genre Référence à numérotation automatique?
    Si oui, est-ce que l'on peut se fier à cet identifiant de manière pouvoir à dire que l'enregistrement dont le contenu de ce champ est égale à 1 est le premier enregistrement: ainsi on peut classer les enregistrements dans l'ordre croissant selon l'ordre croissant de cet identifiant.

    Si les réponses des questions en 2 sont oui, alors vérifies les propriétés du (des) champ(s) indéxé(s).

    Autrement, SQL peut bien faire des chose et il n'est pas du tout compliqué. Je pose que le champ qui te sert d'identifiant automatique (truc référence machin) se nomme RéfSyst, alors dans l'initialisation de ton recordset j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim xTop As Long
    xTop = 370 '372-1-1
    Set rst_S = db.OpenRecordset("SELECT TOP " & xTop & " * FROM SYSTEME2 ORDER BY SYSTEME2.RéfSyst;", dbOpenDynaset)
    ...
    Ben, voila, à toi d'essayer et de voir, on attend la suite.
    Bon courage et @+
    Cordialement,
    Thierry
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici nous avons réuni théorie et pratique: Rien ne fonctionne ... et personne ne sait pourquoi!
    Albert Einstein

  8. #8
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Pour la base de donnée, j'exécute bien mon module dans la base de données : S:\DI.VE.QS\DIVE_EX_QDS\access\proday_quotidien.mdb donc je remplace par
    Sinon ma table SYSTEME2 a pour clé primaire un NuméroAuto, le problème c'est que ce numéro ne commencera pas toujours par 1.
    J'explique, j'ai fait précédement une macro qui envoie régulierement des données de Excel vers Access, le numéroauto s'incrémente à chaque nouvel enregistrement. Je ne veux garder les enregistrements que pour 4 mois (d'où la vérification des 372 enregistrements) : s'il y en a plus je supprime les premiers qui ont été entré, au bout de plusieurs fois mon premier NuméroAuto ne sera plus 1.

    En fait c'est comme si le code ne reconnaissait pas le MoveFirst et n'en tenait pas compte

    J'espère que c'est un peu plus clair, sinon n'hésite pas j'essairai d'expliquer autrement.
    ~ Lola ~

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,
    Citation Envoyé par lola06
    En fait c'est comme si le code ne reconnaissait pas le MoveFirst et n'en tenait pas compte
    Déjà tu fais une erreur conceptuelle.
    Un Recordset n'est pas dynamique : le nombre de lignes n'est pas automatiquement diminué à chaque Delete.
    Si tu supprimes un enregistrement, il est marqué comme effacé, mais c'est tout.
    Donc, si dans la boucle tu repositionnes à chaque fois le Recordset au début avec MoveFirst, en théorie tu devrais toujours appliquer Delete au même premier enregistrement ! En pratique, je pense que le résultat est indéterminé.
    C'est pour ça que c'est la panique !

    Je pense que tu dois compter le nombre de lignes à supprimer et ensuite les parcourir toutes avec MoveNext pour leur appliquer la méthode Delete.

    Ensuite, pour être certaine que tu utilises bien la clé primaire comme index de parcours, tu peux ouvrir un Recordset de type dbOpenTable.
    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
    Sub ProdayQuotidien()
        Dim a%, d%
        Dim db As DAO.Database
        Dim rst_S As DAO.Recordset
     
        Set db = CurrentDb
        Set rst_S = db.OpenRecordset("SYSTEME2", dbOpenTable)
     
        'dans la table SYSTEME
        'on compte le nombre total d'enregistrement dans la table
        rst_S.MoveLast
        a% = rst_S.RecordCount
     
        'on enlève au nombre total d'enregistrements la différence pour que ce soit l'équivalent de 4 mois
        'pour les systèmes il faudrait 372 enregistrements pour avoir 4 mois
        'on enlève 1 pour l'enregistrement test et 1 encore pour avoir bien 372 enregistrements
     
        rst_S.MoveFirst
        For d% = 0 To (a% - 372 - 1 - 1)
            If rst_S.EOF Then Exit For
     
            rst_S.Delete
            rst_S.MoveNext
        Next
     
        Set rst_S = Nothing
    End Sub

  10. #10
    Membre expérimenté
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Points : 1 664
    Points
    1 664
    Par défaut
    Re,
    @lola
    Ce que je voulais dire par l'identifiant c'est qu'on peut suivre la chronologie des enregistrements insérés par l'ordre de cet identifiant. Tu viens de le confirmer. Je précise donc que les enregistrements les plus anciens sont les enregistrements dont la valeur de l'identifiant est proche de 1; les enregistrements les plus récents sont les enregistrements dont la valeur de l'identifiant tend vers l'infini.
    Tu confirmes?
    Si oui, alors le fait de trier ces enregistrements en fonction de ce NuméroAuto permet de classer les enregistrements dans l'ordre chronologique.
    Dans ce cas, tu ne veux supprimer que les 372 premiers enregistrements, c'est à dire les 372 enregistrements les plus anciens.
    Alors, je trie les enregistrements de manière croissante au niveau du champ NuméroAuto, puis sélectionne les 372 premiers enregistrements et les supprime à la fin!
    Ton code se transforme ainsi:
    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
     
    Sub ProdayQuotidien()
      'on définit la base de données
      Dim db As DAO.Database
      Dim rst_S As DAO.Recordset
     
      Set db = CurrentDb
      Set rst_S = db.OpenRecordset("SELECT TOP 372 * FROM SYSTEME2 ORDER BY SYSTEME2.[Le champ NuméroAuto] ASC;", dbOpenDynaset) 'ASC n'est pas nécessaire. Pour un tri décroissant, DESC
      With rst_S
        'Si l'objet contient au moins un enregistrement
        If .RecordCount<>0 Then
          'placer le curseur au premier enregistrement
          .MoveFirst
          'tant que le curseur ne se trouve pas à la fin du fichier
          Do While Not .EOF
            'Supprime l'enregistrement en cours
            .Delete
            'positionne le curseur au niveau de l'enregistrement suivant
            .MoveNext
            'passe la main au système pour que ce dernier exécute les tâches en attente
            DoEvents
          Loop
        'ferme l'objet recordset ouvert
        .Close
      End With
      'libération des ressources
      Set rst_S = Nothing
      Set db = Nothing
    End Sub
    En version SQL, cela donnerait un truc du genre (avec utilisation d'une sous-requête)
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DELETE *
    FROM [SELECT TOP 372 * FROM SYSTEME2 ORDER BY SYSTEME2.Le champ NuméroAuto ASC;]. AS ssr;
    A toi de choisir!

    @JBO
    Je vois maintenant pourquoi lola a écrit un code à répétition MoveFirst et Delete: je crois que lola pense qu'après avoir exécuté un Delete, l'enregistrement qui est sensé d'être le suivant deviendrait le premier! Ce qui n'est pas juste même si on pense que cela pourrait être logique.

    Bon courage et @+
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici nous avons réuni théorie et pratique: Rien ne fonctionne ... et personne ne sait pourquoi!
    Albert Einstein

  11. #11
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Merci JBO de m'aider.
    Mais ton code ne marche pas, ça me supprime toujours les enregistrements de la fin.
    Je vais voir ce que je peux faire...
    ~ Lola ~

  12. #12
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    @Mahefasoa

    En fait je ne veux pas supprimer les 372 premiers enregistrements, je veux que ma table contienne 372 enregistrements, le mieux serait que quand un enregistrement entre dans la base de données le premier soit supprimé. il faudrait en gros qu'il y ai un glissement de 372 enregistrements avec les plus récents qui resteraient et les plus anciens qui seraient supprimés.

    Set rst_S = db.OpenRecordset("SELECT TOP 372 * FROM SYSTEME2 ORDER BY SYSTEME2.[Le champ NuméroAuto] ASC;", dbOpenDynaset) 'ASC n'est pas nécessaire. Pour un tri décroissant, DESC
    Donc si je veux supprimer les enregistrements en trop je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rst_S = db.OpenRecordset("SELECT TOP (a% - 372 ) * FROM SYSTEME2 ORDER BY SYSTEME2.[Le champ NuméroAuto] ASC;", dbOpenDynaset) 'ASC n'est pas nécessaire. Pour un tri décroissant, DESC
    Avec

    'on compte le nombre total d'enregistrement dans la table
    a% = rst_S.RecordCount
    Sinon pour MoveFirst merci de m'avoir expliquée, maintenant je comprend pourquoi ça ne marchais pas.
    ~ Lola ~

  13. #13
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Merci de nous donner ces importantes précisions:

    (1) quel est le nom du champ NuméroAuto clé primaire de SYSTEME2 ?

    (2) peux-tu garantir que l'ordre de ce champ est correct ?
    C'est-à-dire que les enregistrements avec la plus petite valeur sont ceux à supprimer.

    Citation Envoyé par lola06
    Sinon ma table SYSTEME2 a pour clé primaire un NuméroAuto,

  14. #14
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Voilà ces précisions:

    Le nom du champ est : NuméroAuto

    Les enregistrements à supprimer sont obligatoirement ceux qu'il faut supprimer, car on ne veux garder que les plus récents : donc ceux qui ont un numéro automatique plus grand.
    ~ Lola ~

  15. #15
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Merci pour les précisions.

    Je pense aussi qu'il faut suivre la proposition de Mahefasoa d'utiliser une requête pour supprimer les enregistrements.

    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
    36
    37
    38
    Sub ProdayQuotidien_2()
        Dim a As Integer, d As Integer
        Dim rang As Integer, numAuto As Long
        Dim db As DAO.Database
        Dim rst_S As DAO.Recordset
     
        Set db = CurrentDb
        Set rst_S = db.OpenRecordset("SELECT * FROM SYSTEME2 ORDER BY NuméroAuto")
     
        'dans la table SYSTEME, on compte :
        '  * le nombre total d'enregistrements
        '  * le rang de la dernière ligne à supprimer
        '
        'on enlève au nombre total d'enregistrements la différence pour que ce soit l'équivalent de 4 mois
        'pour les systèmes il faudrait 372 enregistrements pour avoir 4 mois
        'on enlève 1 pour l'enregistrement test et 1 encore pour avoir bien 372 enregistrements
        rst_S.MoveLast
        a = rst_S.RecordCount
        rang = (a - 372 - 1 - 1)
     
        If rang < 0 Then
            'rien à supprimer
        Else
            rst_S.MoveFirst
     
            ' on se place sur le dernier enregistrement à supprimer
            ' et on récupère la valeur du champ NuméroAuto
            rst_S.Move rang
            numAuto = rst_S!NuméroAuto
     
            rst_S.Close
     
            ' on exécute une requête de suppression des enregistrements "cibles"
            db.Execute "DELETE * FROM SYSTEME2 WHERE NuméroAuto<=" & numAuto
        End If
     
        Set rst_S = Nothing
    End Sub

  16. #16
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Merci beaucoup ca marche....

    Maintenant je n'ai plus qu'à finir bien mon code et tout marchera...

    Merci en tout cas d'avoir passé du temps à m'aider et à m'expliquer...

    ~ Lola ~
    ~ Lola ~

  17. #17
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Quel interet d'utiliser un recordset pour faire une suppression ?

  18. #18
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,
    Citation Envoyé par Tofalu
    Quel interet d'utiliser un recordset pour faire une suppression ?
    Le Pb de lola06 était de ne conserver dans une table que les 372 derniers enregistrements, reconnaissables à la valeur contenue dans leur champ NuméroAuto.

    Sa première approche était basée sur un recordset:
    * compter le nombre total d'enregistrements
    * puis supprimer l'excédent, de manière à ne conserver que les 372 enregistrements les plus récents.

    Le résultat obtenu n'était pas bon.

    Dans un deuxième temps, la question est devenu:
    >> pour quelles valeurs de NuméroAuto faut-il supprimer les enregistrements ?

    Et là, on a utilisé une requête pour la suppression.

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

Discussions similaires

  1. [XL-2007] VBA fonction Recherche V qui renvoie à plusieurs cellules
    Par Rirette21 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/06/2015, 09h14
  2. Script instr qui me renvoi n'importe quoi !
    Par spiker15 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/01/2013, 17h50
  3. [Toutes versions] fonction VBA qui renvoie le premier nombre d'une chaîne texte
    Par Benoit Schwob dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/03/2012, 12h24
  4. [XL-2000] Fonction VBA qui renvoie le caractère ascii d'un nombre
    Par franky7 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 04/09/2011, 08h31
  5. Réponses: 2
    Dernier message: 04/11/2006, 18h30

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