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 :

Boucle sur requête avec détection enregistrement suivant [AC-365]


Sujet :

VBA Access

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2010
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 198
    Points : 140
    Points
    140
    Par défaut Boucle sur requête avec détection enregistrement suivant
    Bonjour,
    j'ai une requête qui reprend les champs d'une table avec un tri par références.
    Je voudrais savoir comment détecter dans une boucle qu'elle sera la référence suivante et si c'est la même pouvoir récupérer la valeur suivante liée à cette même référence pour la soustraire et écrire le résultat.
    Si celle si change la valeur sera nulle.
    Rien ne vaut une petite image pour explications

    Nom : Capture_boucle.JPG
Affichages : 92
Taille : 74,0 Ko

    J'ai fait un début de 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
     
    Function ESSAI()
     
    On Error GoTo errHnd
     
     
    Dim base As Database: Dim enr As Recordset
    Dim nb As Long: Dim compteur As Long
     
    Set base = CurrentDb()
    Set enr = base.OpenRecordset("R_journal_stock")
     
    nb = enr.RecordCount
     
     
    'MsgBox nb
     
     
     
     
     
     
    DoCmd.SetWarnings False
     
        Dim db As DAO.Database: Set db = CurrentDb
        Dim rst As DAO.Recordset
        Dim strSQL As String
        Dim I As Integer
     
        strSQL = "Select Reference, Date_ip, Quantite, Consomation From R_journal_stock"
        Set rst = db.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges)
        If Not rst.EOF Then
     
            rst.MoveFirst
            Do While rst.EOF = False
                rst.Edit
                If Nz(rst("Reference"), "") <> "" Then
     
                'Nz(rst("Consomation")) = Nz(rst("Consomation")) - Nz(rst("Consomation"))...d'aprés
     
     
                End If
     
                rst.Update
                rst.MoveNext
     
     
     
            Loop
        End If
        rst.Close
        Set rst = Nothing
        Set db = Nothing
     
     
     
     
     
     DoCmd.SetWarnings True
     
     
    Exit Function
    errHnd:
    MsgBox "Erreur N° " & Err.Number & vbLf & Err.Description, , Err.Source
    End Function

    Si quelqu'un à une idée merci d'avance.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 110
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 110
    Points : 1 632
    Points
    1 632
    Par défaut
    Salut,

    Basiquement, il te faut ouvrir 2 recordsets (ou cloner le premier), disons A et B sur la même requête, et comparer l'enregistrement N du recordset A, avec l'enregistrement N+1 du recordset B.

  3. #3
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonsoir,
    j'ai une requête qui reprend les champs d'une table avec un tri par références.
    je pense qu'il faut trier également par date et l'appliquer sur le jeu d'enregistrements lu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        strSQL = "SELECT Reference, Date_ip, Quantite, Consomation FROM R_journal_stock ORDER BY Reference, Date_ip;"
    Je voudrais savoir comment détecter dans une boucle qu'elle sera la référence suivante et si c'est la même
    pouvoir récupérer la valeur suivante liée à cette même référence pour la soustraire et écrire le résultat.
    Si celle si change la valeur sera nulle.
    si j'ai bien compris, tu souhaites récupérer la quantité suivante pour mettre à jour la consommation de l'enregistrement précédent ? ce n'est pas la plus simple des boucles à réaliser.
    Pour récupérer la valeur d'un enregistrement suivant, le mieux c'est d'effectuer un Movenext (si on n'est pas en fin de fichier) après avoir sauvegardé le signet de l'enregistrement lu (ou bookmark en anglais et comme expliqué dans ce tuto), récupérer les données de l'enregistrement suivant, puis revenir à l'enregistrement en cours via le signet et enfin, la mise à jour peut se faire:
    Code VBA : 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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    Function ESSAI()
     
    On Error GoTo errHnd
     
        Dim db As DAO.Database: Set db = CurrentDb
        Dim rst As DAO.Recordset
        Dim strSQL As String
     
        Dim stReference As String
        Dim lgQteSuiv As Long
        Dim BytPosition() As Byte
     
        strSQL = "SELECT Reference, Date_ip, Quantite, Consomation FROM R_journal_stock ORDER BY Reference, Date_ip;"
        Set rst = db.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges)
     
        If Not rst.EOF Then
            'pour mettre à jour le Recordcount
            rst.MoveLast: rst.MoveFirst
     
            Do Until rst.EOF
                If Nz(rst("Reference"), "") <> "" Then       ' ???? à quoi sert ce IF  ?
                    ' sauvegarde du signet de l'enregistrment actif
                    BytPosition = rst.Bookmark
     
                  ' lecture enr. suivant si pas sur dernier enregistrement
                    If rst.AbsolutePosition + 1 <> rst.RecordCount Then
                        rst.MoveNext
                        ' récup reference suivante
                        stReference = Nz(rst("Reference"), "")
                        ' récup quantité suivante
                        lgQteSuiv = Nz(rst("Quantite"), 0)
                        ' restauration du signet de l'enregistrement actif
                        rst.Bookmark = BytPosition
                        rst.Edit
                  ' Maj de la consommation précédente
                        If rst("Reference") = stReference Then
                            rst("Consomation") = Nz(rst("quantite"), 0) - lgQteSuiv
                            rst.Update
                        Else
                            rst("Consomation") = Null
                        End If
                    End If
                End If
                rst.MoveNext
     
            Loop
        End If
     
        rst.Close
        Set rst = Nothing
        Set db = Nothing
     
    Exit Function
    errHnd:
    MsgBox "Erreur N° " & err.Number & vbLf & err.Description, , err.Source
    End Function
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Août 2010
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 198
    Points : 140
    Points
    140
    Par défaut
    Un grand merci tee grandbois !

  5. #5
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonsoir,
    désolé, j'ai oublié une instruction rst.Update dans le Else :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                        If rst("Reference") = stReference Then
                            rst("Consomation") = Nz(rst("quantite"), 0) - lgQteSuiv
                            rst.Update
                        Else
                            rst("Consomation") = Null
                            rst.Update
                        End If
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Août 2010
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 198
    Points : 140
    Points
    140
    Par défaut
    Bonsoir,
    oui j'avais corrigé

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

Discussions similaires

  1. Boucle sur feuille avec exception
    Par liop49 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/03/2009, 11h25
  2. [MySQL] Tri sur requête avec jointure
    Par renaud26 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/02/2009, 09h40
  3. PB sur requête avec un champs texte
    Par nomade333 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 02/04/2008, 22h12
  4. problème de performance sur requête avec Tsearch2
    Par Morpheas dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 05/02/2008, 12h25
  5. [MySQL] Jointure externe sur requête avec MySQL
    Par ginkas31 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 01/02/2008, 11h02

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