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. #21
    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.

    Tu peux envoyer un message à l'utilisateur demandant une confirmation avant de faire l'oppération de mise à jour.

    Ici un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if vbyes=msgbox("Voullez-vous vraiment mettre les données à jour ?", vbQuestion+vbYesNo+vbdefaultbutton2) then
        'Ici appeler le code de mise à jour.
      else
        call msgbox ("Les données n'ont pas été modifiées.", vbInformation)
    end if
    • vbQuestion : affiche un pint d'intérogation à côté du message.
    • vbYesNo : affiche les boutons [Oui] et [Non].
    • vbdefaultbutton2 : s'assure que la réponse par défaut est "Non".
      Il est prudent de toujours définir la réponse par défaut qui fait "le moins de dégâts" si l'utilisateur ne lit pas le message et appuis sur [Entrée] sans réfléchir.
    • vbInformation : affiche (i) à côté du message.


    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. #22
    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 marot, pour l'aide au niveau du code pour le message box.

    J'ai voulu insérer dans cette boîte de dialogue, des champs afin de voir, et de connaitre le numéro du chèque encaissé dans la question, pour effectuer une vérification supplémentaire.
    De plus, j'aimerai également qui me donne l'ensemble des enregistrements correspondant à ce chèque qui ne vont plus être en attente.
    Ceci dans le but de vérifier que le montant des enregistrements correspondent au montant du chèque, car une erreur de saisie peut toujours être présente.

    Par contre, mon code est déjà mauvais à partir de la déclaration des champs de la variable.
    J'ai essayé de faire Set Variable = (Table.Champs), et Set Variable = Db.OpenRecordset(Table.Champs). Mais aucun des deux fonctionne.

    Ci-joint mon code paramétré :
    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
    Public Sub UpdateX2()
     
        'Déclaration des variables
        Dim Db As DAO.Database
        Dim qdf As QueryDef
        Dim Chq As String
        Dim Dte As String
        Dim Lbl As String
        Dim Vlr As String
     
        ' excecution du code
        Set Db = CurrentDb
        Set IntA = Db.OpenRecordset(Cheques.NumChq) 'Déclare le numéro du chèque
        Set IntB = Db.OpenRecordset(Mouvements.DateMvt) 'Déclare la date du mouvement
        Set IntC = Db.OpenRecordset(Mouvements.LibelleMvt) 'Déclare le libellé du mouvement
        Set IntD = Db.OpenRecordset(Mouvements.MontantMvt) 'Déclare le montant du mouvement
     
        'MsgBox Oui ou Non par défaut
        If vbYes = MsgBox("- le & IntB & correspondant & IntC & dun montant de & IntD & .", _
        vbQuestion + vbYesNo + vbDefaultButton2, _
        "Voulez-vous vraiment mettre les données à jour du chèque & IntA & ?") _
        Then
        'Appeler le code de mise à jour si la réponse est oui.
        '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;")
         Else
     
        'Si la réponse est non
        Call MsgBox("Les données n'ont pas été modifiées.", vbInformation)
     
        End If
     
     
        Db.Close
     
     
    End Sub
    Je vous remercie une nouvelle fois pour votre aide, et votre patience.
    Je commence à comprendre petit à petit le VBA grâce à vos conseils et les tutoriels du site.

    Bonne soirée à vous.

    Bien cordialement,
    Benjamin.

  3. #23
    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.

    La syntaxe pour un recordset est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim r as dao.recordset:set r=db.Openrecorset("UneSource") 'Une source peut être une le nom d'une table, d'une requête ou du code SQL.
    Un recorset contient tous les champs de sa source.

    Pour accéder au champ d'un recordset on peut faire par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UneVariable=r![NomUnChamp]
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UneVariable=r.fields("NomUnChamp")
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UneVariable=r.fields(UneAutreVariable)
    Le set est réservé aux objets (ex les recordset, les database).
    Pour les variables de type ordinaire (ex : double, integer, long, single, date, boolean, string) il ne faut pas l'utiliser.

    Pour composer des messages à partir de variables ou de morceaux de chaîne, il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Une texte " & UneVariable & " un autre texte " & UneAutreVariable
    et pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Une texte & UneVariable & un autre texte & UneAutreVariable"
    comme tu l'as fait. Les " sont les délimiteurs de texte et tout ce qui est entre eux est considéré comme une constante qui ne sera pas interprété par 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.

  4. #24
    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,

    Désormais je comprends comment on doit utiliser les ", et ceci apporte beaucoup de choses dans le codage.
    Mais pourquoi on utilise les " lorsque on exécute un SQL comme pour UPDATE (utilisé dans mon code) car indirectement c'est un code ?

    J'ai essayé de mettre en place vos explications pour le recordset.

    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
    Public Sub UpdateX2()
     
        'Déclaration des variables
        Dim Db As DAO.Database
        Dim qdf As QueryDef
        Dim r As DAO.Recordset
     
        ' excecution du code
        Set Db = CurrentDb
        Set r = Db.Openrecorset("Mouvements") 'recorset contient tous les champs de sa source.
     
        IntA = r![NumChq] 'Renvoi le numéro du chèque
        IntB = r![DateMvt] 'Renvoi la date du mouvement
        IntC = r![LibelleMvt] 'Renvoi le libellé du mouvement
        IntD = r![MontantMvt] 'Renvoi le montant du mouvement
     
        'MsgBox Oui ou Non par défaut
        If vbYes = MsgBox("- le " & IntB & "correspondant " & IntC & "d'un montant de " & IntD & ". ", _
        vbQuestion + vbYesNo + vbDefaultButton2, _
        "Voulez-vous vraiment mettre les données à jour du chèque" & IntA & "?") _
        Then
        'Appeler le code de mise à jour si la réponse est oui.
        '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;")
         Else
     
        'Si la réponse est non
        Call MsgBox("Les données n'ont pas été modifiées.", vbInformation)
     
        End If
     
     
        Db.Close
     
     
    End Sub
    Mais j'ai une erreur de compilation sur mon open d'après Access :
    Nom : Message d'erreur Recordset.PNG
