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 :

positionner les focus en fonction des événements ? [AC-2003]


Sujet :

IHM

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 84
    Points : 35
    Points
    35
    Par défaut positionner les focus en fonction des événements ?
    Bonjour à tous (encore moi )

    J'ai un petit souci de compréhension en ce qui concerne les focus. Voila :

    J'ai un formulaire qui contient entre autre un champ calculé "Total", ainsi qu'un sous formulaire. "Total" représente la somme des valeurs de la colonne "SousTotal" du sous formulaire (lui même calculé à partir de deux autres champs du sous formulaire : Pu * quantité).
    Le problème est que le champ Total ne s'enregistre dans la base de données que lorqu'il reçoit le focus (ou le curseur ? je ne saisis pas la différence).

    J'ai donc voulu jouer avec les "SetFocus" pour l'actualiser à chaque nouvel enregistrement dans le sous formulaire. Pour cela, j'ai écrit dans l'événement Quantité_LostFocus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form_F_FormPrinc.Total.SetFocus
    puis, pour passer à l'enregistrement suivant dans le sous formulaire quand le total est enregistré, j'ai écrit dans l'événement "Total_GotFocus" (je n'ai pas trouvé comment donner le focus directement à un champ en particulier).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.SF_SousForm.SetFocus
    en ajustant ensuite le sous formulaire à l'aide du code, dans "Form_GotFocus"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.ChampQuiMinteresse.SetFocus
    Mais tout cela ne fonctionne pas. Quand "Quantité" perd le focus, j'ai une erreur qui dit "Impossible d'activer le contrôle SF_SousForm" à la ligne "Me.SF_SousForm.SetFocus".

    J'ai essayé avec différents événements pour le Total, certains (comme Enter) me marquent "impossible d'activer le contrôle Total" à la ligne "Form_F_FormPrinc.Total.SetFocus", d'autres (comme AfterUpdate) fonctionnent mais avec un petit défaut : quand on appuie sur entrée pour valider la quantité, il passe automatique sur Total, puis, avec un nouvel appui sur entrée, passe à un nouvel enregistrement dans le sous formulaire. C'est exactement ce qu'il me faudrait, au détail près que j'aimerai ne pas avoir à cliquer sur entrée quand le focus est sur Total.
    En fait, je voudrai que l'utilisateur ne se rende pas compte que le focus est passé sur le formulaire avant de retourner sur le sous formulaire...

    Comment procéder ?


    Merci d'avance.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,
    en fait, la somme totale du produit PU*Quantité ne peut se faire tant que le champ PU ou Quantité a le focus. La somme se fait dès qu'il y a confirmation de la ligne entière dans le sous-formulaire.
    Pour être clair, la somme se fait sur les valeurs contenues dans la table et non les valeurs affichées à l'écran,tant qu'un enregistrement de la table est en mode édition (un des champs de la ligne du sous-formulaire a le focus (le focus représente le contrôle actif, celui qui reçoit les entrées du clavier) les informations de la ligne ne sont pas inscrites dans la table, et donc la somme n'est pas mise à jour.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 84
    Points : 35
    Points
    35
    Par défaut
    Précisemment.
    Tout mon problème réside dans le fait qu'après confirmation d'une ligne du sous formulaire, donc quand il passe à la ligne suivante (quand on enlève mes bidouillages dans le code, évidemment ^^) le montant ne se met pas à jour dans la base de données. C'est donc anormal ?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Ce qui est valable pour le sous-formulaire l'est aussi pour le formulaire principal. La source du formulaire principal ne peut être mise à jour que si il y a eu édition de l'enregistrement, ou si tu le stipules par code.
    Par exemple, en utilisant les événement AfterUpdate ou AfterInsert du sous-formulaire, dans lesquels tu précises que le champ Total du formulaire principal doit aussi être mis à jour.

    Ex: dans le code du sous-formulaire. Pour l'exemple une table commande liée à une table CommandeDetails par le champ idcommande. Dans le formulaire principal, je souhaite que le contrôle TxtTotal affiche le montant total des produits commandés où Total=Somme(Pu * quantite). Le contrôle TxtTotal a pour source le champ Total de la table Commandes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_AfterUpdate()
     Form.Parent.Controls("TxtTotal").Value=DSum("Pu*quantite","CommandeDetails","idcommande=" & idCommande)
    End sub

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 84
    Points : 35
    Points
    35
    Par défaut
    La source du formulaire principal ne peut être mise à jour que si il y a eu édition de l'enregistrement, ou si tu le stipules par code.

    C'est ce que je m'étais dit, oui, et c'est pourquoi j'avais écrit, sans résultat, dans Quantité_AfterUpdate du sous formulaire (le Pu se remplissant de façon automatique) ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Dim db As DAO.Database
        Dim rst As DAO.Recordset
     
        Set db = CurrentDb()
        Set rst = db.OpenRecordset("SELECT * FROM [T_Commande] WHERE [idCommandeCoteForm] = '" & Forms!F_Commande.idCommandeCoteForm & "'")
     
        rst.Edit
            rst("Total") = Form_F_Commande.Total.Value
        rst.Update
     
        rst.Close
        Set rst = Nothing
        Set db = Nothing
    (car même s'il ne s'enregistre pas dans la base de données, le total est mis à jour dans les champs quand Quantité perd le focus)

    Je ne comprends pas très bien pourquoi il ne fonctionne pas.



    J'ai essayé ton code, mais j'ai une erreur (et une petite question : dans mon cas les "idCommande" ne portent pas le même nom pour le formulaire et le sous formulaire, pourrais-tu préciser duquel il s'agit à chaque fois ?). Dans tous les cas, j'ai de toute façon une erreur, soit "incompatibilité de type", soit "opérateur absent dans l'expression 'idCommandeCoteSousForm = '"

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour il s'agit du champ du sous-formulaire
    dans ton cas, tu indiques que le champ idCommandeCoteSsForm est de type texte cela doit donner ceci :
    Pour l'exemple, j'appelle le contrôle du formulaire principal qui affiche le total TxtTotal, la table qui contient le détail de la commande CommandeDetails, le champ Prix unitaire Pu et le champ quantité quantite (sans accent), et j'utilise l'événement AfterUpdate du sous-formulaire. Je modifie la valeur du contrôle TxtTotal qui a pour source le champ Total de la table Commandes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_AfterUpdate()
     Form.Parent.Controls("TxtTotal").Value=DSum("Pu*quantite","CommandeDetails","idcommandeCoteSsForm='"  & [idCommandeCoteSsForm] & "'")
    End sub

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 84
    Points : 35
    Points
    35
    Par défaut
    C'est pourtant bien ce que j'ai fait é_è
    "type de données incompatible dans l'expression du critère" . Les noms des champs correspondent bien, j'ai vérifié.


    Mais j'y pense, c'est sûrement ça qui fait buguer : mon champ Pu ne fait pas partie de la table CommandeDetails, mon sous formulaire (construit à partir d'une requête) va le chercher dans ma table T_Article, par correspondance avec le numéro d'article... =/

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Tu as raison pour le champ PU; mais pour le champ idCommande...
    dans ta table il est de quel type numérique ou texte ?

    Le champ PU est présent dans ma table CommandeDetails, car le prix des produits est susceptible d'être modifié, par contre le prix lors de l'achat est fixe; il faut donc écrire en dur dans la table le prix à l'unité du produit lors de la saisie de la commande. Cela permet également de vérifier la cohérence entre les prix à l'achat (ou la vente) et le total de la commande.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 84
    Points : 35
    Points
    35
    Par défaut
    Mon champ idCommande est bien un champ texte.


    Il faudrait donc ajouter un champ à ma table CommandeDetails ? Mais dans ce cas, comment lui indiquer de prendre, à l'affichage, les valeurs de la table Article, mais d'enregistrer les données dans la table CommandeDetails ?

    J'ai pensé (pour changer ) à un recordSet avec une requête SQL , mais je suis alors obligée (du moins je crois) de faire intervenir mon idCommandeDetail. Or celui ci étant un bête numéro automatique, j'aimerai essayer de ne pas l'afficher dans mon sous formulaire. (J'ai tout de même essayé tout ça, avec le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.idCommandeDetail.Visible = False
    dans le form_Load du sous formulaire, mais ça n'a eu aucun effet..)

  10. #10
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Oui, personnellement j'utilise soit une liste déroulante pour afficher la liste des produits ou un formulaire (popup) à part qui affiche les produits du catalogue du fournisseur choisi via un contrôle Treeview et un contrôle ListView.

    Avec la liste déroulante :
    Le contenu de la liste vient de la table Articles, et le contrôle source est le champ idArtcle de la table CommandeDetails.
    J'ai un contrôle zone de texte qui a pour source le champ Pu de la table CommandeDetails, la propriété Activé à Non et la propriété Verrouillé à Oui, et dans l'événement AfterUpdate de la liste des articles j'affecte à ce contrôle la valeur contenue dans la colonne du contrôle LstArticles correspondant au champ Pu de la table Articles.

    Ex: J'appelle LstArticles la zone de liste déroulante du sous-formulaire commandedetails, TxtPU le contrôle recevant le prix à l'unité de l'article choisie, et TxtQte le contrôle permettant la saisie de la quantité commandée de l'article.

    Contrôle LstArticles :
    Nbr Colonnes : 3
    Largeur Colonne : 0;5;0
    Contrôle Source : idArticle ou Désignation Article
    Colonne liée : 1 'ou 2 si contrôle source est désignation
    Contenu : SELECT idArticle, Designation, PU FROM Articles ORDER BY Designation WHERE idFournisseur=..... 'Si il y a un tri à faire sur le fournisseur
    Sur MAJ : [Procédure événementielle]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub LstArticle_AfterUpdate()
     TxtPu.Value=LstArticle.Column(2)
    End Sub
    -------------------------
    Contrôle TxtPu :
    Activé : Non
    Verrouillé : Oui 'Le contrôle n'est pas actif mais n'apparaît pas grisé
    Contrôle Source : PU
    -------------------------
    Contrôle TxtQte :
    Contrôle Source : Quantité
    Sur Touche Activé : [Procédure événementielle]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private sub TxtQte_KeyPress(KeyAscii as Integer)
     'Si la touche appuyé ne renvoie pas un des 10 chiffres ou le backspace alors ne pas en tenir compte
    'Seules les valeurs numérques sont prises en compte
     If Keyascii<>8 And (KeyAscii<48 Or KeyAscii>57) Then Keyascii=0
    End sub

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 84
    Points : 35
    Points
    35
    Par défaut
    Yeah

    Je crois bien que ça fonctionne (du moins sur mon petit test ^^ . Mais je l'applique à mon formulaire de ce pas )

    Merci pour la clarté de tes réponses, c'est vraiment bien expliqué, merci beaucoup

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

Discussions similaires

  1. [POO] positionner un element en fonction des coordonnées saisies
    Par krousty dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/06/2008, 13h07
  2. comment lister les fichiers en fonction des droits ?
    Par Ekimasu dans le forum Administration système
    Réponses: 7
    Dernier message: 19/04/2008, 17h12
  3. donner le focus en fonction des actions
    Par mali_67 dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 17/03/2008, 14h28
  4. Modifier les menus en fonction des choix utilisateur
    Par ekremyilmaz dans le forum AWT/Swing
    Réponses: 15
    Dernier message: 21/01/2008, 00h46
  5. [XSL] Trier les données en fonctions des parametres?
    Par titoff85 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 11/08/2007, 08h49

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