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

IHM Discussion :

Cocher automatiquement une case


Sujet :

IHM

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 17
    Points : 6
    Points
    6
    Par défaut Cocher automatiquement une case
    Bonjour à tous,

    J'ai actuellement une base de données gérant des factures et des clients. Les factures peuvent être payées en plusieurs paiements.
    Dans ma table "facture", j'ai un champs "payé" de type booléen.

    Je souhaiterais que ce champs (qui est matérialisé par une case à cocher) bascule automatiquement sur "oui" lorsque la somme des paiements est égale au total de la facture.

    Je débute en VBA mais je pensais à un code qui voudrait dire :
    Si la somme des paiement pour telle facture = Total TTC
    Alors Payée de la table Facture = Vrai
    Sinon Payée de la table Facture = Faux

    Si vous savez comment l'écrire en VBA je suis preneuse!!
    Merci d'avance pour votre aide!

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 783
    Points : 58 195
    Points
    58 195
    Billets dans le blog
    42
    Par défaut
    Bonsoir,

    une proposition avec une requête de mise à jour (UPDATE), à partir des tables :
    Facture-1-------∞-Paiement

    Facture(idFacture,…, MontantFacture,Payée)
    Paiement(idPaiement,…, MontantPaiement, #idFacture)

    La requête suivante sélectionne les factures payées :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT F.idFacture
    FROM Facture  F INNER JOIN Paiement  P ON F.idFacture = P.idFacture
    GROUP BY F.idFacture, F.MontantFacture
    HAVING F.MontantFacture-Sum(P.MontantPaiement)=0;

    Et on met à jour le champ [Payé] pour ces factures:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE Facture SET [Payée] = true
    WHERE Facture.idFacture IN 
    (
       SELECT F.idFacture
       FROM Facture  F INNER JOIN Paiement  P ON F.idFacture = P.idFacture
       GROUP BY F.idFacture, F.MontantFacture
       HAVING F.MontantFacture-Sum(P.MontantPaiement)=0
    ) ;

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Merci pour ta proposition.
    Ça marche presque....

    Il faut juste remplacer les valeurs du formulaire pour le N°facture j'ai l'impression.
    J'ai donc essayé avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (
       SELECT Facture.N°Fact
       FROM Facture  INNER JOIN Paiements  ON Facture.N°Fact = Paiements.N°Fact
       WHERE Paiements.N°Fact = [Formulaire]![Paiements]![N°Facture]
       GROUP BY Facture.N°Fact, Facture.TotalHT
       HAVING Facture.TotalHT-Sum(Paiements.Montant)=0
    );

    Mais Access me demande toujours une valeur pour le Paiements.N°Fact.
    Et quand je lui donne la case ne se coche pas...
    Et aussi les factures ne s'affichent plus toutes dans ma liste déroulante... Surtout les non payées justement.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Sinon j'avais commencé à écrire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Sub Sum()
    Sum = 0
    Dim c As Range
    For Each c In x
    Sum = Sum + c
    Next
    End Sub

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub N°Facture_AfterUpdate()
    
    If Sum(Me.Montant) = (Me.TotalHT * 1.196) Then
    Me.Payée.Value = 1
    Else:
    Me.Payée.Value = 0
    End If
    
    End Sub
    Mais il y a une erreur à la ligne du If....

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 783
    Points : 58 195
    Points
    58 195
    Billets dans le blog
    42
    Par défaut
    Bonsoir Roxy,

    la requête UPDATE se charge de mettre à jour le champ [Payée] à Vrai pour TOUTES les factures payées. Pratique pour un traitement massif…

    Dans un formulaire unique on devrait pouvoir faire différemment en récupérant les infos de la facture en cours dans les contrôles.

    Comment se présente ton formulaire ? Dans ton formulaire Facture, est-ce que tu as un sous-formulaire pour les paiements ?

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Bonjour F-leb,

    Mon formulaire paiement contient le N° de paiement en numéro auto, des dates, un montant et le numéro de la facture en liste déroulante avec le nom du client et le montant TTC de la facture en plus.

    Et j'avais placé la requête dans l'évènement après MAJ de la liste déroulante.

    Je me demandais aussi si la valeur du N° de facture du formulaire pouvait être placée dans la jointure ou si c'était mieux dans un WHERE comme je l'avais fait...

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 783
    Points : 58 195
    Points
    58 195
    Billets dans le blog
    42
    Par défaut
    Bonjour,
    Citation Envoyé par Roxy_77
    Mon formulaire paiement contient le N° de paiement en numéro auto, des dates, un montant et le numéro de la facture en liste déroulante avec le nom du client et le montant TTC de la facture en plus.
    pas trop mon truc l’IHM, mais j’me soigne…

    j’ai tenté ça sur l’évènement avant MAJ du formulaire:
    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
    Private Sub Form_BeforeUpdate(Cancel As Integer)
     
    Dim MontantFacture As Currency
    Dim SommePaiements As Currency
     
    ' Column(2) si le montant de la facture est dans la 3è colonne de la liste déroulante ZlFacture
    MontantFacture = Me.ZlFacture.Column(2)
     
    ' Somme des paiements pour la facture en cours
    SommePaiements = Nz(DSum("[MontantPaiement]", "Paiement", "[idFacture]=" & Me.idFacture & _
            " AND [idPaiement]<>" & Me.idPaiement), 0)
     
    ' on rajoute le paiement en cours
    SommePaiements = SommePaiements + Nz(Me.MontantPaiement, 0)
     
     
    Select Case MontantFacture - SommePaiements
    Case Is > 0  'la facture n'est pas payée
            reponse = MsgBox("reste à payer: " & MontantFacture - SommePaiements, vbCritical)
            CurrentDb.Execute ("UPDATE Facture SET [Payé]=False WHERE idFacture=" & Me.idFacture)
     
    Case 0       ' la facture est payée
            reponse = MsgBox("c'est tout bon", vbInformation)
            CurrentDb.Execute ("UPDATE Facture SET [Payé]=True WHERE idFacture=" & Me.idFacture)
     
     
    Case Else    ' somme des paiements supérieure au montant de la facture
            reponse = MsgBox("dépassement du montant de la facture", vbCritical)
            Cancel = True
            Me.MontantPaiement.SetFocus
    End Select
     
     
    End Sub
    A tester, adapter, bidouiller et rebidouiller….

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Alors j'ai remplacé les noms de tables et de champs par les miens mais il me met une erreur 2766 : L'objet ne contient pas d'objet automation "FC0402"
    FC0402 c'est mon numéro de facture. Et je sais pas trop ce que ça veut dire...

    Je te renvoie mon code avec l'erreur en rouge...

    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
    Private Sub Form_AfterUpdate()
    Dim MontantFacture As Currency
    Dim SommePaiements As Currency
     
    ' Column(2) si le montant de la facture est dans la 3è colonne de la liste déroulante ZlFacture
    MontantFacture = Me.N°Facture.Column(2)
     
    ' Somme des paiements pour la facture en cours
    SommePaiements = Nz(DSum("[Montant]", "Paiements", "[N°Fact]=" & Me.N°Facture & _
            " AND [N°Paiement]<>" & Me.N°Paiement), 0)
     
    ' on rajoute le paiement en cours
    SommePaiements = SommePaiements + Nz(Me.Montant, 0)
     
     
    Select Case MontantFacture - SommePaiements
    Case Is > 0  'la facture n'est pas payée
            reponse = MsgBox("reste à payer: " & MontantFacture - SommePaiements, vbCritical)
            CurrentDb.Execute ("UPDATE Facture SET [Payé]=False WHERE N°Fact=" & Me.N°Facture)
     
    Case 0       ' la facture est payée
            reponse = MsgBox("c'est tout bon", vbInformation)
            CurrentDb.Execute ("UPDATE Facture SET [Payé]=True WHERE N°Fact=" & Me.N°Facture)
          
     
    Case Else    ' somme des paiements supérieure au montant de la facture
            reponse = MsgBox("dépassement du montant de la facture", vbCritical)
            Cancel = True
            Me.Montant.SetFocus
    End Select
    
    End Sub

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 783
    Points : 58 195
    Points
    58 195
    Billets dans le blog
    42
    Par défaut
    bonjour,

    si le N°Facture est de type texte, il faut remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... "[N°Fact]=" & Me.N°Facture & _
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... "[N°Fact]='" & Me.N°Facture & "'"_
    pour que la chaîne de caractères devienne : [N°Fact]='FC0402'

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Bonjour!!

    J'ai essayé de le mettre de cette façon mais VB a voulu que je supprime le _ car il disait que c'était un caractère incorrect...
    Moi j'aimerais bien savoir à quoi il sert, pour ma culture personnelle...

    Du coup le code donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SommePaiements = Nz(DSum("[Montant]", "Paiements", "[N°Fact]='" & Me.N°Facture & "' AND [N°Paiement]<>" & Me.N°Paiement), 0)
    Mais il met toujours une erreur : L'expression entrée comme paramètre de requête est à l'origine de l'erreur suivante : "FC0402"

    Merci de vous occuper de mon cas...

  11. #11
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2010
    Messages : 175
    Points : 193
    Points
    193
    Par défaut
    Citation Envoyé par Roxy_77 Voir le message
    Bonjour!!

    J'ai essayé de le mettre de cette façon mais VB a voulu que je supprime le _ car il disait que c'était un caractère incorrect...

    L'erreur est normale. Au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SommePaiements = Nz(DSum("[Montant]", "Paiements", "[N°Fact]=" & Me.N°Facture & _
            " AND [N°Paiement]<>" & Me.N°Paiement), 0)
    tu devrais mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SommePaiements = Nz(DSum("[Montant]", "Paiements", "[N°Fact]=" & Me.N°Facture _
           & " AND [N°Paiement]<>" & Me.N°Paiement), 0)

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Merci, en effet il n'y a plus d'erreur...

    Par contre la case ne se coche toujours pas toute seule... J'ai peur que ce soit un problème d'arrondis...

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/03/2010, 14h10
  2. Réponses: 13
    Dernier message: 07/02/2009, 11h44
  3. Réponses: 4
    Dernier message: 26/11/2007, 11h03
  4. Cocher automatiquement une case suivant une autre
    Par Noline dans le forum Access
    Réponses: 16
    Dernier message: 26/07/2006, 18h17
  5. cocher-décocher une case
    Par baillador dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 11/04/2006, 13h43

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