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 :

Bouton de commande et liaison des formulaires


Sujet :

IHM

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 61
    Points : 43
    Points
    43
    Par défaut Bouton de commande et liaison des formulaires
    Bonjour,

    Je vous prie de bien vouloir examiner le fichier joint. Dans lequel, j'ai détaillé toutes mes questions avec des imprim-écrans.
    J'ai aussi joint la base access en question.

    Merci d'avance pour votre aide précieuse.
    Images attachées Images attachées
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Bonsoir,

    1- Quand tu appelles ton formulaire Client, il faut que tu gères le cas où la zone de texte Titulaire du formulaire Inscriptions est remplie ou non. Tester avec Est Null.

    2- Lorsque tu fermes le formulaire Client après la saisie d'une nouvelle valeur, la mise à jour de ta zone de liste se ferait avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Forms!Inscription.Titulaire.Requery
    3- Tester l'ouverture ou non du formulaire Inscription lors de la fermeture du formulaire Clients avec la méthode OnLoad.

    Je ne peux ouvrir la base qui est souS Access 2010, désolé.

    Bonne continuation

  3. #3
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 878
    Points : 3 467
    Points
    3 467
    Par défaut
    Bonjour albayt,
    Pour compléter la réponse de madefemere, pour le point 1 au lieu d'une macro le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub NouvClt_Click()
     
        Dim strLinkCriteria As String
        'Choisir le mode d'ouverture si le champ est rempli ou non
        If IsNull(Me.Titulaire) Then
            DoCmd.OpenForm "Clients", acNormal, , , acFormAdd
        Else
            strLinkCriteria = "[RefClt]=" & Me.Titulaire
            DoCmd.OpenForm "Clients", acNormal, , strLinkCriteria
        End If
     
    End Sub
    Et pour le point 3:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Form_Close()
     
        'Tester si le formulaire est ouvert
        If CurrentProject.AllForms("Inscriptions").IsLoaded = True Then
            Forms!Inscriptions!Titulaire.Requery
        End If
     
    End Sub
    Bonne journée

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 61
    Points : 43
    Points
    43
    Par défaut Code pour ouvrir un formulaire sur "Nouvel enregistrement"
    Bonjour,

    Merci beaucoup Robert pour les codes, c'est impeccable !

    J'aurais encore une petite question :

    Quel est le code pour dire au formulaire de s'ouvrir sur un "Nouvel enregistrement" au lieu de s'ouvrir sur l'enregistrement n° 1.

    Merci d'avance

  5. #5
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 878
    Points : 3 467
    Points
    3 467
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.OpenForm "Clients", acNormal, , , acFormAdd

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Merci pour ta réponse rapide.

    J'ai tapé ce code pour le formulaire "Packages" mais ca ne marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_Current()
    DoCmd.OpenForm "Packages", acNormal, , , acFormAdd
    End Sub
    Rien ne change !

  7. #7
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 878
    Points : 3 467
    Points
    3 467
    Par défaut
    Bonjour,

    J'ai tapé ce code pour le formulaire "Packages" mais ca ne marche pas.

    Private Sub Form_Current()
    DoCmd.OpenForm "Packages", acNormal, , , acFormAdd
    End Sub
    Tu ne peux pas te servir de ce code "sur activation". Ce code ouvre un autre formulaire comme tu souhaitais le faire plus haut.

    Si tu veux que ton formulaire au moment de l'ouverture se positionne sur un nouvel enregistrement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_Load()
    DoCmd.GoToRecord acDataForm, "Packages", acNewRec
    End Sub
    Tu remarqueras que je n'ai pas mis ce code sur l’événement "Form_Current" mais sur "Form_Load".

    Bonne journée

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 61
    Points : 43
    Points
    43
    Par défaut Merci
    Merci beaucoup

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 61
    Points : 43
    Points
    43
    Par défaut Petit problème
    Salut,

    Je viens de détecter que lorsque la valeur du "Titulaire" dans le formulaire "Inscription" n'est pas Nulle, le bouton renvoi toujours sur "Nouvel enregistrement". Il est normalement supposé renvoyer vers le "Titulaire" correspondant.

    Pourtant le code est très logique (voir la base ci-joint pour plus de détail):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private Sub NouvClt_Click()
    Dim strLinkCriteria As String
        'Choisir le mode d'ouverture si le champ est rempli ou non
        If IsNull(Me.Titulaire) Then
            DoCmd.OpenForm "Clients", acNormal, , , acFormAdd
        Else
            strLinkCriteria = "[RefClt]=" & Me.Titulaire
            DoCmd.OpenForm "Clients", acNormal, , strLinkCriteria
        End If
    End SubJ
    Je ne comprends pas ce qui cloche.

    Je profite aussi pour poser une autre question :

    Quel code faut-il taper pour que dans la case "Titulaire", access filtre automatiquement les clients dès que l'utilisateur commence à saisir les première lettres du nom du client.

    Par exemple : J'ai dans ma base les clients suivants:
    Dupont, Durand, Deballon...
    Dans la case "Titulaire", dès que je saisi "Du", il ne m'affiche dans la liste déroulante que les clients (Dupont et Durand). Le client Deballon ne sera pas proposé car il ne commence pas par Du
    Fichiers attachés Fichiers attachés

  10. #10
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 878
    Points : 3 467
    Points
    3 467
    Par défaut
    Bonjour albayt,
    Je viens de détecter que lorsque la valeur du "Titulaire" dans le formulaire "Inscription" n'est pas Nulle, le bouton renvoi toujours sur "Nouvel enregistrement". Il est normalement supposé renvoyer vers le "Titulaire" correspondant.
    C'est parce que tu as mis dans le formulaire client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.GoToRecord acDataForm, "Clients", acNewRec
    Ce qui fait que ton formulaire va sur un nouveau record.

    Ce que tu veux c'est que ton formulaire s'ouvre sur un nouveau record quand il provient de x et qu'il s'ouvre sur le record choisit quand il provient de ton formulaire Inscription. Une solution est la suivante, dans le formulaire Inscription tu ajoutes dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim strLinkCriteria As String
        'Choisir le mode d'ouverture si le champ est rempli ou non
        If IsNull(Me.Titulaire) Then
            DoCmd.OpenForm "Clients", acNormal, , , acFormAdd
        Else
            strLinkCriteria = "[RefClt]=" & Me.Titulaire
            DoCmd.OpenForm "Clients", acNormal, , strLinkCriteria, , , 1
        End If
    End Sub
    et dans le formulaire Clients:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Form_Load()
    If IsNull(Me.OpenArgs) Then
        DoCmd.GoToRecord acDataForm, "Clients", acNewRec
    End If
    End Sub
    Ce que je viens de faire ici c'est que dans le formulaire Inscriptions dans la commande pour ouvrir Client j'ai inscrit un "OpenArgs" = 1 et quand on ouvre le formulaire Client si il y a un "OpenArg" on ne va pas a un nouveau record.

    Pour ton autre problème je ne suis pas certain mais je crois que cela provient du fait que ta liste est liée directement à la table. De plus je me souviens d'avoir lu qu'avec Access 2007 il fallait mettre SELECT DISTINCT .... pour que cela fonctionne. À tester.

    Bonne journée

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 61
    Points : 43
    Points
    43
    Par défaut Comment interdire les doublons dans le formulaire "Inscriptions"
    Bonjour,

    Comment dire à Access (en langage vba) de faire les instructions suivantes :

    Après mise à jour du champ « Voyageurs » lors d’une inscription.

    Va dans la requête « VoyageursParPackage » et vérifie si ce voyageur existe 2 fois pour un même package (RefPack). En d’autres termes, Access doit s’assurer qu’un voyageur ne soit pas inscrit 2 fois pour un même séjour.

    Si oui, un message d’erreur MsgBox « Attention : « [Client] extrait de la table clients » est déjà inscrit pour le voyage « [RefPack] extrait de la table packages ») doit s’afficher.

    Sinon, rien ne se passe (l’enregistrement est pris en compte)
    Fichiers attachés Fichiers attachés

  12. #12
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 878
    Points : 3 467
    Points
    3 467
    Par défaut
    Bonjour albayt,

    Je ne suis pas certain de comprendre ta question. Si je regarde le schémas de ta base il est impossible d'inscrire un voyageur 2 fois parce que la clé de la table Inscriptions est: RefPack + RefClt. Donc si tu inscrits 2 fois le même client pour le même package Access devrait t'en empêcher au moment de l'enregistrement du record.

    Si tu veux tester au moment de la modification du champ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Private Sub Titulaire_BeforeUpdate(Cancel As Integer)
     
        'Déclaration des variables
        Dim db As DAO.Database
        Dim rst As DAO.Recordset
        Dim strSQL As String, strMessage As String
        'Première étape vérifier que le champ formule est saisi
        If Not IsNull(Me.RefPack) Then
            'Deuxième étape, vérification si le client + package existe
            strSQL = "SELECT Inscriptions.RefClt, Inscriptions.RefPack FROM Inscriptions " _
            & "WHERE (((Inscriptions.RefClt)=" & Me.RefClt & ") AND ((Inscriptions.RefPack)= " & Me.RefPack & "));"
            Set db = CurrentDb
            Set rst = db.OpenRecordset(strSQL)
            If rst.EOF = False Then 'Il existe
                'On ferme le record
                rst.Close
                Set rst = Nothing
                'On construit le message en récupérant le nom du client
                strSQL = "SELECT Clients.RefClt, Clients.Client FROM Clients WHERE (((Clients.RefClt)=" & Me.RefClt & "));"
                Set rst = db.OpenRecordset(strSQL)
                strMessage = "Attention :  " & rst("Client") & " est déjà inscrit pour le voyage "
                'On ferme le record et on va récupérer le nom du voyage
                rst.Close
                Set rst = Nothing
                strSQL = "SELECT Packages.RefPack, Packages.Formule FROM Packages WHERE (((Packages.RefPack)=" & Me.RefPack & "));"
                Set rst = db.OpenRecordset(strSQL)
                strMessage = strMessage & rst("Formule") & "!"
                'On affiche le message
                MsgBox strMessage, vbExclamation
                'On cancel le client
                Cancel = True
                Me.Titulaire.Undo
                'On ferme le record
                rst.Close
                Set rst = Nothing
            Else    'Il n'y a pas de record
                'On ferme le record
                rst.Close
                Set rst = Nothing
            End If
            'On libère l'objet
            Set db = Nothing
        End If
     
    End Sub
    Il faudra que tu reproduise ce code pour le champ RefPack si tu veux garder la logique de tester avant l'enregistrement.

    Bonne journée

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Merci pour ta réponse rapide,

    J'ai certainement mal exposé le problème. En fait, ce que je veux faire c'est d'empêcher qu'un "voyageur" (Champ du sous-formulaire InscriptionsVoyageurs) ne soit inscrit 2 fois pour un même Package (Champ RefPack du formulaire Inscriptions).

    Merci

  14. #14
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Précision:

    Afin de mieux illustrer le problème, je t'invite à jeter un oeil à la Base (Version3 en fichier joint).

    Dans l'inscription no 10000123 (enregistrement access no 1):
    le client suivant y est inscrit "HOCINE RABAH MR"

    Dans l'inscription no 10000215 (enregistrement access no 3):
    le client "HOCINE RABAH MR" a pu être enregistré sans aucun problème.

    Ce qui veut dire que "HOCINE RABAH MR" s'est inscrit 2 fois pour le même package.

  15. #15
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 878
    Points : 3 467
    Points
    3 467
    Par défaut
    Bonjour albayt
    Dans l'inscription no 10000123 (enregistrement access no 1):
    le client suivant y est inscrit "HOCINE RABAH MR"

    Dans l'inscription no 10000215 (enregistrement access no 3):
    le client "HOCINE RABAH MR" a pu être enregistré sans aucun problème.

    Ce qui veut dire que "HOCINE RABAH MR" s'est inscrit 2 fois pour le même package.
    Cela laisse supposer que ton modèle n'est pas correct. Ta clé primaire devrait inclure le RefPack et le RefClient. Ici tu as comme clé le numéro de dossier et le voyageur qui est en fait le client. En passant le type de champ voyageur devrait être numérique.

    Tu peux contrôler les doublons avec le genre de code que je t'ai donné mais ce n'est pas le meilleur moyen.

    Si tu veux continuer dans cette voie tu n'as qu'a mettre le code que je t'ai donné sur l'événement avant mise à jour du champ voyageur. Tu changes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not IsNull(Me.RefPack) Then
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not IsNull(Forms!Inscriptions.RefPack) Then
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strSQL = "SELECT Inscriptions.RefClt, Inscriptions.RefPack FROM Inscriptions " _
            & "WHERE (((Inscriptions.RefClt)=" & Me.RefClt & ") AND ((Inscriptions.RefPack)= " & Me.RefPack & "));"
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strSQL = "SELECT Voyageurs.NoDossier, Voyageurs.Voyageur FROM Voyageurs WHERE (((Voyageurs.NoDossier)='" & Me.NoDossier & "') AND ((Voyageurs.Voyageur)='" & Me.Voyageurs & "'));"
    Ceci en supposant que tu ne modifies pas le champ voyageur et que tu le laisses en texte. Aussi:devientBonne journée

  16. #16
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    J'ai modifié le type de champs voyageur en "numérique".

    Quand tu me dis:

    Tu peux contrôler les doublons avec le genre de code que je t'ai donné mais ce n'est pas le meilleur moyen.
    Est ce que c'est risqué pour le futur surtout que la base sera mise sur serveur et utilisée par plusieurs utilisateurs en même temps !

  17. #17
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 878
    Points : 3 467
    Points
    3 467
    Par défaut
    Bonjour,
    Oui cela présente des risques. Le meilleur moyen de contrôler est à la base, donc dans la structure de la table. De la façon que la table est conçue il peut y avoir plusieurs fois le même client avec un même package à condition que le numéro de dossier soit différent. De toute évidence ce n'est pas ce que tu veux. Donc la table devrait avoir comme clé refCleint et refPack. Pour le numéro de dossier tu n'as qu'a sélectionner nul interdit.

    Bonne journée

  18. #18
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Merci beaucoup pour tes conseils.

    Effectivement, la solution était de définir "Voyageur" et "RefPack" comme clés primaires. Le numéro de dossier = indexé sans doublons / Nul interdit.

    Encore merci !

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/12/2014, 07h12
  2. Rendre un bouton de commande inactif dans un formulaire
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/08/2010, 14h39
  3. Réponses: 1
    Dernier message: 03/02/2009, 12h38
  4. Réponses: 1
    Dernier message: 11/12/2006, 19h33
  5. Bouton de commande et fermeture de formulaire
    Par KEROZEN dans le forum Access
    Réponses: 6
    Dernier message: 28/06/2006, 16h10

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