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 :

Automatisation mise à jour formulaire avec recordset [AC-2003]


Sujet :

VBA Access

  1. #1
    Membre habitué Avatar de cluster26
    Profil pro
    Inscrit en
    Février 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 266
    Points : 182
    Points
    182
    Par défaut Automatisation mise à jour formulaire avec recordset
    Bonjour,

    Je travaille avec un formulaire indépendant dont j'alimente automatiquement les zones à l'aide d'un recordset de ce type :

    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
     Set rs = CurrentDb.OpenRecordset("select * from achats where num_fourn = " & Me![ctr1])
        If Not rs.EOF Then rs.MoveLast: rs.MoveFirst
    'test l'existence de l'enregistrement
        If rs.RecordCount = 0 Then
    '......
    '....
    'fin du test
     
    'Ensuite je mets à jour les zones concernées
    Me![champ1] = rs![adresse_fourn]
    Me![champ2] = rs![code_fourn]
    Me![champ3] = rs![rib_fourn] 
    '.... et ainsi de suite...
     
    close.rs
    set rs=nothing
    Pour éviter d'avoir une liste assez longue lors de la mise à jour (j'ai une quinzaine de zones de texte), j'avais imaginé donner aux zones du formulaires le même nom que les champs de la table.

    Cela pourrait m'éviter de saisir la "litanie" des champs du formulaire.

    Toutefois, je ne trouve pas la méthode pour créer un code qui ne "coince pas".

    Je voudrais, si c'est possible, adapter le code pour la procédure update et insert.

    Merci à l'avance pour vos conseils.

  2. #2
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    529
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 529
    Points : 464
    Points
    464
    Par défaut
    salut,
    où sa coince.
    MERCI

  3. #3
    Membre habitué Avatar de cluster26
    Profil pro
    Inscrit en
    Février 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 266
    Points : 182
    Points
    182
    Par défaut
    Bonjour,

    Ca coince sur le fait que je n'arrive pas à me fixer sur méthode pour "capter" les variables, soit la boucle à réaliser qui me permettraient d'automatiser l'affection à l'ensemble des contrôle indépendants du formulaire.

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 716
    Points : 57 357
    Points
    57 357
    Billets dans le blog
    42
    Par défaut
    Bonjour,

    tu peux utiliser une convention de nommage sur tes contrôles pour les parcourir dans une boucle, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ...
    Set rs = CurrentDb.OpenRecordset("select adresse_fourn, code_fourn, rib_fourn from achats where num_fourn = " & Me![ctr1])
     
    …
     
    dim Ctl as control
    For i = 1 To 3
    set Ctl=Me.controls("champ" & i)
    ctl.value = rs.fields(i-1)  ' la 1ère colonne du SELECT commence à 0
    Next i
     
    …
    Voir dans la FAQ >Formulaires> Contrôles:
    Comment énumérer les contrôles d'un formulaire dans une boucle ?
    Comment changer la valeur de plusieurs contrôles en même temps ?
    Comment atteindre un contrôle dont le nom est dans une variable

  5. #5
    Membre habitué Avatar de cluster26
    Profil pro
    Inscrit en
    Février 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 266
    Points : 182
    Points
    182
    Par défaut
    Bonsoir,

    Merci pour la réponse.

    Effectivement, ce code permet aux données du recordset de se recopier dans les champs du formulaire.

    Toutefois, j'ai mal rédigé mon exemple !..

    En effet, quand je déclare :

    Citation Envoyé par cluster26 Voir le message
    Pour éviter d'avoir une liste assez longue lors de la mise à jour (j'ai une quinzaine de zones de texte), j'avais imaginé donner aux zones du formulaires le même nom que les champs de la table.
    mon code n'est pas adapté à cette phrase. En effet, pour me repérer, je préfère utiliser les mêmes noms d'identification.

    Je rebâtis donc mon code en fonction de ce que j'attends :

    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
     Set rs = CurrentDb.OpenRecordset("select * from achats where num_fourn = " & Me![ctr1])
        If Not rs.EOF Then rs.MoveLast: rs.MoveFirst
    'test l'existence de l'enregistrement
        If rs.RecordCount = 0 Then
    '......
    '....
    'fin du test
     
    'Ensuite je mets à jour les zones concernées
    Me![adresse_fourn] = rs![adresse_fourn]
    Me![code_fourn] = rs![code_fourn]
    Me![rib_fourn] = rs![rib_fourn] 
    '.... et ainsi de suite...
     
    close.rs
    set rs=nothing
    Avez-vous une solution pour ce cas d'espèce. SVP

    Merci

    Avec mes excuses !

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 716
    Points : 57 357
    Points
    57 357
    Billets dans le blog
    42
    Par défaut
    bonsoir,

    Citation Envoyé par cluster26 Voir le message
    j'avais imaginé donner aux zones du formulaires le même nom que les champs de la table.
    Ahhhh ok ok compris !!

    Essayons avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim f As Object
     
    For Each f In rs.Fields
      Me.Controls(f.Name) = f.Value
    Next

  7. #7
    Membre habitué Avatar de cluster26
    Profil pro
    Inscrit en
    Février 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 266
    Points : 182
    Points
    182
    Par défaut
    Merci f-leb.

    Le code fonctionne parfaitement !..

    J'essaye d'appliquer une variante à ce code qui permettrait de sélectionner les zones à remplir !

    Je m'explique !... Dans cette table j'ai une quinzaine de champs !..

    Dans le (ou les formulaires), je ne positionne pas systématiquement l'ensemble de ces 15 zones. En effet, pour un formulaire j'ai besoin entre autre de l'adresse du fournisseur et pas obligatoirement son RIB.

    Toujours à partir du code que je t'avais rectifié serait-il possible en partant de la récupération des champs de la table, affecter certains champs du formulaire ?

    Il suffirait dans le code d'appliquer la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rs = CurrentDb.OpenRecordset("select * from achats where num_fourn = " & Me![ctr1])
    au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rs = CurrentDb.OpenRecordset("select adresse_fourn, code_fourn, rib_fourn from achats where num_fourn = " & Me![ctr1])
    et à partir de là, impacter les zones du formulaires concerné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Me![adresse_fourn] = rs![adresse_fourn]
    Me![code_fourn] = rs![code_fourn]
    Me![rib_fourn] = rs![rib_fourn]
    En automatisant au maximum bien sûr.

    Dans l'attente de ta réponse.

    Merci

  8. #8
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 716
    Points : 57 357
    Points
    57 357
    Billets dans le blog
    42
    Par défaut
    Bonjour,

    je pense qu’on peut faire ça en programmant une gestion d’erreur.

    Si un contrôle dont le nom correspondant à une colonne du SELECT n’existe pas dans le formulaire, une erreur n°xxxx est levée à la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Controls(f.Name) = f.Value.
    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
     
    ' ...
    On error goto ErrorHandler
    Dim f As Object
     
    For Each f In rs.Fields
      Me.Controls(f.Name) = f.Value
    Next
     
    ' …
     
    ErrorHandler:    ' Routine de gestion d'erreur.
        ' Évalue le numéro d'erreur.
        Select Case Err.Number
            Case xxxx    ' à la place de xxxx, mettre le numéro de l’erreur levée (2465 d’après mes test, mais à vérifier)
                Resume Next    ' reprend à partir de l'instruction qui suit immédiatement celle qui a provoqué l'erreur
            Case Else
                ' Traite les autres situations ici....
        End Select
        Resume    ' Reprend l'exécution au niveau de la ligne à l'origine de l'erreur.

  9. #9
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 716
    Points : 57 357
    Points
    57 357
    Billets dans le blog
    42
    Par défaut
    Ou alors, et c’est sans doute plus propre, on exploite une fonction de la FAQ:

    Comment savoir si un contrôle existe dans un formulaire ?

  10. #10
    Membre habitué Avatar de cluster26
    Profil pro
    Inscrit en
    Février 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 266
    Points : 182
    Points
    182
    Par défaut
    Bonjour,

    Merci pour la réponse.

    Je vais tester cela dans la journée.

  11. #11
    Membre habitué Avatar de cluster26
    Profil pro
    Inscrit en
    Février 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 266
    Points : 182
    Points
    182
    Par défaut
    Merci f-leb pour la solution.

    J'ai adapté le code de cette façon et cela fonctionne

    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
     
    Private Sub b1_Click()
        On Error Resume Next
       Set rs = CurrentDb.OpenRecordset("select * from achats where num_fourn = " & Me![ctr1])
     
        Dim f As Object
        For Each f In rs.Fields
            If IsError(Me.Form.Controls(f.Name).Tag) Then
            Else
                Me.Controls(f.Name) = f.Value
            End If
        Next
     
        rs.Close
        Set rs = Nothing
     
    End Sub

    Encore merci !...

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

Discussions similaires

  1. Afficher la mise à jour d'un recordset
    Par Daniel MOREAU dans le forum Access
    Réponses: 3
    Dernier message: 28/03/2006, 13h47
  2. Proplème de mise à jour d'un recordset par ADO
    Par maniani dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 23/01/2006, 19h14
  3. Mise à jour formulaire !
    Par scorpion1611 dans le forum Access
    Réponses: 7
    Dernier message: 13/01/2006, 09h40
  4. pb de mise à jour différée avec ACCESS, ADO et DELPHI 7
    Par QAYS dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/01/2006, 08h15
  5. [vb][ado][mysql] mise à jour d'un recordset
    Par hi_vivie dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 14/12/2005, 16h34

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