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

Access Discussion :

Access : Modifier une table via VB


Sujet :

Access

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 61
    Points : 26
    Points
    26
    Par défaut Access : Modifier une table via VB
    Bonjour à tous,

    Je post ici car je rencontre un problème que je n'arrive pas à résoudre (hé oui comme tous ceux qui postent ici me direz-vous ^^).

    Tout d'abord, une petite précision, je suis débutant en ACCESS, donc peut être vais je raconter des choses pas tout à fait justes.

    J'aimerai en fait savoir si c'est possible de balayer une table ACCESS via VB, par le moyen de boucles ou autres, afin de pouvoir modifier des données dedans.

    J'ai de disponible une table, avec beaucoup de valeurs égales à 0. J'aimerais remplacer tous les 0 par un champ blanc.

    Pour moi, il faudrait mettre la table dans un tableau à 2 dimensions et le balayer et remplacer toutes les valeurs à 0 par un blanc. Seulement je n'y arrive pas et cela fait un jour que je suis dessus

    J'utilise un RecordSet pour cela, même si je ne suis pas très sur qu'il faut l'utiliser de cette façon.

    Voici 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
    Dim Contenu As Variant
    Dim l As Integer, c As Integer
     
    'Mise en mémoire du tableau correspondant à la table
         DoCmd.OpenTable "nomTable", acViewNormal, acEdit
         Set enr = CurrentDb.OpenRecordset("nomTable")
         Contenu(l, c) = enr.GetRows(40)
     
    'Balayage de la table, modification de données
         For l = 0 To 31
                For c = 0 To 39
                      If Contenu(l, c) = 0 Then
                      Set Contenu(l, c) = Null
                      End If
                Next c
         Next l

    Voilà, donc avec ce code, la modification n'a pas lieu. Cependant quand je fais un Msgbox Contenu(x, y) avec x y numéro de ligne et de colonne, la valeur de la table apparait bien. J'en déduis que je peux donc me balader dans la table de cette façon.

    Je suis un peu perdu sans doute comme vous le voyez bien et je requiers votre aide dans ce domaine qui est nouveau pour moi ^^

    Merci par avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Tu ne modifie pas ta table, tu modifie des données dans un tableau que tu as rempli avec GetRows.

    Va jeter un coup d'oeil sur l'excellent tuto sur DAO du site.

    Et interresse toi aux méthodes du recordset Edit et Update

    Starec

  3. #3
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Bonjour et bienvenue.

    Pour les recordsets, il y a un tuto magnifique :
    http://warin.developpez.com/access/dao/

    Mais si c'est juste pour mettre à jour un champ, une requête mise à jour suffit et sera plus performant.
    Cf la FAQ :
    http://access.developpez.com/faq/?page=SQL#qryActions

    quand on débute on ne sait pas où chercher mais il y a tout ce qu'il faut dans les tutos/faq/sources

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 61
    Points : 26
    Points
    26
    Par défaut
    Ok, merci de ta réponse rapide, je file sur ce tuto.

    Je tiens au courant.

    Edit Arkham : Merci à toi aussi pour la rapidité ^^

    En fait je dois modifier tous les champs de la table contenant 0, c'est pour ça que j'essaye de passer par RecordSet (tuto que je suis en train de lire). Pour une seule colonne, j'avais fait une requête UPDATE, seulement la requête UPDATE ne peut pas s'appliquer pour toute la table, juste sur une colonne (sauf erreur de ma part, ce qui est possible). Ou du moins je ne l'ai pas réussi.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 61
    Points : 26
    Points
    26
    Par défaut
    Je viens donc de totalement changer mon code. Voici le nouveau :

    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
    'Ouverture de la table nomTable
    DoCmd.OpenTable "nomTable", acViewNormal, acEdit
     
    'Création d'un recordset, de type dbOpenTable : Modification en direct
    Set modif = CurrentDb.OpenRecordset("SELECT * FROM nomTable", [dbOpenTable])
     
    'On se place sur le premier enregistrement
    modif.MoveFirst
     
    'Tant que l'on atteint pas la fin du recordset
    While Not modif.EOF
     
    'Mode édition
    modif.Edit
     
    'Condition de changement de donnée
    If modif.Fields = 0 Then modif.Fields = Null
    End If
     
    'Mise à jour de la table
    modif.Update
     
    'Passage au champ suivant
    modif.MoveNext
    Wend
     
    'Fermeture du recordset        
    modif.Close
    Set modif = Nothing
    DoCmd.RunCommand acCmdClose
    Ce code n'est pas fonctionnel car Fields est mal utilisé (je suis d'accord, étant donné que dans l'exemple, il y a un nom de colonne). Cependant, se mettre au premier enregistrement veut bien dire que l'on se met sur la première ligne de la table ??? ou bien est il possible de passer sur chaque champ de chaque ligne ??

    Un grand bravo au tuto en tout cas. J'ai passé tout l'après midi d'hier à en chercher un bon sur les RecordSet et là tout semble clair (même le Fields même si j'ai peur qu'il ne s'adapte pas à ce que je veux faire )

  6. #6
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Effectivement fields ne permet pas de traiter tous les champs en une fois.

    Soit tu multiplies la ligne autant de fois qu'il y a de champs, soit tu fais une boucle :

    Code à peu près, pas testé : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    dim lField as DAO.Field
    for each lField in modif.fields
      If lfield.value = 0 Then lfield.value = Null
    next

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 61
    Points : 26
    Points
    26
    Par défaut
    Cette fois, il n'y a plus d'erreur de compilation ni rien, par contre l'exécution plante sur la première ligne (je vois la table s'ouvrir avec le 1er enregistrement surligné, puis ça ne répond plus).

    J'ai inclus ton code de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    'Tant que l'on atteint pas la fin du recordset
        While Not modif.EOF
            'Mode édition
            modif.Edit
            'Condition de changement de donnée
            For Each lField In modif.Fields
                If lField.Value = 0 Then lField.Value = Null
            Next
            'Mise à jour de la table
            modif.Update
            'Passage au champ suivant
            modif.MoveNext
        Wend
    lField étant bien déclaré comme DAO.Fields et modif comme DAO.RecordSet

  8. #8
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Citation Envoyé par Tsuna78
    lField étant bien déclaré comme DAO.Fields
    c'est DAO.Field sans le "s"
    Fields est une collection de champ
    Field est un champ

    sinon si ça ne marche toujours pas, quel est le message d'erreur?

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 61
    Points : 26
    Points
    26
    Par défaut
    Exact, excuse moi, je l'avais bien déclaré en DAO.Field, j'ai tapé un peu vite ma réponse.

    J'ai résolu le problème de plantage : En fait, j'avais déclaré le RecordSet comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set modif = CurrentDb.OpenRecordset("SELECT * FROM nomTable", [dbOpenTable])
    J'ai changé le dbOpenTable en dbOpenDynaset et ça ne plante plus. Par contre, aucun changement n'est effectué dans la table. Apparemment il ouvre bien la table, se positionne sur la première ligne, puis il referme la table (je suppose vu l'exécution qui est à l'écran)

    EDIT : Erreur résolue à nouveau : Je m'étais trompé ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            For Each lField In modif.Fields
                If lField.Value = 0 Then lField.Value = ""
            Next
    J'avais mis "" à la place de Null en testant voir si c'était cela qui faisait planter l'exécution tout à l'heure. Je viens de remettre Null et tout s'exécute parfaitement

  10. #10
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 61
    Points : 26
    Points
    26
    Par défaut
    Je me permets de faire un doublon pour te remercier Arkham d'avoir pris le temps de m'aider pour mon problème, et avec une grande rapidité ^^. Je ne pensais pas avoir des réponses aussi rapidement, et j'aurai été loin de comprendre aussi vite sans ton aide.

    Un grand merci donc et sans doute à une prochaine fois, mes difficultés ne font que commencer je crois ^^

  11. #11
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    ok c'est cool

    par contre l'ouverture/fermeture de la table n'est pas nécessaire

    DAO agit directement sur la table sans avoir besoin de l'ouvrir

  12. #12
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 61
    Points : 26
    Points
    26
    Par défaut
    C'est noté je viens de tester, ça fonctionne bien, ça me permet de simplifier un peu le code =)

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

Discussions similaires

  1. Modifier un champs d'une table via formulaire
    Par Arkalus dans le forum VBA Access
    Réponses: 5
    Dernier message: 08/05/2013, 18h36
  2. Modifier lignes d'une table via un formulaire
    Par Hombe dans le forum IHM
    Réponses: 2
    Dernier message: 11/03/2009, 19h23
  3. Réponses: 5
    Dernier message: 12/09/2008, 19h53
  4. Réponses: 1
    Dernier message: 18/07/2007, 00h02
  5. Modifier une table MySQL via un lien
    Par Hayabusa dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 08/02/2006, 22h51

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