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 :

Contraindre la saisie dans un champ dans un sous-form


Sujet :

IHM

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 16
    Points : 6
    Points
    6
    Par défaut Contraindre la saisie dans un champ dans un sous-form
    Bonjour
    Dans mon form j'ai un sous-form qui renseigne une requête dont la table est paramétrée sur NullInterdit pour MonChampObligatoire.
    Je voudrais empêcher la sortie du form, et la création d'un nouvel enregistrement, et la navigation entre enregistrements du form, sans que MonChampObligatoire (dans le sous-form) ne soit renseigné.
    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If isnull(Form![MonForm].[MonSousForm].Form.MonChampObligatoire) then
    msgbox "stop"
    exit sub
    sans résultat fiable car je ne parviens pas à trouver le bon évènement pour le placer.
    Merci beaucoup pour vos conseils.

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 073
    Points : 24 695
    Points
    24 695
    Par défaut
    Bonjour,

    Sur activation

    se produit à chaque consultation du recordset ouverture et déplacements.


    Avant insertion

    se produit avant l'insertion d'un enregistrement.


    Pour en savoir plus sur les événements et leur enchainement tu peux récupérer l'outil Chasseur d'événement sur ma page. Code ouvert.

    Cordialement,

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Merci pour ton conseil loufab. J'ai regardé le chasseur d'évènements: c'est vachement astucieux!
    Evidemment maintenant ça fonctionne (le message "stop" au bon moment), à ceci près que "exit sub" n'empêche pas la circulation entre enregistrements: pourquoi?
    Certes ce n'est pas tout à fait la question de départ, mais c'est quand même intimement lié.
    Ton avis?

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 073
    Points : 24 695
    Points
    24 695
    Par défaut
    Oui cet événement (sur activation) est déclenché après le changement d'enregistrement.

    Il existe d'autre événement comme Sur Erreur, Avant Ajout...

    à tester.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Points : 1 282
    Points
    1 282
    Par défaut
    Bonjour
    On peut y arriver en conservant le numéro de l'enregistrement courant (Me.CurrentRecord) et en cas d'erreur on passe par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.GoToRecord , , acGoTo, NumEnrSauve

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Merci Frédéric pour ta réponse.
    Je ne suis pas professionnel en informatique, mon expérience du VBA vient d'excel, et je ne suis sur Acces que depuis 8 jours. L'idée de revenir vers le formulaire current m'avait traversé l'esprit mais je ne sais pas l'écrire: échec de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dim actif
    actif=Me.Num_Principal.value
    DoCmd.GoToRecord , , acGoTo, actif 'tente de rester sur le formulaire actif repéré par le Num_Principal
    Si je place le code suivant dans l'évènement "sur activation"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If isnull(Form![MonForm].[MonSousForm].Form.MonChampObligatoire) then
    msgbox "stop"
    exit sub
    quelle sera la suite?
    Merci par avance pour tes précisions.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Points : 1 282
    Points
    1 282
    Par défaut
    Re
    Si je reprends une partie de ton code cela donnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim Actif
    Private Sub Form_Current()
       If isnull(Form![MonForm].[MonSousForm].Form.MonChampObligatoire) then
       msgbox "stop"
       if not isnull(actif) then
          DoCmd.GoToRecord , , acGoTo, actif
       end if
    end if
     
       actif=me.currentrecord
    end Sub
    J'espère que c'est bon, car j'ai fait ça à 'l'arrache'

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    ça plante sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.GoToRecord , , acGoTo, actif
    bien que j'ai remonté Je cherche...
    Mais ce soir je n'ai plus internet, donc ma réponse sera différée jusqu'à demain sans doute.

  9. #9
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Points : 1 282
    Points
    1 282
    Par défaut
    Re
    Quel est le message d'erreur exact ?

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Bonjour Frederic
    L'erreur portait sur la non-reconnaissance de la variable "actif".
    Avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    If IsNull(Forms![MonForm].[MonSousForm].Form.MonChampObligatoire) Then
        If Not IsNull(actif) Then
        MsgBox "stop"
        actif = Me.CurrentRecord
        DoCmd.GoToRecord , , acGoTo, actif
        End If
    End If
    l'action message se déclenche correctement au dépistage de la condition, mais la commande n'empêche nullement la circulation entre enregistrements ou vers un nouvel enregistrement

  11. #11
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Points : 1 282
    Points
    1 282
    Par défaut
    Bonjour
    As-tu bien défini la variable en début de module ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Option Compare Database
    Option Explicit
    Dim Actif
    D'autre part tu peux compléter le test par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not IsNull(Actif) And Actif <> "" Then

  12. #12
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Points : 1 282
    Points
    1 282
    Par défaut
    Re
    Petite question.
    Si tu veux contraindre la saisie d'une zone dans le sous formulaire, pourquoi ne pas faire le controle directement dans le sous formulaire ?

    Il serait plus facile d'intercepter la mise à jour de l'enregistrement du sous formulaire et d'annuler cette mise à jour si le champ obligatoire est vide.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    1-Voui, la variable était bien définie.
    2-Non, la précision de la valeur "rien" ne change pas les choses.
    3- C'est une bonne idée. Je vais essayer. J'ai une autre contrainte c'est que MonSousForm n'est rendu visible que si certains champs obligatoires de MonForm sont renseignés. Je vais voir si je peux me dépatouiller avec ça, car les choses sont differentes selon que l'on ouvre un nouvel enregistrement, ou que l'on circule vers un ancien dont on a pas renseigné le champ du sous-form.
    Merci Frederic. A plus tard pour la réponse.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Donc j'ai re-écrit le module, que je déclenche sur l'évènement Form_Current du sous-formulaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Form![MonForm].[MonSousForm].Form.Visible=false
    If Form![MonForm].Champ1.value<>"" And Form![MonForm].Champ2.value<>"" then
    Form![MonForm].[MonSousForm].Form.Visible=true
        If isnull(Form![MonForm].[MonSousForm].Form.MonChampObligatoire) Then
        MsgBox "stop"
            If Not IsNull(actif) And actif <> "" Then
        actif = Forms![MonForm].CurrentRecord
        DoCmd.GoToRecord , , acGoTo, actif
            End If
        End If
    End If
    L'action se déclenche à l'arrivée dans l'enregistrement du Form qui contient le sous-Form dont MonChampObligatoire n'est pas renseigné (module déclenché sur activation dans le sous-form): le form_current est conservé (normal, on arrive sur lui)
    L'action ne se déclenche pas lorsque l'on quitte l'enregistrement du Form qui contient le sous-Form dont MonChampObligatoire n'est pas renseigné: selon l'évènement où je rajoute la procédure evenementielle, j'obtiens des salves de messages! Ou au minimum 2, mais le Form_Current n'est pas conservé.

  15. #15
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Points : 1 282
    Points
    1 282
    Par défaut
    Re

    Voila ce que je te propose

    Pour afficher ou masquer le sous formulaire, on fait les tests sur le formulaire principal. On a le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form_Current()
        If Me.Champ1.value<>"" And Me.Champ2.value<>"" Then
            Me.MonSousForm.Visible=true 'nom du controle pas de l'objet sous formulaire
        Else
            Me.MonSousForm.Visible=false
        End If
    End Sub
    Pour le controle de la saisie du champ du sous formulaire, on fait le test Avant la mise à jour du sous formulaire. On a le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Form_BeforeUpdate(Cancel As Integer)
        If IsNull(Me.MonChampObligatoire) Then
            MsgBox "stop"
            Cancel = True
        End If
    End Sub
    Ceci à pour but de controler la saisie, donc ce code ne peut pas s'appliquer aux données déjà saisies.

    J'espère que cela conviendra.

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    J'ai un peu honte d'avouer que ça ne marche pas: je continue de chercher...
    Je tiens une piste avec l'évènement BeforeUpdate, car il déclenche correctement un arret si deux dates du Form ne sont pas en cohérence, mais il ne déclenche pas le message "stop" à tous les coups (des fois oui, des fois non)

  17. #17
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Points : 1 282
    Points
    1 282
    Par défaut
    Re
    mais il ne déclenche pas le message "stop" à tous les coups (des fois oui, des fois non)
    L'événement BeforeUpdate ne se déclenche que si un des champs de l'enregistrement a été modifié
    Bon courage

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    J'ai vu.
    La solution de contournement que j'ai trouvé est la suivante: plutôt qu'un message MsgBox j'utilise un Form paramétré en modal: ça empêche la circulation entre les enregistrements (contrairement à la MsgBox).
    Quel évènement pourrait dépister les conditions décrites lorsque l'on circule dans les enregistremenst du Form sans les modifier?

    Dans tous les cas merci beaucoup pour ton aide et ton investissement.

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Et non, le form en modal n'empêche pas non plus la circulation quand on le ferme (j'avais oublié de remettre les relations).
    ............

  20. #20
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Points : 1 282
    Points
    1 282
    Par défaut
    Re
    Quel évènement pourrait dépister les conditions décrites lorsque l'on circule dans les enregistremenst du Form sans les modifier?
    Si on parle de déplacement dans le formulaire principal : le problème est que si tu utilises le FormCurrent du formulaire principal, le test sur le champ obligatoire du sous formulaire ne se fait que sur la première ligne affichée dans le sous formulaire

Discussions similaires

  1. Autoriser la saisie de chiffres uniquement dans un champ texte
    Par winzy77 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 29/08/2018, 01h50
  2. mettre en minuscule la saisie de l'internaute dans un champ de formulaire
    Par toy2000gt dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 05/12/2008, 13h40
  3. saisie d'un text dans un champ
    Par minooo dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 20/09/2008, 23h24
  4. Réponses: 4
    Dernier message: 18/06/2007, 18h48
  5. Réponses: 9
    Dernier message: 05/02/2007, 13h27

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