Affichages : 291
Taille : 43,0 Ko

    Je ne vois pas où j'ai fais d'erreur, car le nom de la table est correcte, et mise entre parenthèse.
    Peut-être faudrait il mettre un "r.close" .

    Encore pour votre aide.

    Bonne journée à vous.

    Bien cordialement,
    Benjamin.

  5. #25
    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 faute de frappe dans mon code. C'est OpenRecordset et non OpenRecorset, désolé.

    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. #26
    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
    Ok merci marot.

    Par contre, dans le codage effectué afin d'afficher les informations relatives au chèque sélectionné, la boîte de dialogue affiche la première ligne de ma table chèque et la première ligne de ma table mouvements.
    Comment peut-on faire afin d'avoir le numéro du chèque qui correspond à la ligne que l'on coche dans le titre, et en texte, toutes les lignes correspondant au chèque que l'on vient de cocher s'il vous plaît.

    Mon code est le suivant :
    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
    Public Sub UpdateX2()
     
        'Déclaration des variables
        Dim Db As DAO.Database
        Dim r As DAO.Recordset
     
        ' excecution du code
        Set Db = CurrentDb
        Set r = Db.OpenRecordset("Mouvements") 'recorset contient tous les champs de sa source.
     
        IntA = r![NumChq] 'Renvoi le numéro du chèque
        IntB = r![DateMvt] 'Renvoi la date du mouvement
        IntC = r![LibelleMvt] 'Renvoi le libellé du mouvement
        IntD = r![MontantMvt] 'Renvoi le montant du mouvement
     
        'MsgBox Oui ou Non par défaut
        If vbYes = MsgBox("- le " & IntB & " correspondant " & IntC & " d'un montant de " & IntD & "€ . ", _
        vbQuestion + vbYesNo + vbDefaultButton2, _
        "Voulez-vous mettre les données à jour du chèque " & IntA & " ?") _
        Then
        'Appeler le code de mise à jour si la réponse est oui.
        '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;")
         Else
     
        'Si la réponse est non
        Call MsgBox("Les données n'ont pas été modifiées.", vbInformation)
     
        End If
        Db.Close
    End Sub
    Une nouvelle fois merci pour votre aide.

    Bien cordialement,
    Benjamin.

  7. #27
    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.

    Peux-tu mettre un exemple manuel de ce que tu veux faire ?

    De ce que je comprends tu as une tables des chèques et une table des factures payées par ces chèques.
    Tu entres le montant du chèque et tu indiques les factures qu'il paye.
    Tu veux ensuite vérifier si le total des factures payées correspond au montant du chèque.
    Est-ce bien cela ?

    Si tu pouvais poster ton modèle de données (tes tables et leurs structures, du moins les tables qui concernent ton problème courant), cela aiderai aussi.

    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. #28
    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
    Bonjour.

    Peux-tu mettre un exemple manuel de ce que tu veux faire ?

    De ce que je comprends tu as une tables des chèques et une table des factures payées par ces chèques.
    Tu entres le montant du chèque et tu indiques les factures qu'il paye.
    Tu veux ensuite vérifier si le total des factures payées correspond au montant du chèque.
    Est-ce bien cela ?

    Si tu pouvais poster ton modèle de données (tes tables et leurs structures, du moins les tables qui concernent ton problème courant), cela aiderai aussi.

    A+
    Je vais poser à plan mon idée afin de mieux partager mon problème.

    Tout d'abord voici mes relations :
    Nom : Relation BDD.PNG
