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 :

DAO-Déplacement entre enregistrements


Sujet :

Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 74
    Points : 33
    Points
    33
    Par défaut DAO-Déplacement entre enregistrements
    Bonjour,

    J'ai créé un état avec lequel je veux afficher l'historique de carrière et l'ancienneté pour les 3 critères suivants : Corps, Grade, Echelon pour chaque personne.

    Rmq : Cet Etat a pour source de données une requête dynamique trié par ordre décroissant rqtDynamique
    Dont voici une image
    Nom : MonEtatHistorique.JPG
Affichages : 77
Taille : 46,9 Ko

    Dans le rectangle Ancienneté j'appelle la fonction ObtenirValeur dont le code est ci-dessous.
    Le résultat est complétement erroné, le résultat attendu devrait être :
    Corps : 16 ans 0 mois 3j
    Grade : 12 ans 6 mois 3j
    Echelon : 0 an 11 mois 29j

    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
    39
    40
    41
    42
    43
     
    Function ObtenirValeur(ByVal ValeurEntree As String)
    Dim strValeurRetour As String
    Dim strValeurSuivante As String
    Dim Rst As DAO.Recordset
    Dim Db As DAO.Database
    Dim Sql As String
     
        strValeurRetour = ""
     
        'Instancie la base de données
        Set Db = CurrentDb
        'Ouvre curseur retournant le résultat de la requête: rqtDynamique
        Set Rst = Db.OpenRecordset("rqtDynamique")
     
        With Rst
     
          If Not .EOF Then
            ' Recherche comparative paramètre ValeurEntree avec les valeurs suivantes du même champ
            Do While Not .EOF
     
            ' Récupérer la valeur courante des champs ChampRetour et ChampCritere
              strValeurRetour = .Fields("ChampRetour")
              strValeurSuivante = .Fields("ChampCritere")
              ' Si cette valeur courante est différente de la suivante alors
              ' revenir à la valeur précédente et récupérer la valeur de retour
              If strValeurSuivante <> ValeurGradeEntree Then
                .MovePrevious
                strValeurRetour = .Fields("ChampRetour")
                ' Quitter la boucle DO
                 Exit Do
              End If
              .MoveNext
            Loop
          End If
        End With
        'Libération des objets
        Rst.Close
        Db.Close
        Set Rst = Nothing
        Set Db = Nothing
        AnciennetéGrade = strValeurRetour
    End Function
    J'espère être clair dans mes explications, sinon n'hésitez pas à me poser des questions.
    J'espère que vous pourrez m'aider.
    Merci

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 74
    Points : 33
    Points
    33
    Par défaut
    Complément d'information :


    1)Pour le champ Echelon : tout va bien.

    2)Pour le champ Corps :
    La fonction ObtenirValeur est compilée normalement, mais le résultat est faux.

    3)Pour le champ Grade :
    Le fonction n'est pas compilé, j'ai un message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Erreur d'exécution '3021'
    Aucun enregistrement en cours
    Lorsque je clique sur Débogage, VBE surligne cette ligne de code en jaune
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strAncGrade = .Fields("AnneeCorps")

  3. #3
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set Rst = Db.OpenRecordset("rqtDynamique")
    
    rst.MoveFirst
        
    With Rst

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 74
    Points : 33
    Points
    33
    Par défaut
    Bonjour Kikof,


    J'ai ajouté ta ligne de code mais je ne constate aucun changement.

  5. #5
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Que vaut valeurGradeEntrée ??
    Il n'est pas déclaré ?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 74
    Points : 33
    Points
    33
    Par défaut
    Lors du débogage, je constate que les 2 variables ci-dessous récupèrent les valeurs du dernier enregistrement au lieu du premier enregistrement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    Set Rst = Db.OpenRecordset("rqtDynamique")
    rst.MoveFirst
     
    With Rst
    ....
    Do While Not .EOF
    strValeurRetour = .Fields("ChampRetour")
    strValeurSuivante = .Fields("ChampCritere")
    ....

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 74
    Points : 33
    Points
    33
    Par défaut
    A oui, pardon

    c'est une erreur de ma part ce n'est pas valeurGradeEntrée mais plutôt
    ValeurEntree c'est la valeur argument de la fonction et elle vaut selon les champs critères :
    pour le champ Corps c'est "IGE"
    pour le champ Grade c'est "IGE 1C"

    Rmq : je pars toujours de la première ligne pour la comparaison, logique puisque c'est un tri décroissant.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 74
    Points : 33
    Points
    33
    Par défaut
    Kikof,


    Voici un résultat de mon Etat, je n'ai rajouté que la ligne de code que tu m'as proposée.

    Nom : MonEtatHistorique2.JPG
