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 :

Définir valeur selon celles des enregistrements Suivant et Précédent [AC-2010]


Sujet :

VBA Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 123
    Points : 67
    Points
    67
    Par défaut Définir valeur selon celles des enregistrements Suivant et Précédent
    Bonjour

    Il y a quelques mois je suis venu sur le forum pour poser cette question:

    Dans ma table je souhaite renseigner le champ "resultat" en fonction de la valeur d'un autre mais est situé dans l'enregistrement précédent.
    dans l'exemple ci-desous voici ma condition.

    si Niveau (ligne précédente)<> Niveau (ligne active) alors Resultat = "OK"

    Niveau Resultat
    1 ----->
    1 ----->
    2 -----> OK
    2 ----->
    1 -----> OK
    1 ----->
    3 -----> OK
    3 ----->
    2 -----> OK
    3 -----> OK

    et Vodiem m'avait proposé un code qui fonctionne très bien.

    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
    Function Table1()
    Set rst = CurrentDb.OpenRecordset("Table1")
    rst.MoveFirst
    If rst.RecordCount > 1 Then
      niveauPrec = rst![niveau]
     
      rst.MoveNext
    End If
     
    While Not rst.EOF
    If (rst![niveau] <> niveauPrec) ) Then
      rst.Edit
      rst.Fields("Resultat").value = "ok"
      rst.Update
    End If
     
    niveauPrec = rst![niveau]
     
     
    rst.MoveNext
    Wend
    Set rst = Nothing
    End Function
    Aujourd'hui je souhaite ajouter une condition en fonction de l'enregistrement "Suivant".

    si Niveau (ligne suivante) > Niveau (ligne active) alors Resultat = "OK"


    J'ai essayé d'adapter le code avec des
    "If rst.RecordCount < 1 "
    "MovePrevious"
    mais sans résultat

    D'avance merci pour votre aide.
    StSym

  2. #2
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 127
    Points : 105
    Points
    105
    Par défaut
    Bonjour,

    Je ferais plutot ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    If rst.RecordCount < 1 
    rst.MoveNext
    niveauSup = rst![niveau]
    rst.MovePrevious
    niveauActive = rst![niveau]
     
    If (niveauSup <> niveauActive) ) Then
      rst.Edit
      rst.Fields("Resultat").value = "ok"
      rst.Update
    End If

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 123
    Points : 67
    Points
    67
    Par défaut
    Bonjour Ninouchfis
    tout d'abord je te remercie pour ta réponse.

    J'ai testé ton code mais je n'ai pas réussi à obtenir le résultat souhaité;

    Pour simplifier , j'a essayé d'adapter le code pour avoir le champ
    "resultat" renseigné que si le niveau actif est inférieur au niveau "Suivant".

    Mais je n'arrive pas à analyser la valeur du niveau suivant.

    Niveau Resultat
    1 ----->
    1 -----> OK
    2 -----> OK
    3 ----->
    1 ----->
    1 -----> OK
    3 ----->
    3 ----->
    2 -----> OK
    3 ----->

    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
    Function Test()
     
    Set rst = CurrentDb.OpenRecordset("Table1")
    rst.MoveFirst
     
    If rst.RecordCount < 1 Then
    rst.MovePrevious
    NiveauSuivant = rst![niveau]
    End If
     
    While Not rst.EOF
    If (rst![niveau] < NiveauSuivant) Then
      rst.Edit
      rst.Fields("Resultat").Value = "ok"
      rst.Update
    End If
     
    NiveauSuivant = rst![niveau]
     
    rst.MoveNext
     
    Wend
    Set rst = Nothing
    End Function


    Merci pour une éventuelle solution

    StSym

  4. #4
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 127
    Points : 105
    Points
    105
    Par défaut
    Premièrement tu ne peux pas lui demander d'aller à l'enregistrement précédent si tu te trouves au premier enregistrement.

    Essaye ce 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Function Test()
    Dim NiveauSuivant as single
    Dim NiveauActif as single
     
    On error Resume next
     
    Set rst = CurrentDb.OpenRecordset("Table1")
    rst.MoveFirst
     
    While Not rst.EOF
     
    rst.MoveNext 'On va se placer sur l'enregistrement suivant
    NiveauSuivant = rst![niveau] 'On récupère sa valeur
    rst.MovePrevious 'On se replace sur l'enregistrement précédent
    NiveauActif = rst![niveau] 'On récupère sa valeur
     
    If (NiveauActif < NiveauSuivant) Then
      rst.Edit
      rst![Resultat] = "ok"
      rst.Update
    End If
     
    rst.MoveNext
     
    Wend
     
    Set rst = Nothing
     
    End Function

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 123
    Points : 67
    Points
    67
    Par défaut
    re Bonjour Ninouchfis

    Merci pour ton code que j'ai testé code et qui fonctionne très bien.

    Une fois de plus j'ai essayé de l'adapter à mon besoin qui un peu plus complexe mais sans succès.

    Le voici:

    Ma table comporte en plus des champs "Niveau " et "résultat" un champ "Type".

    Ce que je souhaite:

    A l'identification de la valeur "A" dans le champ "Type",
    coller la valeur de son niveau dans le champ "Resultat" des enregistrements suivants
    tant que leur niveau n'est pas inférieur ou égal.


    Espérant avoir été clair.
    Merci encore pour ton aide.

    StSym
    Images attachées Images attachées  

  6. #6
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 127
    Points : 105
    Points
    105
    Par défaut
    J'espère avoir bien compris
    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
    Function Test()
    Dim NiveauSuivant as single
    Dim NiveauActif as single
    Dim TypeActif as string
     
    On error Resume next
     
    Set rst = CurrentDb.OpenRecordset("Table1")
    rst.MoveFirst
     
    While Not rst.EOF
    TypeActif = rst![Type] 'On récupère sa valeur
    NiveauActif = rst![niveau] 'On récupère sa valeur 
    rst.MoveNext 'On va se placer sur l'enregistrement suivant
    NiveauSuivant = rst![niveau] 'On récupère sa valeur
     
    If NiveauActif < NiveauSuivant And TypeActif = "A" Then
      rst.Edit
      rst![Resultat] = NiveauActif
      rst.Update
    End If
     
    Wend
     
    Set rst = Nothing
     
    End Function

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 123
    Points : 67
    Points
    67
    Par défaut
    Merci pour ta réponse rapide.

    La solution est proche!

    Il faut juste recopier le Niveau ( 3 dans l'exemple )
    tant que le niveaux suivants ne sont pas < ou = à 3

    Merci pour ton aide

    StSym
    Images attachées Images attachées  

  8. #8
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 127
    Points : 105
    Points
    105
    Par défaut
    Ok, voila le code rectifié:

    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
    Function Test()
    Dim NiveauSuivant as single
    Dim NiveauActif as single
     
    On error Resume next
     
    Set rst = CurrentDb.OpenRecordset("Table1")
    rst.MoveFirst
     
    While Not rst.EOF
    if rst![Type] = "A" then
      NiveauActif = rst![niveau] 'On récupère sa valeur 
    end if
    rst.MoveNext 'On va se placer sur l'enregistrement suivant
    NiveauSuivant = rst![niveau] 'On récupère sa valeur
     
    If NiveauActif < NiveauSuivant Then
      rst.Edit
      rst![Resultat] = NiveauActif
      rst.Update
    End If
     
    Wend
     
    Set rst = Nothing
     
    End Function

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 123
    Points : 67
    Points
    67
    Par défaut
    On s'approche, on s'approche, grâce à tes codes mais ce n'est pas encore le résultat souhaité.

    En effet:
    1 > si l'on rencontre un "Type" avec la valeur <> "A" il ne faut pas copier dans l'enregistrement actif le niveau de l'enregistrement Précédent.
    2 > il faut copier le niveau précedent, tant que celui de l'enregistrement actif n'est pas = ou < quelque soit la valeur du champ "Type"

    Je vais essayer de mon côté mais te remercie par avance si tu as une solution.
    J'avoue ne pas savoir si j'ai été assez explicite dans ma demande.

    Merci encore
    StSym

  10. #10
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 127
    Points : 105
    Points
    105
    Par défaut
    J avoue que je suis un peu perdu.
    Si je comprend bien, dans ta table tu veux copier (uniquement pour les types "A") le niveau precedent dans le champ "resultat" (uniquement si le niveau actif est strictement superieur au niveau de l enregistrement ou le type est "A").
    J ai bien compris?

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 123
    Points : 67
    Points
    67
    Par défaut
    Bonjour Ninouchfis

    Voilà, c'est ce que je souhaite.
    En une phrase tu as tout expliqué.

    Encore merci pour ton aide.
    Bonne journée.
    StSym

  12. #12
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 127
    Points : 105
    Points
    105
    Par défaut
    Bonjour,

    le champ "Type" peut prendre quelles valeurs?
    Dans le tableau que tu as envoyé, je vois "A", "" et "B", il y en a d'autre?

  13. #13
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 127
    Points : 105
    Points
    105
    Par défaut
    Ceci devrait fonctionner (j'ai rajouté un peu de commentaires):

    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
    Function Test()
    Dim NiveauSuivant As Single
    Dim NiveauActif As Single
    Dim TypeActif As String
     
    On Error Resume Next
     
    Set rst = CurrentDb.OpenRecordset("Table1")
    rst.MoveFirst
     
    While Not rst.EOF
     
        Select Case rst![Type]
            Case "A" 'Le type est "A"
                TypeActif = "A" 'On récupère sa valeur
                NiveauActif = rst![niveau] 'On récupère sa valeur
     
            Case "" 'Il n'y a aucune valeur dans le champ "Type"
                'On ne fait rien
     
            Case Else 'Le champ "Type" contient une autre valeur que "A"
                TypeActif = "Autre" 'Le type n'est pas "A" mais "Autre"
        End Select
     
        rst.MoveNext 'On va se placer sur l'enregistrement suivant
        NiveauSuivant = rst![niveau] 'On récupère sa valeur
     
        If NiveauActif < NiveauSuivant And TypeActif = "A" Then 'Si le niveau actif est inférieur au niveau suivant et que le type est "A"
            rst.Edit 'Edition de la table
            rst![Resultat] = NiveauActif 'Ecriture dans le champ "Resultat"
            rst.Update 'Actualisation de la table
        End If
     
    Wend
     
    Set rst = Nothing ' Mise à zéro de rst
     
    End Function

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 123
    Points : 67
    Points
    67
    Par défaut
    Bonjour Ninouchfis

    Désolé pour le retard de ma réponse.

    Tout fonctionne comme souhaité

    Je te remercie pour ton aide avec des réponses rapides.
    Des codes bien explicites et commentés ce qui n'était pas le cas de ma demande.

    Je dis bravo.
    SySym

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 24/03/2012, 06h23
  2. Recherche des enregistrements du mois précédent
    Par xenos dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/07/2007, 14h14
  3. Réponses: 16
    Dernier message: 25/03/2007, 10h56
  4. Retourné des enregistrement suivant des dates
    Par seb.49 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 20/07/2006, 16h42
  5. Requête qui exclue des enregistrements suivants des valeurs
    Par paflolo dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/02/2006, 18h38

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