Affichages : 252
Taille : 27,6 Ko

    La structure des deux tables concernées :
    - Table"Cheques" (ici on enregistre les chèques émis (CHQXXX) et les chèques reçus (CHQEXTXXX) :
    Nom : Table cheques.PNG
Affichages : 249
Taille : 12,5 Ko

    - Table "Mouvements" (Ici on enregistre une opération) :
    Nom : table Mouvement.PNG
Affichages : 239
Taille : 13,4 Ko


    Le code mis en place permet depuis le formulaire de mettre à jour les enregistrements correspondants aux chèques (Ci-joint une capture d'écran pour mieux comprendre) :
    - Dans la table chèque nous retrouvons tous les chèques émis ou reçus :
    Nom : Exemple table chèque.PNG
Affichages : 202
Taille : 20,8 Ko

    - Dans la table mouvements, si le paiement est effectué par chèque nous retrouvons chaque ligne d'enregistrement correspondant à ce chèque, et par défaut si le chèque n'est pas encore encaissé le mouvement est coché en attente afin qu'il n'impacte pas le solde bancaire :
    Nom : Exemple table MOUVEMENTS.PNG
Affichages : 242
Taille : 35,6 Ko

    - On retrouve dans le formulaire chèque que les chèques non encaissé, car le but du formulaire est de pointer les chèques :
    Nom : Formulaire chèque.PNG
Affichages : 238
Taille : 15,8 Ko

    - On retrouve dans le formulaire mouvement en attente essentiellement les chèques non encaissés ou les espèces non remis en banques :
    Nom : forumulaire mvt en attente.PNG
Affichages : 233
Taille : 26,2 Ko

    Donc le code suivant nous a permis de mettre à jour automatique les mouvements en attente depuis le formulaire chèques.
    Par exemple lorsque je vais cocher la casse chèque encaissé pour le chèque CHQ0013202 les mouvements 4, 5, 6 et 7 ne seront plus en mouvement en attente car ils seront décochés de la case en attente.
    Je pense que vous comprenez pourquoi une automatisation facilite cette opération auparavant manuelle.

    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
    Public Sub UpdateX2()
     
        'Déclaration des variables
        Dim Db As DAO.Database
        Dim r As DAO.Recordset
     
        ' excecution du code
        Set Db = CurrentDb
        Set r = Db.OpenRecordset("Mouvements") 'recorset contient tous les champs de sa source.
     
        IntA = r![NumChq] 'Renvoi le numéro du chèque
        IntB = r![DateMvt] 'Renvoi la date du mouvement
        IntC = r![LibelleMvt] 'Renvoi le libellé du mouvement
        IntD = r![MontantMvt] 'Renvoi le montant du mouvement
     
        'MsgBox Oui ou Non par défaut
        If vbYes = MsgBox("- le " & IntB & " correspondant " & IntC & " d'un montant de " & IntD & "€ . ", _
        vbQuestion + vbYesNo + vbDefaultButton2, _
        "Voulez-vous mettre les données à jour du chèque " & IntA & " ?") _
        Then
        'Appeler le code de mise à jour si la réponse est oui.
        '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;")
         Else
     
        'Si la réponse est non
        Call MsgBox("Les données n'ont pas été modifiées.", vbInformation)
     
        End If
        Db.Close
    End Sub

    Après cette automatisation, je souhaiterais que via la boite de dialogue je puisse contrôler les mouvements qui vont être décochés des mouvements en attente, afin de vérifier que je me suis pas trompé lors de la saisie des enregistrements, par exemple ici l'inversement des opérations en mettant le numéro chèque CHQ0013203 au lieu de CHQ0013202, le montant du chèque ne correspondent à la somme des lignes d'enregistrement dans ce cas-là.

    Donc je souhaite que la boite dialogue m'affiche le nom du chèque encaissé dans le titre, et en zone de message le détail des opérations dans la table Mouvements.

    Actuellement j'ai ceci quand je coche la case chèque encaissé du CHQ0013202 :
    Nom : Boite de dialogue chèque.PNG
Affichages : 245
Taille : 36,1 Ko

    Et on s'aperçoit qui remet la première ligne de chaque table.

    Voici ce que souhaiterait obtenir à chaque fois lorsque j'encaisse le chèque :

    " Titre :
    Voulez-vous mettre les données à jour du chèque CHQ0013202 ?

    Zone de message :
    - le 01/01/2018 correspondant Paiement 4 d'un montant de 50€.
    - le 01/01/2018 correspondant Paiement 5 d'un montant de 50€.
    - le 01/01/2018 correspondant Paiement 6 d'un montant de 50€.
    - le 01/01/2018 correspondant Paiement 7 d'un montant de 50€.

    Le montant du chèque cadre au total des mouvements. (ceci est optionnel car il faut que je travaille sur le code pour l'implanter dans le code, afin qu'il vérifie que le champ montant de la table chèque correspondant à l'ensemble des champs ci-dessous)

    Bouton de dialogue :
    Oui Non "


    J'espère avoir été assez explicatif et assez clair dans la demande que je souhaite et la présentation de la base.
    Je reste à ta disposition pour toutes question.

    Encore merci pour ton aide.

    Bien cordialement,
    Benjamin.

  9. #29
    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.

    Utiliser un msgbox dans ce cas n'est pas la bonne solution.
    Le nombre de lignes affichables est limité et s'il sature Access n'affiche que le début du message sans même signaler qu'il y a un problème.
    La solution qui me semble la plus simple est de faire :
    1. une requête qui présentera liste des chèques
    2. un sous-formulaire pour l'afficher.
    3. un formulaire qui a 2 boutons Oui et Non et qui contient le sous-formulaire.


    En résumé (et en français) cela donne :

    1. L'utilisateur signale qu'il a fini sa saisie.
    2. Le système affiche, via un formulaire, la liste des chèques.
    3. L'utilisateur révise la liste des chèques affichés par le sous-formulaire.
    4. L'utilisateur confirme ou infirme la saisie.
    5. Si L'utilisateur confirme, le système mets à jour les données.


    Est-ce que cela te conviens ?

    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. #30
    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
    Bonjour.

    Utiliser un msgbox dans ce cas n'est pas la bonne solution.
    Le nombre de lignes affichables est limité et s'il sature Access n'affiche que le début du message sans même signaler qu'il y a un problème.
    La solution qui me semble la plus simple est de faire :
    1. une requête qui présentera liste des chèques
    2. un sous-formulaire pour l'afficher.
    3. un formulaire qui a 2 boutons Oui et Non et qui contient le sous-formulaire.


    En résumé (et en français) cela donne :

    1. L'utilisateur signale qu'il a fini sa saisie.
    2. Le système affiche, via un formulaire, la liste des chèques.
    3. L'utilisateur révise la liste des chèques affichés par le sous-formulaire.
    4. L'utilisateur confirme ou infirme la saisie.
    5. Si L'utilisateur confirme, le système mets à jour les données.


    Est-ce que cela te conviens ?

    A+

    Ceci me semble identique à la proposition mais sous feuille de données.
    Le temps que l'automatisation me permet d'effectuer une vérification avant d'accepter ceci me semble pas mal.
    Donc je veux bien essayer cette proposition plus qu'intéressantes.

    Encore Merci de ton aide marot.

    Bien cordialement,
    Benjamin.

  11. #31
    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
    Ok,

    1. Il faut créer ta requête qui va afficher les chèques.
      Je pense que cela doit être :
      Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      select Cheques.*
      form cheques INNER JOIN (Mouvements) ON (Cheques.NumChq)=(Mouvements.NumChq)
      WHERE Cheques.ChqEncaisse=True;
      Valide le avec les résultats et ajuste au besoin.
    2. Il faut créer un formulaire basé sur cette requête (sfrmVerifCheque).
    3. Il faut créer un formulaire vierge.
      Y ajouter les boutons [Oui] et [Non] ainsi qu'un texte explicatif (une étiquette) qui dit quelque chose du genre "Montant correct ?".
      Y ajouter le sous-formulaire sfrmVerifCheque.
    4. Dans la procédure événementielle associée à l'événement sur clic du bouton oui, mettre le code de MAJ.
      et ajouter la ligne :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      docmd.close acForm, me.name 'Ferme le formulaire courant
    5. Dans la procédure événementielle associée à l'événement sur clic du bouton Non, mettre le code suivant.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      docmd.close acForm, me.name 'Ferme le formulaire courant


    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.

  12. #32
    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
    Ok,

    1. Il faut créer ta requête qui va afficher les chèques.
      Je pense que cela doit être :
      Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      select Cheques.*
      form cheques INNER JOIN (Mouvements) ON (Cheques.NumChq)=(Mouvements.NumChq)
      WHERE Cheques.ChqEncaisse=True;
      Valide le avec les résultats et ajuste au besoin.
    2. Il faut créer un formulaire basé sur cette requête (sfrmVerifCheque).
    3. Il faut créer un formulaire vierge.
      Y ajouter les boutons [Oui] et [Non] ainsi qu'un texte explicatif (une étiquette) qui dit quelque chose du genre "Montant correct ?".
      Y ajouter le sous-formulaire sfrmVerifCheque.
    4. Dans la procédure événementielle associée à l'événement sur clic du bouton oui, mettre le code de MAJ.
      et ajouter la ligne :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      docmd.close acForm, me.name 'Ferme le formulaire courant
    5. Dans la procédure événementielle associée à l'événement sur clic du bouton Non, mettre le code suivant.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      docmd.close acForm, me.name 'Ferme le formulaire courant


    A+
    Merci marot, mais je n'aime pas trop le rendu que ceci peut donner.

    Du coup, j'ai pensais à intégrer seulement le texte suivant dans ma boite de dialogue :
    "" Titre :
    Voulez-vous mettre les données à jour du chèque XXX ?

    Zone de message :
    Le montant du chèque est identique au total des mouvements.

    Bouton de dialogue :
    Oui Non "

    Il faudrait que l'on arrive à trouver un code permettant de vérifier que le montant du CHQXX1 qui correspond au clic, soit égal au mouvement de la table mouvements corresponds à ce chèque.

    Existe-il un code qui reprend le montant d'un champs sur la ligne que l'on a effectué un click ?

    Encore merci pour l'aide.

    Bien cordialement,
    Benjamin.

  13. #33
    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 existe divers moyens de faire un total et de vérifier si il est égale à un autre chiffre.
    Je ne vois pas l'intérêt de demander à l'utilisateur de vérifier si le total est exact, la machine peut le faire pour lui et signaler si il n'est pas exact.
    Quelle est la valeur ajoutée d'une confirmation manuelle si tu n'affiches pas le détail de sa composition ?

    À vrai, personnellement j'afficherai le total des chèques dans l'écran de saisie au moment de la sélection.
    L'utilisateur verrai immédiatement si cela correspond ou pas.
    Et en utilisant la mise en forme conditionnelle, le total pourrait passer au vert en cas d'égalité et être affiché en rouge sinon.

    Pour info, pour les totaux on peut utiliser :
    1. Une requête de regroupement pour les totaux et une requête de sélection pour la validation de l'égalité.
    2. ou un champ calculé utilisant DCount (somDom en français) qui va faire le total.
    3. ou du code VBA mais ça c'est vraiment en dernier recours car le VBA est généralement moins performant que les requêtes ou les fonctions intégrées.


    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.

  14. #34
    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,

    Citation Envoyé par marot_r Voir le message
    Bonjour.

    Il existe divers moyens de faire un total et de vérifier si il est égale à un autre chiffre.
    Je ne vois pas l'intérêt de demander à l'utilisateur de vérifier si le total est exact, la machine peut le faire pour lui et signaler si il n'est pas exact.
    Quelle est la valeur ajoutée d'une confirmation manuelle si tu n'affiches pas le détail de sa composition ?
    Je suis d'accord avec toi marot, je ne souhaite plus effectuer cette opération manuellement.
    Mais je souhaite que la base de données, l'effectue tout seul, c'est pour çà que je souhaite qu'il vérifie les deux montants.


    Citation Envoyé par marot_r Voir le message
    À vrai, personnellement j'afficherai le total des chèques dans l'écran de saisie au moment de la sélection.
    L'utilisateur verrai immédiatement si cela correspond ou pas.
    Et en utilisant la mise en forme conditionnelle, le total pourrait passer au vert en cas d'égalité et être affiché en rouge sinon.

    Pour info, pour les totaux on peut utiliser :
    1. Une requête de regroupement pour les totaux et une requête de sélection pour la validation de l'égalité.
    2. ou un champ calculé utilisant DCount (somDom en français) qui va faire le total.
    3. ou du code VBA mais ça c'est vraiment en dernier recours car le VBA est généralement moins performant que les requêtes ou les fonctions intégrées.


    A+
    Par contre est-il possible de faire un champ calculé entre deux tables ?

    Moi je voulais passer par un code VBA pour mettre une condition, qui est la suivante :
    " Si le chéque commence par CHQEXT* alors Montant du chèque click = Total des mouvements correspondant au chèque click
    Si = 0 alors Msgbox = Le montant du chèque est identique au total des mouvements.
    Si >O< alors Msgbox = Le montant du chèque ne correspond pas au total des mouvements
    Si le chéque commence par CHQ* alors Montant du chèque click = -(Total des mouvements correspondant au chèque click)
    Si = 0 alors Msgbox = Le montant du chèque est identique au total des mouvements.
    Si >O< alors Msgbox = Le montant du chèque ne correspond pas au total des mouvements"

    Mais si en passant par ton explication il est possible d'obtenir ceci plus ou moins c'est-à-dire savoir si le montant du chèque correspond ou non au total des mouvements.

    Encore merci pour les explications.

    Bien cordialement,
    Benjamin.

  15. #35
    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.

    1. Vas- faire la validation d'un chèque puis paser à la saisie d'un autre chèque ?
    2. Ou vas-tu saisir tous les chèques qui t'intéressent puis faire leur validations "en groupe" ?


    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.

  16. #36
    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
    Bonjour.

    1. Vas- faire la validation d'un chèque puis paser à la saisie d'un autre chèque ?
    2. Ou vas-tu saisir tous les chèques qui t'intéressent puis faire leur validations "en groupe" ?


    A+
    Disons les deux cas car je fais par remise de chèques.
    Donc quand ce sont des chèques extérieurs c'est-à-dire reçus, j'encaisse tous les chèques en groupe afin de correspondre à la remise de chèque effectué sur le compte bancaire.
    Mais lorsque c'est un chèque émis, j'encaisse qu'un chèque à la fois car sur le compte bancaire on voit l'encaissement des chèques émis ligne par ligne.

    Je reste à ta disposition si tu veux plus d'explications ou d'éclaircissement sur le sujet.
    Merci pour ta coopération sur ce problème.

    Bien cordialement,
    Benjamin.

  17. #37
    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.

    Mais lorsque c'est un chèque émis, j'encaisse qu'un chèque à la fois car sur le compte bancaire on voit l'encaissement des chèques émis ligne par ligne.
    Est-ce qu'on peut considéré que pour les chèques émis ce sont des lots de 1 chèque ?
    Cela éviterai d'avoir 2 mécanismes séparés.
    Si on est capable de gérer X chèques d'un coup on pourrait le faire de même si x=1.
    On gérerai tous les chèques "sélectionnés" et l'utilisateur s'astreindrai à n'en sélectionner qu'un seul.

    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.

  18. #38
    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
    Bonjour.



    Est-ce qu'on peut considéré que pour les chèques émis ce sont des lots de 1 chèque ?
    Cela éviterai d'avoir 2 mécanismes séparés.
    Si on est capable de gérer X chèques d'un coup on pourrait le faire de même si x=1.
    On gérerai tous les chèques "sélectionnés" et l'utilisateur s'astreindrai à n'en sélectionner qu'un seul.

    A+
    Marot, à chaque fois un chèque de la table peut correspondre à une ou plusieurs lignes d'enregistrements de la table mouvements.

    J'ai l'impression que l'on se comprends pas sur le code que je souhaiterait mettre en oeuvre.
    Je cherche à afficher dans la boîte de dialogue la somme du montant des lignes d'enregistrements de la table mouvements en fonction du chèque encaissé via le clique sur la case chèque encaissé.

    Bien cordialement,
    Benjamin.

  19. #39
    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 l'impression que l'on se comprends pas sur le code que je souhaiterait mettre en oeuvre.
    Je cherche à afficher dans la boîte de dialogue la somme du montant des lignes d'enregistrements de la table mouvements en fonction du chèque encaissé via le clique sur la case chèque encaissé.
    Non en effet je semble manquer quelque chose.

    Je vais répondre stricto-sensus à ta demande en espérant que ce sera bon.
    Ton code devrait ressembler à cela (à adapter à ta réalité).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim MontantChequeEncaisse as double: MontantChequeEncaisse=DFirst("MontantChq", "Cheques", "NumChq=""" & TonNumChqEncaisse & """")
    Dim MontantMouvement as double: MontantMouvement=DSum("MontantMvt", "Mouvements", "NumChq=""" & TonNumChqEncaisse & """")
     
    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
    Ce n'est sans doute pas la solution optinmale mais c'est une bonne solution.

    Note que tu pourrais avoir des petits problèmes avec les arrondis. C'est intrinsect à la façon dont les nombres sont représentés dans les ordinateurs.
    Si c'est le cas tu pourrais remplacer montantMouvement<>MontantChequeEncaisse par abs(montantMouvement-MontantChequeEncaisse)<0.001.

    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.

  20. #40
    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
    Marot merci pour la formule, mais je ne peux pas avancer que comment définir la variable
    En sachant que le numéro de chèque correspond au numéro du chèque que l'on clique.

    Repassons seulement par la boîte de dialogue depuis le début.

    Le code initial avec la boîte de dialogue qui s'affiche pour confirmer la validation de l'encaissement du paiement :
    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
    Private Sub ChqEncaisse_Click()
     
        Call UpdateX 'Correspond à la mise à jour des mouvements en attente une fois le chèque encaissé
     
    End Sub
     
     
    Public Sub UpdateX()
     
        'Déclaration des variables
        Dim Db As dao.Database
        Dim r As dao.Recordset
     
        ' 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
     
     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;")
     
         Db.Close
     
      Else
     
        Call MsgBox("Les données n'ont pas été modifiées.", vbInformation)
     
     End If
     
    End Sub
    La boîte de dialogue doit me demander si je veux bien mettre à jour le numéro de chèque que l'on va cocher encaissé à l'instant.

    Voici ce que donne la boîte de dialogue :
    Nom : Message de la boite de dialogue.JPG
Affichages : 220
Taille : 64,1 Ko

    On s'aperçoit que le code VBA ne renvoi pas le bon numéro de chèque dans la boite de dialogue.
    Il me renvoie le numéro de chèque correspondant à la première ligne de ma table chèque.

    Ce que je cherche actuellement, c'est d'arriver de renvoyer le numéro de chèque correspondant à la ligne cochée "ChqEncaisse".

    Pourriez-vous me dire comment effectuer ceci s'il vous plaît.
    Pour ma part, j'avais pensé à écrire une requête SQL dans le "Private Sub ChqEncaisse_Click()" qui affiche seulement le numéro de chèque.
    Et ensuite définir ce SQL comme une variable dans le "Public Sub UpdateX()".

    Bien cordialement,
    Benjamin.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 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