Affichages : 88
Taille : 56,4 Ko

    Constat : le cadre Ancienneté affiche des résultats corrects uniquement pour le premier employé ID_Employé=1
    Mais les suivants çà ne fonctionne pas.

    As-tu une piste à me conseiller?
    Merci.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 74
    Points : 33
    Points
    33
    Par défaut
    SVP

    Je m'adresse aux experts en programmation VBA, je n'arrive pas à résoudre mon pb, donnez moi une piste....

    Merci merci

  10. #10
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    J'ai un peu réfléchi à ton pb

    Vois si tu peux mettre sur l'évènement au formatage au niveau du regroupement sur la personne (vu ton état tu dois avoir fait ça...)

    par contre il faut que tu vérifies que rst correspond aux données pour la personne à chaque fois. (si besoin recrée à chaque fois la requete)

    j'espère avoir été clair...

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 74
    Points : 33
    Points
    33
    Par défaut
    Effectivement, dans mon Etat, j'ai fait un groupement par personne sur le champ ID_Employé avec un tri croissant.
    Mon Etat ne fait que restituer les données contenues dans ma requête dynamique, ie tous les employés.

    Par contre je ne vois vraiment pas comment mettre en oeuvre tes instructions suivantes.
    par contre il faut que tu vérifies que rst correspond aux données pour la personne à chaque fois. (si besoin recrée à chaque fois la requete)

  12. #12
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Sur formatage :

    Tu crées une requête pour avoir l'historique des grades et tout et tout de la personne
    Ensuite tu reprends ta fonction mais avec la requête créé pas celle dont tu te sers actuellement.

    Ca va donner ça approximativement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Private Sub EntêteGroupe0_Format(Cancel As Integer, FormatCount As Integer)
     
    Dim SQL as String
    Dim rst As DAO.Recordset
    SQL = "SELECT tes_champs FROM Ta_Table WHERE N°Personne = " & Me.N°Personne
     
    Set rst = CurrentDb.Openrecordset(SQL) 'tu peux y mettre directement ta chaine SQL si tu veux
     
    ' et tu reprends ton code existant
     
    End Sub
    Si je me trompe pas, ça devrait le faire... si ça le fait pas.. ben ...

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 74
    Points : 33
    Points
    33
    Par défaut
    Voici le résultat de ma requête dynamique qui est utilisé comme source de données de mon Etat (voir image un peu plus haut).

    Nom : MaRequêteDynamique.JPG
Affichages : 80
Taille : 53,5 Ko

    Si vous avez une solution je suis preneur.

  14. #14
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    ben avec cette requête il faut rajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE ID_Employé = Me.ID_Employé

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 74
    Points : 33
    Points
    33
    Par défaut
    En fait il y a eu une mauvaise compréhension de ma part

    Vois si tu peux mettre sur l'évènement au formatage au niveau du regroupement sur la personne (vu ton état tu dois avoir fait ça...)
    Je n'ai pas programmé de code dans l'événement au formatage au niveau regroupement sur la personne.
    J'ai simplement utiliser l'icone Trier et Grouper dans la barre Créer un état.
    C'est pour çà que j'ai obtenu l'affichage de mon Etat comme indiqué.

    J'ai tout de même essayer cette fois dans l'événement au formatage au niveau de regroupement sur la personne avec ce morceau de code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Private Sub EntêteGroupe0_Format(Cancel As Integer, FormatCount As Integer)
     
    Dim SQL As String
    Dim rst As DAO.Recordset
    SQL = "SELECT * FROM MaRequeteDynamique WHERE ID_Employé = " & Me.ID_Employé
     
    Set rst = CurrentDb.OpenRecordset(SQL)
     
    End Sub
    Mais rien n'a changé...

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 74
    Points : 33
    Points
    33
    Par défaut
    Bonjour aux membres de la planète Accessienne,

    Je récapitule les données concernant mon sujet:

    1) J'ai un formulaire dans lequel figurent :
    --1 champ de saisie Date qui est utilisé comme paramètre dans ma requête modèle.
    --1 bouton qui effectue deux actions sur l'évément OnClic.
    La première consiste à créer une requête dynamique (servant de source de données de mon état) à partir de ma requête modèle.
    La second consiste à ouvrir mon etat, qui m'affiche l'historique et l'anciennetépour chaque employé( voir +haut l'image).

    2) Mon etat
    --Source de données : ma requête dynamique
    --J'insère 2 zones de texte dans lesquels j'appelle une fonction qui me retourne respectivement l'ancienneté pour le corps, le grade.
    --pour un affichage par employé, j'ai simplement utiliser l'icône Trier et Grouper dans la barre Créer un état.
    --J'ai ajouté un code (utilisant ma requête Dynamique pour filtrer par employé) dans l'événement au formatage au niveau regroupement sur l'employé (code voir +haut).

    3) Ma fonction retournant l'ancienneté (voir code +haut),
    -- utilise ma requête dynamique comme Recordset.

    Voilà avec tout çà je ne comprends pas pourquoi, mon etat affiche correctement les annciennetés pour le premier employé et pour les autres des erreurs.

    Si les experts d'Access pouvaient m'aider à analyser mon soucis, je leur suis très reconnaissant.

Discussions similaires

  1. [AC-2007] Déplacement entre enregistrements : PAGEUP / PAGEDOWN
    Par junty dans le forum IHM
    Réponses: 2
    Dernier message: 27/12/2011, 14h26
  2. [AC-2003] evenement sur déplacement entre enregistrements
    Par pauls30 dans le forum IHM
    Réponses: 1
    Dernier message: 10/05/2011, 14h34
  3. Pb de déplacement entre enregistrements
    Par Orion34080 dans le forum VBA Access
    Réponses: 2
    Dernier message: 12/04/2011, 09h04
  4. Déplacement entre enregistrement
    Par seb92400 dans le forum Access
    Réponses: 6
    Dernier message: 18/01/2007, 10h47
  5. déplacement entre enregistrement
    Par xycoco dans le forum Access
    Réponses: 4
    Dernier message: 25/10/2004, 19h29

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