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.
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.
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 :
3- Tester l'ouverture ou non du formulaire Inscription lors de la fermeture du formulaire Clients avec la méthode OnLoad.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Forms!Inscription.Titulaire.Requery
Je ne peux ouvrir la base qui est souS Access 2010, désolé.
Bonne continuation
Bonjour albayt,
Pour compléter la réponse de madefemere, pour le point 1 au lieu d'une macro le code suivant:Et pour le point 3:
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 SubBonne journée
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
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
Bonjour,
Code : Sélectionner tout - Visualiser dans une fenêtre à part DoCmd.OpenForm "Clients", acNormal, , , acFormAdd
Merci pour ta réponse rapide.
J'ai tapé ce code pour le formulaire "Packages" mais ca ne marche pas.
Rien ne change !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Private Sub Form_Current() DoCmd.OpenForm "Packages", acNormal, , , acFormAdd End Sub
Bonjour,
Tu ne peux pas te servir de ce code "sur activation". Ce code ouvre un autre formulaire comme tu souhaitais le faire plus haut.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
Si tu veux que ton formulaire au moment de l'ouverture se positionne sur un nouvel enregistrement:Tu remarqueras que je n'ai pas mis ce code sur l’événement "Form_Current" mais sur "Form_Load".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Private Sub Form_Load() DoCmd.GoToRecord acDataForm, "Packages", acNewRec End Sub
Bonne journée
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):
Je ne comprends pas ce qui cloche.
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 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
Bonjour albayt,
C'est parce que tu as mis dans le formulaire client: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.Ce qui fait que ton formulaire va sur un nouveau record.
Code : Sélectionner tout - Visualiser dans une fenêtre à part DoCmd.GoToRecord acDataForm, "Clients", acNewRec
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:et dans le formulaire Clients:
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 SubCe 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.
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
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
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)
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:Il faudra que tu reproduise ce code pour le champ RefPack si tu veux garder la logique de tester avant l'enregistrement.
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
Bonne journée
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
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.
Bonjour albayt
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.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.
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 :par
Code : Sélectionner tout - Visualiser dans une fenêtre à part If Not IsNull(Me.RefPack) Thenet
Code : Sélectionner tout - Visualiser dans une fenêtre à part If Not IsNull(Forms!Inscriptions.RefPack) Thenpar
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 & "));"Ceci en supposant que tu ne modifies pas le champ voyageur et que tu le laisses en texte. Aussi:
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 & "'));"devient
Code : Sélectionner tout - Visualiser dans une fenêtre à part Me.Titulaire.UndoBonne journée
Code : Sélectionner tout - Visualiser dans une fenêtre à part Me.Voyageur.Undo
J'ai modifié le type de champs voyageur en "numérique".
Quand tu me dis:
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 !Tu peux contrôler les doublons avec le genre de code que je t'ai donné mais ce n'est pas le meilleur moyen.
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
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 !
Partager