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 :

Demande d'aide pour la création d'un code VBA entre 2 tables [AC-2007]


Sujet :

VBA Access

  1. #41
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    En fait on va faire la même chose mais en VBA parceque sinon c'est un peu lourd.
    De plus il faut se servir des variables globales en dernier recours quand on n'a pas d'autre solution.
    Le défaut des variables globales c'est que n'importe où dans le code on peut la manipuler et changer sa valeur ce qui peut avoir des conséquences assez désagréables.

    Ici le code modifié.

    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
    dim NumChqEncaisse as string: NumChqEncaisse=dfirst("NumCheque", "Cheque", "[ChqEncaisse]=True")) & "" 'le & "" évite d'avoir à gérer les Nuls si il n'y a pas de chêque encaissé.
     
    Dim MontantChequeEncaisse as variant: MontantChequeEncaisse=DFirst("MontantChq", "Cheques", "NumChq=""" & NumChqEncaisse & """")
     
    'S'assure que le montant est un réel double
    if isnull(MontantChequeEncaisse ) then
       MontantChequeEncaisse =cdbl(0)
     else
       MontantChequeEncaisse =cdbl(MontantChequeEncaisse)
    end if
     
    Dim MontantMouvement as variant: MontantMouvement=DSum("MontantMvt", "Mouvements", "NumChq=""" & NumChqEncaisse & """")
     
    'S'assure que le montant est un réel double
    if isnull(MontantMouvement ) then
       MontantChequeEncaisse =cdbl(0)
     else
       MontantMouvement =cdbl(MontantMouvement)
    end if
     
    if montantMouvement<>MontantChequeEncaisse  then
        call mgsbox("Le montant du chèque est différent du montant des mouvements.", vbExclamation)
      else
        call mgsbox("Le montant du chèque est égal au montant des mouvements.", vbInformation)
    end if
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  2. #42
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2013
    Messages : 297
    Points : 74
    Points
    74
    Par défaut
    Bonjour marot,

    merci pour ton code.

    J'ai essayé de travailler le code pour l'intégrer mais il bloque sur une erreur de compilation pourtant chaque balise est correctement fermée.
    Est-ce c'est parce qu'il manque un else avant le nouveau if ?

    Voici une petite capture d'écran de l'erreur :
    Nom : Message d'erreur.PNG
Affichages : 299
Taille : 30,2 Ko

    Et ci-dessous le 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
    Public Sub UpdateX()
     
        'Déclaration des variables
        Dim Db As dao.Database
        Dim r As dao.Recordset
     
        Dim NumChqEncaisse As String
        Dim MontantChequeEncaisse As Variant
     
        Dim MontantMouvement As Variant
     
        ' excecution du code
        Set Db = CurrentDb
        Set r = Db.OpenRecordset("Cheques") 'Une source peut être une le nom d'une table, d'une requête ou du code SQL.
     
        ' Attribution de la varibale
        Num = r![NumChq] 'Renvoi le numéro du chèque
     
        NumChqEncaisse = DFirst("NumCheque", "Cheque", "[ChqEncaisse]=True") & "" 'le & "" évite d'avoir à gérer les Nuls si il n'y a pas de chêque encaissé.
        MontantChequeEncaisse = DFirst("MontantChq", "Cheques", "NumChq=""" & NumChqEncaisse & """")
     
        MontantMouvement = DSum("MontantMvt", "Mouvements", "NumChq=""" & NumChqEncaisse & """")
     
     
     'S'assure que le montant est un réel double
        If IsNull(MontantChequeEncaisse) Then
         MontantChequeEncaisse = CDbl(0)
     
        Else
         MontantChequeEncaisse = CDbl(MontantChequeEncaisse)
        End If
     
     
    'S'assure que le montant est un réel double
        If IsNull(MontantMouvement) Then
         MontantChequeEncaisse = CDbl(0)
     
       Else
         MontantMouvement = CDbl(MontantMouvement)
        End If
     
        If vbYes = MsgBox("Voullez-vous vraiment mettre les données à jour du" & Num & "?", vbQuestion + vbYesNo + vbDefaultButton2) _
        Then
             'Ici appeler le code de mise à jour.
             ' Le changement se fait au niveau de la colonne en attente dans la table Mouvement
             'On relie le numéro de chèque de la table chèque avec la table mouvement
             'Le changement s'effectue à condition que la case cheque encaisse soit coche'
        Db.Execute ("Update Cheques INNER JOIN (Mouvements) ON (Cheques.NumChq)=(Mouvements.NumChq)" _
                    & " SET Mouvements.EnAttente=No " _
                    & " WHERE Cheques.ChqEncaisse=Yes;")
     
        If MontantMouvement <> MontantChequeEncaisse Then
          Call mgsbox("Le montant du chèque est différent du montant des mouvements.", vbExclamation)
     
        Else
          Call mgsbox("Le montant du chèque est égal au montant des mouvements.", vbInformation)
        End If
     
        Db.Close
     
         End If
     
    End Sub
    J'ai essayé de faire quelque chose de propre.

    Encore merci pour l'aide.

    Bien cordialement,
    Benjamin.

  3. #43
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Désolé encore une faute de frappe.

    c'est MsgBox et non mgsBox.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #44
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2013
    Messages : 297
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Désolé encore une faute de frappe.

    c'est MsgBox et non mgsBox.

    A+
    Merci marot, car ceci n'est pas sauté à mes yeux pourtant.

    Bon le code a été corrigé sur les champs de table incorrecte.

    Donc voici le code désormais :
    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
    Public Sub UpdateX()
     
        'Déclaration des variables
        Dim Db As dao.Database
     
        Dim NumChqEncaisse As String
        Dim MontantChequeEncaisse As Variant
     
        Dim MontantMouvement As Variant
     
        ' excecution du code
        Set Db = CurrentDb
     
        ' Attribution de la varibale
     
        NumChqEncaisse = DFirst("NumChq", "Cheques", "[ChqEncaisse]=True") & "" 'le & "" évite d'avoir à gérer les Nuls si il n'y a pas de chêque encaissé.
        MontantChequeEncaisse = DFirst("MontantChq", "Cheques", "NumChq=""" & NumChqEncaisse & """")
     
        MontantMouvement = Abs(DSum("MontantMvt", "Mouvements", "NumChq=""" & NumChqEncaisse & """"))
     
     
     'S'assure que le montant est un réel double
        If IsNull(MontantChequeEncaisse) Then
         MontantChequeEncaisse = CDbl(0)
     
        Else
         MontantChequeEncaisse = CDbl(MontantChequeEncaisse)
        End If
     
     
    'S'assure que le montant est un réel double
        If IsNull(MontantMouvement) Then
         MontantChequeEncaisse = CDbl(0)
     
       Else
         MontantMouvement = CDbl(MontantMouvement)
        End If
     
        If vbYes = MsgBox("Voullez-vous vraiment mettre les données à jour du " & NumChqEncaisse & " ?", vbQuestion + vbYesNo + vbDefaultButton2) _
        Then
             'Ici appeler le code de mise à jour.
             ' Le changement se fait au niveau de la colonne en attente dans la table Mouvement
             'On relie le numéro de chèque de la table chèque avec la table mouvement
             'Le changement s'effectue à condition que la case cheque encaisse soit coche'
        Db.Execute ("Update Cheques INNER JOIN (Mouvements) ON (Cheques.NumChq)=(Mouvements.NumChq)" _
                    & " SET Mouvements.EnAttente=No " _
                    & " WHERE Cheques.ChqEncaisse=Yes;")
     
        If MontantMouvement <> MontantChequeEncaisse Then
          Call MsgBox("Le montant du chèque est différent du montant des mouvements.", vbExclamation)
     
        Else
          Call MsgBox("Le montant du chèque est égal au montant des mouvements.", vbInformation)
        End If
     
        Db.Close
     
         End If
     
    End Sub
    J'ai un premier souci sur le numéro de chèque qui apparaît dans la zone de texte de la boîte de dialogue lors de la demande de validation :
    Nom : Numéro de chèque.PNG
Affichages : 298
Taille : 19,9 Ko


    J'ai un deuxième souci au niveau sur le montant des mouvement correspondant au numéro du chèque cliqué :
    Nom : montant mouvements.PNG
Affichages : 237
Taille : 19,9 Ko

    Car la ligne d'enregistrement est de - 7€.

    Ceci est normal car chaque chèque émis c'est à dire CHQ00.. correspondants à un total de lignes de mouvements négatifs car c'est une sortie d'argent. Alors qu'un chèque son montant ne peut qu'être positif.
    A l'inverse pour les CHQEXT.. ceci correspond à un total de lignes positives car c'est une rentrée d'argent.

    Je pense que le plus simple, c'est qu'une fois le montant total des mouvements calculés, il faut mettre cette valeur en absolu.
    J'ai su intégrer le code ABS dans la formule afin de régler le problème.


    Je crois que l'on touche presque au but, encore merci pour ton aide marot.

    Bien cordialement,
    Benjamin.

  5. #45
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    J'ai un premier souci sur le numéro de chèque qui apparaît dans la zone de texte de la boîte de dialogue lors de la demande de validation :
    Vérifie bien qu'il n'y a qu'un est un seul chèque encaissé coché.
    Et vérifie si c'est ChqEncaisse le champ de la table cheque qu'il faut tester,

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #46
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2013
    Messages : 297
    Points : 74
    Points
    74
    Par défaut
    Bonjour marot,

    Alors j'ai un problème, le code ne fonctionne pas.
    J'ai effectué plusieurs essaie en mettant un chèque avec un montant de 100 € et une ligne de mouvement avec un montant de 200 €, il m'indique que le montant du chèque est égal au montant des mouvements.

    Je me demande si je n'ai pas effectué des erreurs dans le placement des codes, car le code commence à être rempli.

    Voici le 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
    Public Sub UpdateX()
     
        'Déclaration des variables
        Dim Db As dao.Database
        Dim NumChqEncaisse As String
        Dim MontantChequeEncaisse As Variant
        Dim MontantMouvement As Variant
     
        ' excecution du code
        Set Db = CurrentDb
     
        ' Attribution de la varibale
     
        NumChqEncaisse = DFirst("NumChq", "Cheques", "[ChqEncaisse]=True") & "" 'le & "" évite d'avoir à gérer les Nuls si il n'y a pas de chêque encaissé.
        MontantChequeEncaisse = DFirst("MontantChq", "Cheques", "NumChq=""" & NumChqEncaisse & """")
        MontantMouvement = Abs(DSum("MontantMvt", "Mouvements", "NumChq=""" & NumChqEncaisse & """"))
     
     
     'S'assure que le montant est un réel double
        If IsNull(MontantChequeEncaisse) Then
         MontantChequeEncaisse = CDbl(0)
     
        Else
         MontantChequeEncaisse = CDbl(MontantChequeEncaisse)
        End If
     
     
    'S'assure que le montant est un réel double
        If IsNull(MontantMouvement) Then
         MontantChequeEncaisse = CDbl(0)
     
       Else
         MontantMouvement = CDbl(MontantMouvement)
        End If
     
        If vbYes = MsgBox("Voullez-vous vraiment mettre les données à jour du " & NumChqEncaisse & " ?", vbQuestion + vbYesNo + vbDefaultButton2) _
        Then
        If MontantMouvement <> MontantChequeEncaisse Then
          Call MsgBox("Le montant du chèque est différent du montant des mouvements." & Chr(10) & _
           "Les données n'ont pas été modifiées.", vbExclamation)
     
        Else
          Call MsgBox("Le montant du chèque est égal au montant des mouvements.", vbInformation)
          'Ici appeler le code de mise à jour.
             ' Le changement se fait au niveau de la colonne en attente dans la table Mouvement
             'On relie le numéro de chèque de la table chèque avec la table mouvement
             'Le changement s'effectue à condition que la case cheque encaisse soit coche'
        Db.Execute ("Update Cheques INNER JOIN (Mouvements) ON (Cheques.NumChq)=(Mouvements.NumChq)" _
                    & " SET Mouvements.EnAttente=No " _
                    & " WHERE Cheques.ChqEncaisse=Yes;")
     
        End If
     
      Db.Close
     
         End If
     
    End Sub

    Pourriez-vous m'expliquer à quoi correspond le code que tu as rajouté ci-dessous stp, car je ne comprends pas ce que l'on appelle par un réel double.

    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
     'S'assure que le montant est un réel double
        If IsNull(MontantChequeEncaisse) Then
         MontantChequeEncaisse = CDbl(0)
     
        Else
         MontantChequeEncaisse = CDbl(MontantChequeEncaisse)
        End If
     
     
    'S'assure que le montant est un réel double
        If IsNull(MontantMouvement) Then
         MontantChequeEncaisse = CDbl(0)
     
       Else
         MontantMouvement = CDbl(MontantMouvement)
        End If
    Encore merci pour ton aide.

    Bien cordialement,
    Benjamin.

  7. #47
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Un reel double est un type de nombre décimal qui peut accepter le plus grand interval de valeurs.

    Quand on utilise DFirst(), si Access ne trouve pas l'info, il retourne Null.
    Null est une valeur spéciale et en principe n'importe quoi et Null te donne Null.
    Donc si on veut l'utiliser dans un calcul on va avoir une erreur.
    Pour gérer les nulls on est obligé d'utiliser le type Variant.
    Une variable de type Variant peut accepter n'importe quelle valeur (texte, nombre, nuls, etc.) mais c'est Access qui décide.
    J'ai mis du code pour m'assurer que j'aurai bien le type que JE veux quoi qu'en pense Access.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  8. #48
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2013
    Messages : 297
    Points : 74
    Points
    74
    Par défaut
    Merci pour les explications, je vais garder cette documentation dans mes favoris elle va être utile par la suite.

    Par contre, afin d'insérer le code dans la base initiale, j'ai effectué divers tests afin de vérifier le code ci-dessous :
    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
    Public Sub UpdateX()
     
        'Déclaration des variables
        Dim Db As dao.Database
        Dim NumChqEncaisse As String
        Dim MontantChequeEncaisse As Variant
        Dim MontantMouvement As Variant
     
        ' excecution du code
        Set Db = CurrentDb
     
        ' Attribution de la varibale
     
        NumChqEncaisse = DFirst("NumChq", "Cheques", "[ChqEncaisse]=True") & "" 'le & "" évite d'avoir à gérer les Nuls si il n'y a pas de chêque encaissé.
        MontantChequeEncaisse = DFirst("MontantChq", "Cheques", "NumChq=""" & NumChqEncaisse & """")
        MontantMouvement = Abs(DSum("MontantMvt", "Mouvements", "NumChq=""" & NumChqEncaisse & """"))
     
     
     'S'assure que le montant est un réel double
        If IsNull(MontantChequeEncaisse) Then
         MontantChequeEncaisse = CDbl(0)
     
        Else
         MontantChequeEncaisse = CDbl(MontantChequeEncaisse)
        End If
     
     
    'S'assure que le montant est un réel double
        If IsNull(MontantMouvement) Then
         MontantChequeEncaisse = CDbl(0)
     
       Else
         MontantMouvement = CDbl(MontantMouvement)
        End If
     
        If vbYes = MsgBox("Voullez-vous vraiment mettre les données à jour du " & NumChqEncaisse & " ?", vbQuestion + vbYesNo + vbDefaultButton2) _
        Then
        If MontantMouvement <> MontantChequeEncaisse Then
          Call MsgBox("Le montant du chèque est différent du montant des mouvements." & Chr(10) & _
           "Les données n'ont pas été modifiées.", vbExclamation)
     
        Else
          Call MsgBox("Le montant du chèque est égal au montant des mouvements.", vbInformation)
          'Ici appeler le code de mise à jour.
             ' Le changement se fait au niveau de la colonne en attente dans la table Mouvement
             'On relie le numéro de chèque de la table chèque avec la table mouvement
             'Le changement s'effectue à condition que la case cheque encaisse soit coche'
        Db.Execute ("Update Cheques INNER JOIN (Mouvements) ON (Cheques.NumChq)=(Mouvements.NumChq)" _
                    & " SET Mouvements.EnAttente=No " _
                    & " WHERE Cheques.ChqEncaisse=Yes;")
     
        End If
     
      Db.Close
     
         End If
     
    End Sub
    Alors :
    - le code depuis l'installation des boîtes de dialogue ne fonctionne plus, c'est-à-dire que lorsque j'encaisse le chèque, il ne décoche pas la case de mouvements en attente.
    - Quels que soient les montants des mouvements que j'indique c'est-à-dire identique ou non identique au montant du chèque, il m'indique que le montant du chèque est identique au total des mouvements.

    Je me demande si je n'ai pas foutu le "bordel" dans la mise en place des codes.

    Encore merci une nouvelle fois pour votre aide.

    Bien cordialement,
    Benjamin.

  9. #49
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Il y a une erreur ici voici le code correct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        If IsNull(MontantMouvement) Then
         MontantMouvement = CDbl(0)
     
       Else
         MontantMouvement = CDbl(MontantMouvement)
        End If
    Met un point d'arrêt sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If IsNull(MontantChequeEncaisse) Then
    Pour faire cela, clique dans la marge à gauche en face de la ligne.
    Cela va mettre un gros point marron.
    Quand Access va arriver à cette place, il va arréter l'éxécution et va te permettre d'étudier le code.
    Avec la souris pointe sur MontantChequeEncaisse et sur MontantMouvement, Access va t'afficher les valeurs qu'elles contiennent.
    Cela te permettra de voir si elles sont bien égales.
    Pour reprendre l'exécution, appuyer sur la touche [F5].
    Pour avancer à l'instruction suivante, appuyer sur la touche [f8]. Cela te permet de voir comment Access traite ton code.

    Aussi quand tu as des if dans des if, indente le code, cela le rend plus lisible et permet de mieux voir la logique de traitement.

    Ex de code indenté.

    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
    if uneCondtion then
     
         if uneAutreCondition then
                 'Ici le cas vrai
              else
     
                 if uneAutreAutreCondition
                    'Ici le cas vrai
                 end if
     
         end if
     
       else
          'Ici le cas else
    end if
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  10. #50
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2013
    Messages : 297
    Points : 74
    Points
    74
    Par défaut
    Bonjour marot,

    Alors tout d'abord j'ai intenté mon code pour une meilleure visisbilité :
    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
    Public Sub UpdateX()
     
        'Déclaration des variables
        Dim Db As dao.Database
        Dim NumChqEncaisse As String
        Dim MontantChequeEncaisse As Variant
        Dim MontantMouvement As Variant
     
        ' excecution du code
        Set Db = CurrentDb
     
        ' Attribution de la varibale
        NumChqEncaisse = DFirst("NumChq", "Cheques", "[ChqEncaisse]=True") & "" 'le & "" évite d'avoir à gérer les Nuls si il n'y a pas de chêque encaissé.
        MontantChequeEncaisse = DFirst("MontantChq", "Cheques", "NumChq=""" & NumChqEncaisse & """")
        MontantMouvement = Abs(DSum("MontantMvt", "Mouvements", "NumChq=""" & NumChqEncaisse & """"))
     
     
        'S'assure que le montant est un réel double
        If IsNull(MontantChequeEncaisse) _
            Then
               MontantChequeEncaisse = CDbl(0)
     
            Else
               MontantChequeEncaisse = CDbl(MontantChequeEncaisse)
        End If
     
     
       'S'assure que le montant est un réel double
        If IsNull(MontantMouvement) _
            Then
               MontantMouvement = CDbl(0)
     
            Else
               MontantMouvement = CDbl(MontantMouvement)
        End If
     
     
        If vbYes = MsgBox("Voullez-vous vraiment mettre les données à jour du " & NumChqEncaisse & " ?", vbQuestion + vbYesNo + vbDefaultButton2) _
             Then
                 If MontantMouvement <> MontantChequeEncaisse _
                        Then
                           Call MsgBox("Le montant du chèque est différent du montant des mouvements." & Chr(10) & _
                           "Les données n'ont pas été modifiées.", vbExclamation)
     
                        Else
                           Call MsgBox("Le montant du chèque est égal au montant des mouvements.", vbInformation)
                           'Ici appeler le code de mise à jour.
                           'Le changement s'effectue à condition que la case cheque encaisse soit coche'
                           Db.Execute ("Update Cheques INNER JOIN (Mouvements) ON (Cheques.NumChq)=(Mouvements.NumChq)" _
                                        & " SET Mouvements.EnAttente=No " _
                                        & " WHERE Cheques.ChqEncaisse=Yes;")
                 End If
                           Db.Close
         End If
     
    End Sub
    Par contre su ce code, je n'arrive pas à voir ce qu'affiche comme valeur sur le code en passant ma souris.
    Alors que dans les autres codes ou modules de ma basse, j'y arrive.
    Donc impossible de savoir si ce que l'on a mis est correcte ou non.

    Ci-joint ma base de donnée d'essaie :
    Impossible de mettre ma base de donnée d'essaie, désolé.

    Je te remercie pour ton aide.

    Bien cordialement,
    Benjamin.

  11. #51
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2013
    Messages : 297
    Points : 74
    Points
    74
    Par défaut
    Bonjour marot,

    pour essayer de comprendre le problème du code, tu trouveras ci-joint ma base de données d'essai.

    Il n'y a que le dernier chèque du formulaire qui remplit les conditions de la mise à jour, les autres n'ont pas le même montant.

    lien de la base de donnée :
    https://we.tl/ko9lUjS7qe

    En espérant que l'on arrive à trouver le souci dans le code.

    Bien cordialement,
    Benjamin.

  12. #52
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bizare j'ai la même version d'Access mais je n'arrive pas à accéder au code.

    Il me dit que la BD est corrompues.

    Pour ce qui est de voir les valeurs, cela arrive parfois sans que j'ai pu comprendre la cause.
    Une méthode détournée d'y arriver est de passer par la fenêtre d'exécution immédiate.
    1. Quand tu es en mode débuggage (après un arrêt sur un point d'arrêt)
    2. Tu tapes sur les touches [ctrl][g].
    3. Ensuite dans la fenêtre tu tapes quelque chose comme :
    4. ? NomTaValiable et tu tapes sur la touche [entrée].

    Access va afficher le contenu de ta variable.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  13. #53
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 629
    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 629
    Points : 14 598
    Points
    14 598
    Par défaut
    Bonsoir,
    J'ai ouvert la base et j'ai compilé le code : il y a des erreurs sur des contrôles appartenant au sous-formulaire et qui sont référencés avec Me. dans le formulaire

    Nom : _Erreur_Compile.JPG
Affichages : 402
Taille : 95,1 Ko

    PS : un Undo n'a aucun effet sur un évènement AfterUpdate
    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 ?

  14. #54
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2013
    Messages : 297
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    Bonsoir,
    J'ai ouvert la base et j'ai compilé le code : il y a des erreurs sur des contrôles appartenant au sous-formulaire et qui sont référencés avec Me. dans le formulaire

    PS : un Undo n'a aucun effet sur un évènement AfterUpdate
    Donc je peux enlever les Undo sans risque pour le code ?

    Ceci est du depuis que j'ai changer certains critères de ma table principale, comment y faire pour remédier à ce problème du coup ?

    Merci Tee_grandbois.


    Marot,

    par contre toujours rien, même en suivant tes instructions.
    C'est vraiment dommage, car on a presque arrivé à faire ce que je voulais.

    Merci pour vos aides en tout cas.

    Bien cordialement,
    Benjamin.

  15. #55
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 629
    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 629
    Points : 14 598
    Points
    14 598
    Par défaut
    Ceci est du depuis que j'ai changer certains critères de ma table principale, comment y faire pour remédier à ce problème du coup ?
    voici le code modifié (que je n'ai pas testé, n'ayant pas complètement suivi le fil de la discussion, je ne sais pas comment utiliser la base) :
    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
    Private Sub Form_AfterUpdate()
    If Not IsNull(Me.Mouvements_Sous_formulaire1.Form.DateMvt) And IsNull(Me.Mouvements_Sous_formulaire1.Form.LibelleMvt) Then
        MsgBox "Vous avez oublié de saisir un libellé !"
        Me.Mouvements_Sous_formulaire1.Form.LibelleMvt.SetFocus
    End If
    If Not IsNull(Me.Mouvements_Sous_formulaire1.Form.DateMvt) And IsNull(Me.Mouvements_Sous_formulaire1.Form.MontantMvt) Then
        MsgBox "Vous avez oublié de saisir un montant !"
        Me.Mouvements_Sous_formulaire1.Form.MontantMvt.SetFocus
    End If
    If Not IsNull(Me.Mouvements_Sous_formulaire1.Form.DateMvt) And IsNull(Me.Mouvements_Sous_formulaire1.Form.Transaction) Then
        MsgBox "Vous avez oublié de saisir un moyen de paiement !"
        Me.Mouvements_Sous_formulaire1.Form.Transaction.SetFocus
    End If
    If Not IsNull(Me.Mouvements_Sous_formulaire1.Form.DateMvt) And IsNull(Me.Mouvements_Sous_formulaire1.Form.CodeJrnl) Then
        MsgBox "Vous avez oublié de saisir un code de journal!"
        Me.Mouvements_Sous_formulaire1.Form.CodeJrnl.SetFocus
    End If
    If Not IsNull(Me.Mouvements_Sous_formulaire1.Form.DateMvt) And IsNull(Me.Mouvements_Sous_formulaire1.Form.CodeSsJrnl) Then
        MsgBox "Vous avez oublié de saisir un code de sous journal!"
        Me.Mouvements_Sous_formulaire1.Form.CodeSsJrnl.SetFocus
    End If
    If (Me.Mouvements_Sous_formulaire1.Form.Transaction) = "Chèque" And IsNull(Me.Mouvements_Sous_formulaire1.Form.NumChq) Then
        MsgBox "Vous avez oublié de saisir le numéro de chéque correspondant!"
        Me.Mouvements_Sous_formulaire1.Form.NumChq.SetFocus
    End If
    End Sub
    il y a quand même un problème avec le sous-formulaire qui apparait grisé dans la fenêtre base de données et qui se nomme Mouvements_Sous_formulaire1 dans les objets de classe VBA :

    Nom : _frm_grise.JPG
Affichages : 319
Taille : 16,1 Ko
    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 ?

  16. #56
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2013
    Messages : 297
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    voici le code modifié (que je n'ai pas testé, n'ayant pas complètement suivi le fil de la discussion, je ne sais pas comment utiliser la base) :
    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
    Private Sub Form_AfterUpdate()
    If Not IsNull(Me.Mouvements_Sous_formulaire1.Form.DateMvt) And IsNull(Me.Mouvements_Sous_formulaire1.Form.LibelleMvt) Then
        MsgBox "Vous avez oublié de saisir un libellé !"
        Me.Mouvements_Sous_formulaire1.Form.LibelleMvt.SetFocus
    End If
    If Not IsNull(Me.Mouvements_Sous_formulaire1.Form.DateMvt) And IsNull(Me.Mouvements_Sous_formulaire1.Form.MontantMvt) Then
        MsgBox "Vous avez oublié de saisir un montant !"
        Me.Mouvements_Sous_formulaire1.Form.MontantMvt.SetFocus
    End If
    If Not IsNull(Me.Mouvements_Sous_formulaire1.Form.DateMvt) And IsNull(Me.Mouvements_Sous_formulaire1.Form.Transaction) Then
        MsgBox "Vous avez oublié de saisir un moyen de paiement !"
        Me.Mouvements_Sous_formulaire1.Form.Transaction.SetFocus
    End If
    If Not IsNull(Me.Mouvements_Sous_formulaire1.Form.DateMvt) And IsNull(Me.Mouvements_Sous_formulaire1.Form.CodeJrnl) Then
        MsgBox "Vous avez oublié de saisir un code de journal!"
        Me.Mouvements_Sous_formulaire1.Form.CodeJrnl.SetFocus
    End If
    If Not IsNull(Me.Mouvements_Sous_formulaire1.Form.DateMvt) And IsNull(Me.Mouvements_Sous_formulaire1.Form.CodeSsJrnl) Then
        MsgBox "Vous avez oublié de saisir un code de sous journal!"
        Me.Mouvements_Sous_formulaire1.Form.CodeSsJrnl.SetFocus
    End If
    If (Me.Mouvements_Sous_formulaire1.Form.Transaction) = "Chèque" And IsNull(Me.Mouvements_Sous_formulaire1.Form.NumChq) Then
        MsgBox "Vous avez oublié de saisir le numéro de chéque correspondant!"
        Me.Mouvements_Sous_formulaire1.Form.NumChq.SetFocus
    End If
    End Sub
    il y a quand même un problème avec le sous-formulaire qui apparait grisé dans la fenêtre base de données et qui se nomme Mouvements_Sous_formulaire1 dans les objets de classe VBA :

    Nom : _frm_grise.JPG
Affichages : 319
Taille : 16,1 Ko
    Bonjour tee_grandbois,

    Alors je viens de supprimer et recrée un nouveau sous formulaire, car celui du sous-formulaire en place auparavant rencontré des problèmes.

    Mais je n'ai plus de sous formulaire dans la barre d'État désormais, je ne sais pas pourquoi.

    Le code ne fonctionne pas malgré un essai, ci-joint la base :
    https://we.tl/k30Ousfvym

    Pour information, le problème que l'on rencontre avec marot n'est pas encore celui-ci, il vient du code mis en place dans la procédure évènementielle du formulaire chèque non encaissé.
    Le but est lorsque que je clique sur chèque encaissé,
    le code effectue une recherche dans la table mouvement afin de savoir le montant total de toutes les lignes ayant le numéro de chèque que l'on vient de cocher.
    Si ce solde est différent entre le montant du chèque et le montant total des lignes alors la mise à jours ne fonctionne pas,
    au contraire la mise à jour à lieu c'est-à-dire la case chèque encaissé est cochée et toutes les lignes en mouvements en attentes sont décochées, afin d'être comptabilisé dans le solde bancaire.

    Le problème que l'on rencontre avec marrot, c'est que le code ne fonctionne pas, car si le chèque est égal au total des lignes en mouvements ou différents, le code nous indique à chaque fois que le solde est différents de celui des lignes en mouvements en attente.

    Merci pour vos aides.

    Bien cordialement,
    Benjamin.

  17. #57
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 629
    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 629
    Points : 14 598
    Points
    14 598
    Par défaut
    Bonjour Jiben59,
    Pour information, le problème que l'on rencontre avec marot_r n'est pas encore celui-ci
    c'est bien pour cette raison qu'il fallait d'abord se soucier du problème de sous-formulaire et de code non compilé qui peut perturber le fonctionnement de la base (cela compile maintenant avec le code que j'ai corrigé).
    Alors je viens de supprimer et recrée un nouveau sous formulaire, car celui du sous-formulaire en place auparavant rencontré des problèmes.

    Mais je n'ai plus de sous formulaire dans la barre d'État désormais, je ne sais pas pourquoi.
    le sous-formulaire est peut-être masqué : pour le faire apparaitre essaie de faire un clic droit sur "Tous les objets Access" et ensuite cliquer sur "Options de navigation" ensuite cocher "Afficher les objets masqués". Cela dit, il est toujours grisé (comme un objet système) même dans la dernière version.
    Pour information, le problème que l'on rencontre avec marot n'est pas encore celui-ci, il vient du code mis en place dans la procédure évènementielle du formulaire chèque non encaissé.
    Le but est lorsque que je clique sur chèque encaissé,
    le code effectue une recherche dans la table mouvement afin de savoir le montant total de toutes les lignes ayant le numéro de chèque que l'on vient de cocher.
    Si ce solde est différent entre le montant du chèque et le montant total des lignes alors la mise à jours ne fonctionne pas,
    au contraire la mise à jour à lieu c'est-à-dire la case chèque encaissé est cochée et toutes les lignes en mouvements en attentes sont décochées, afin d'être comptabilisé dans le solde bancaire.
    dans UpdateX , cette instruction NumChqEncaisse = DFirst("NumChq", "Cheques", "[ChqEncaisse]=True") & "" te ramènera toujours le premier chèque de la table (c'est à dire, actuellement, le CHQ0013201) puisque c'est le premier qui a le champ chqEncaisse à Vrai.
    Selon moi, NumChqEncaisse devrait prendre la valeur du chèque de l'enregistrement sur lequel tu es positionné (quand tu cliques sur Chqencaisse).
    En plus, si tu lances le code sur clic il faut prévoir, en cas de contrôle des mouvements, de laisser le chèque décoché (ou dans l'état qu'il était avant la modification).

    Dernière chose, la partie mise à jour des mouvements ne prend pas en compte le numéro du chèque sélectionné, de plus comme la table n'est pas encore mise à jour lors du clic, cela ne pouvait pas fonctionner (sauf à forcer la mise à jour mais le code ne le faisait pas).

    Solution : commencer par transformer la Sub UpdateX en Function de manière à provoquer un Undo si le contrôle des mouvements n'est pas correct , ensuite, sur le clic de chqEncaisse on fera l'appel de la fonction avec le numéro du chèque sélectionné en paramètre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub ChqEncaisse_Click()
     
        If UpdateX(Me.NumChq) = False Then Me.Undo Else Me.RecordSource = Me.RecordSource ' pour enlever le chèque qui vient d'être traité
     
    End Sub
    et le code du Sub transformé en fonction qui renvoie True ou False selon que les contrôles sont corrects ou pas :
    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
     
    Public Function UpdateX(pNumChq As String) As Boolean
     
        'Déclaration des variables
        Dim db As DAO.Database
        Dim NumChqEncaisse As String
        Dim MontantChequeEncaisse As Variant
        Dim MontantMouvement As Variant
     
        ' excecution du code
        Set db = CurrentDb
     
        ' Attribution de la varibale
        'NumChqEncaisse = DFirst("NumChq", "Cheques", "[ChqEncaisse]=True") & "" 'le & "" évite d'avoir à gérer les Nuls si il n'y a pas de chêque encaissé.
        NumChqEncaisse = pNumChq
        MontantChequeEncaisse = DFirst("MontantChq", "Cheques", "NumChq=""" & NumChqEncaisse & """")
        MontantMouvement = Abs(DSum("MontantMvt", "Mouvements", "NumChq=""" & NumChqEncaisse & """"))
     
     
        'S'assure que le montant est un réel double
        If IsNull(MontantChequeEncaisse) _
            Then
               MontantChequeEncaisse = CDbl(0)
     
            Else
               MontantChequeEncaisse = CDbl(MontantChequeEncaisse)
        End If
     
     
       'S'assure que le montant est un réel double
        If IsNull(MontantMouvement) _
            Then
               MontantMouvement = CDbl(0)
     
            Else
               MontantMouvement = CDbl(MontantMouvement)
        End If
     
     
        If vbYes = MsgBox("Voulez-vous vraiment mettre les données à jour ?", vbQuestion + vbYesNo + vbDefaultButton2) _
             Then
                 If MontantMouvement <> MontantChequeEncaisse _
                        Then
                           Call MsgBox("Le montant du chèque est différent du montant des mouvements." & Chr(10) & _
                           "Les données n'ont pas été modifiées.", vbExclamation)
     
                        Else
                           Call MsgBox("Le montant du chèque est égal au montant des mouvements.", vbInformation)
                           'Ici appeler le code de mise à jour.
                           'Le changement s'effectue à condition que la case cheque encaisse soit coche'
                           db.Execute ("Update Cheques INNER JOIN (Mouvements) ON Cheques.NumChq = Mouvements.NumChq" _
                                        & " SET Mouvements.EnAttente=No " _
                                        & " WHERE Cheques.NumChq="" & NumChqEncaisse & "";")
                           UpdateX = True  ' pour indiquer que les contrôles sont corrects
                 End If
                           db.Close
         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 ?

  18. #58
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2013
    Messages : 297
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    Bonjour Jiben59,
    c'est bien pour cette raison qu'il fallait d'abord se soucier du problème de sous-formulaire et de code non compilé qui peut perturber le fonctionnement de la base (cela compile maintenant avec le code que j'ai corrigé).
    le sous-formulaire est peut-être masqué : pour le faire apparaitre essaie de faire un clic droit sur "Tous les objets Access" et ensuite cliquer sur "Options de navigation" ensuite cocher "Afficher les objets masqués". Cela dit, il est toujours grisé (comme un objet système) même dans la dernière version.
    Bon, j'ai retrouvé mon formulaire, et il est effectivement grisé.
    Je fais essayer de reprendre le tout de zéro pour trouver le problème car le code ne fonctionne toujours pas lorsqu'on oublie un libellé.


    Citation Envoyé par tee_grandbois Voir le message

    dans UpdateX , cette instruction NumChqEncaisse = DFirst("NumChq", "Cheques", "[ChqEncaisse]=True") & "" te ramènera toujours le premier chèque de la table (c'est à dire, actuellement, le CHQ0013201) puisque c'est le premier qui a le champ chqEncaisse à Vrai.
    Selon moi, NumChqEncaisse devrait prendre la valeur du chèque de l'enregistrement sur lequel tu es positionné (quand tu cliques sur Chqencaisse).
    En plus, si tu lances le code sur clic il faut prévoir, en cas de contrôle des mouvements, de laisser le chèque décoché (ou dans l'état qu'il était avant la modification).
    C'est ce qu'il nous manquait effectivement, avoir le code permettant de sélectionner celui du click.
    Grâce à tes explications, j'ai compris comment faire ça.

    Citation Envoyé par tee_grandbois Voir le message
    Dernière chose, la partie mise à jour des mouvements ne prend pas en compte le numéro du chèque sélectionné, de plus comme la table n'est pas encore mise à jour lors du clic, cela ne pouvait pas fonctionner (sauf à forcer la mise à jour mais le code ne le faisait pas).

    Solution : commencer par transformer la Sub UpdateX en Function de manière à provoquer un Undo si le contrôle des mouvements n'est pas correct , ensuite, sur le clic de chqEncaisse on fera l'appel de la fonction avec le numéro du chèque sélectionné en paramètre.
    Alors là aussi merci pour les diverses explications car c'est plus simple de comprendre quand on explique le code.
    Je te remercie d'avoir rajouté le code qui décoche la case en cas de problème car j'avais prévu de faire ceci mais une fois les problèmes résolus.

    La vérifications des montants est opérationnels, et la boite de dialogue aussi.
    Nous avons résolu ces deux premiers problèmes.
    Par contre, le code de mise à jour ne se fait toujours pas, logiquement il est correcte car il fonctionnait avant d'avoir introduit toutes les boites de dialogue.

    Peut être que le Dd.close est mal placé dans le code.

    Si on arrive à résoudre ce problème, le sujet devrait être résolu à ce niveau.

    Encore merci à toi et à marot, pour vos explications, et vos aides.

    Bien cordialement,
    Benjamin.

  19. #59
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 629
    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 629
    Points : 14 598
    Points
    14 598
    Par défaut
    Par contre, le code de mise à jour ne se fait toujours pas, logiquement il est correcte car il fonctionnait avant d'avoir introduit toutes les boites de dialogue.
    j'ai constaté ce dysfonctionnement après coup, apparemment, ce qui posait problème c'était les parenthèses dans INNER JOIN ON (Cheques.NumChq) = (Mouvements.NumChq) et comme j'ai mis à jour mon post tardivement, la correction est peut-être passée "entre les gouttes", donc je reposte la totalité :
    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
    Private Sub ChqEncaisse_Click()
     
        If UpdateX(Me.NumChq) = False Then Me.Undo Else Me.RecordSource = Me.RecordSource ' pour enlever le chèque qui vient d'être traité
     
    End Sub
     
     
    Public Function UpdateX(NumChq As String) As Boolean
     
        'Déclaration des variables
        Dim db As DAO.Database
        Dim NumChqEncaisse As String
        Dim MontantChequeEncaisse As Variant
        Dim MontantMouvement As Variant
     
        ' excecution du code
        Set db = CurrentDb
     
        ' Attribution de la varibale
        'NumChqEncaisse = DFirst("NumChq", "Cheques", "[ChqEncaisse]=True") & "" 'le & "" évite d'avoir à gérer les Nuls si il n'y a pas de chêque encaissé.
        NumChqEncaisse = NumChq
        MontantChequeEncaisse = DFirst("MontantChq", "Cheques", "NumChq=""" & NumChqEncaisse & """")
        MontantMouvement = Abs(DSum("MontantMvt", "Mouvements", "NumChq=""" & NumChqEncaisse & """"))
     
     
        'S'assure que le montant est un réel double
        If IsNull(MontantChequeEncaisse) _
            Then
               MontantChequeEncaisse = CDbl(0)
     
            Else
               MontantChequeEncaisse = CDbl(MontantChequeEncaisse)
        End If
     
     
       'S'assure que le montant est un réel double
        If IsNull(MontantMouvement) _
            Then
               MontantMouvement = CDbl(0)
     
            Else
               MontantMouvement = CDbl(MontantMouvement)
        End If
     
     
        If vbYes = MsgBox("Voullez-vous vraiment mettre les données à jour ?", vbQuestion + vbYesNo + vbDefaultButton2) _
             Then
                 If MontantMouvement <> MontantChequeEncaisse _
                        Then
                           Call MsgBox("Le montant du chèque est différent du montant des mouvements." & Chr(10) & _
                           "Les données n'ont pas été modifiées.", vbExclamation)
     
                        Else
                           Call MsgBox("Le montant du chèque est égal au montant des mouvements.", vbInformation)
                           'Ici appeler le code de mise à jour.
                           'Le changement s'effectue à condition que la case cheque encaisse soit coche'
                           db.Execute ("Update Cheques INNER JOIN (Mouvements) ON Cheques.NumChq=Mouvements.NumChq" _
                                        & " SET Mouvements.EnAttente=No " _
                                        & " WHERE Mouvements.NumChq="" & NumChqEncaisse & "";")
                           UpdateX = True
                 End If
                           db.Close
         End If
     
    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 ?

  20. #60
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2013
    Messages : 297
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    j'ai constaté ce dysfonctionnement après coup, apparemment, ce qui posait problème c'était les parenthèses dans INNER JOIN ON (Cheques.NumChq) = (Mouvements.NumChq) et comme j'ai mis à jour mon post tardivement, la correction est peut-être passée "entre les gouttes", donc je reposte la totalité :
    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
    Private Sub ChqEncaisse_Click()
     
        If UpdateX(Me.NumChq) = False Then Me.Undo Else Me.RecordSource = Me.RecordSource ' pour enlever le chèque qui vient d'être traité
     
    End Sub
     
     
    Public Function UpdateX(NumChq As String) As Boolean
     
        'Déclaration des variables
        Dim db As DAO.Database
        Dim NumChqEncaisse As String
        Dim MontantChequeEncaisse As Variant
        Dim MontantMouvement As Variant
     
        ' excecution du code
        Set db = CurrentDb
     
        ' Attribution de la varibale
        'NumChqEncaisse = DFirst("NumChq", "Cheques", "[ChqEncaisse]=True") & "" 'le & "" évite d'avoir à gérer les Nuls si il n'y a pas de chêque encaissé.
        NumChqEncaisse = NumChq
        MontantChequeEncaisse = DFirst("MontantChq", "Cheques", "NumChq=""" & NumChqEncaisse & """")
        MontantMouvement = Abs(DSum("MontantMvt", "Mouvements", "NumChq=""" & NumChqEncaisse & """"))
     
     
        'S'assure que le montant est un réel double
        If IsNull(MontantChequeEncaisse) _
            Then
               MontantChequeEncaisse = CDbl(0)
     
            Else
               MontantChequeEncaisse = CDbl(MontantChequeEncaisse)
        End If
     
     
       'S'assure que le montant est un réel double
        If IsNull(MontantMouvement) _
            Then
               MontantMouvement = CDbl(0)
     
            Else
               MontantMouvement = CDbl(MontantMouvement)
        End If
     
     
        If vbYes = MsgBox("Voullez-vous vraiment mettre les données à jour ?", vbQuestion + vbYesNo + vbDefaultButton2) _
             Then
                 If MontantMouvement <> MontantChequeEncaisse _
                        Then
                           Call MsgBox("Le montant du chèque est différent du montant des mouvements." & Chr(10) & _
                           "Les données n'ont pas été modifiées.", vbExclamation)
     
                        Else
                           Call MsgBox("Le montant du chèque est égal au montant des mouvements.", vbInformation)
                           'Ici appeler le code de mise à jour.
                           'Le changement s'effectue à condition que la case cheque encaisse soit coche'
                           db.Execute ("Update Cheques INNER JOIN (Mouvements) ON Cheques.NumChq=Mouvements.NumChq" _
                                        & " SET Mouvements.EnAttente=No " _
                                        & " WHERE Mouvements.NumChq="" & NumChqEncaisse & "";")
                           UpdateX = True
                 End If
                           db.Close
         End If
     
    End Function
    Je n'avais pas vu la modification, mais rien ne se passe toujours au nouveau des mouvements en attentes qui ne se décochent pas malgré le chèque validé en encaissement.

    Pourtant le code me semble correcte pour faire ce que l'on souhaite faire.

    Bien cordialement,
    Benjamin.

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. Demande d'aide pour la création d'une requête SQL
    Par defcom60 dans le forum Langage SQL
    Réponses: 14
    Dernier message: 02/11/2015, 20h21
  2. demande d'aide pour la création d'une BDD
    Par RasWisdom dans le forum Débuter
    Réponses: 2
    Dernier message: 16/04/2013, 11h49
  3. Réponses: 4
    Dernier message: 03/06/2012, 08h08
  4. demande d'aide pour la création d'un driver
    Par thor76160 dans le forum C#
    Réponses: 3
    Dernier message: 20/12/2009, 21h20
  5. Réponses: 2
    Dernier message: 29/11/2006, 22h52

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