OVH Cloud OVH Cloud

Créer un enregistrement dans une table

7 réponses
Avatar
Cerveza
Bonsoir à vous tous,

J'ai un formulaire sur une table de Fctures Un numéro de client sert de lien
avec la table des Clients, reliée à ma table de Facture avec Intégrité
réérentielle. Lorsque le cient n'est pas sur ma table de Clients, je veux
pouvoir créer l'enregistrement manquant sur la table des Clients directement
dans mon formulaire avant de poursuivre avec ce même client pour créer la
nouvelle facture.

Comment faire autrement qu'en quittant le formulaire de création de ma
facture?

Merci de partager vos connaissances et votre expérience.
--
On naît tous ignorant
@+
Cerveza

7 réponses

Avatar
Eric
Bonjour,

L'idée :
Tu remplaces ta zone de texte du champ NumeroClient (source
TableFacture) par une zone de liste modifiable(ou liste déroulante)
basée sur la table des clients ayant 2 colonnes (NumClient et NomClient,
la 1ere colonne largeur 0 cm) dont la propriété Limiter à Liste est sur Oui.
Sur l'évènement NotInList, tu appelles ton formulaire de saisie des
nouveaux clients, tu saisis le client sauve et ferme le formulaire, mets
à jour la liste et tu poursuis la saisie de la facture.
Des procédures sont proposés sur les différents sites conseillés ici
http://www.mpfa.info/
ex : http://officesystem.access.free.fr/vba/notinlist.htm

Bonsoir à vous tous,

J'ai un formulaire sur une table de Fctures Un numéro de client sert de lien
avec la table des Clients, reliée à ma table de Facture avec Intégrité
réérentielle. Lorsque le cient n'est pas sur ma table de Clients, je veux
pouvoir créer l'enregistrement manquant sur la table des Clients directement
dans mon formulaire avant de poursuivre avec ce même client pour créer la
nouvelle facture.

Comment faire autrement qu'en quittant le formulaire de création de ma
facture?

Merci de partager vos connaissances et votre expérience.


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Cerveza
Merci Éric pour ta réponse. Tout a bien fonctionné.
Par contre, j'aimerais éviter d'entrer le numéro de client quand je me
transporte d'un formulaire à l'autre. Comment m'y prendre pour que le numéro
s'ajoute sans le réinscrire dans chacun des formulaires?
Merci
--
On naît tous ignorant
@+
Cerveza



Bonjour,

L'idée :
Tu remplaces ta zone de texte du champ NumeroClient (source
TableFacture) par une zone de liste modifiable(ou liste déroulante)
basée sur la table des clients ayant 2 colonnes (NumClient et NomClient,
la 1ere colonne largeur 0 cm) dont la propriété Limiter à Liste est sur Oui.
Sur l'évènement NotInList, tu appelles ton formulaire de saisie des
nouveaux clients, tu saisis le client sauve et ferme le formulaire, mets
à jour la liste et tu poursuis la saisie de la facture.
Des procédures sont proposés sur les différents sites conseillés ici
http://www.mpfa.info/
ex : http://officesystem.access.free.fr/vba/notinlist.htm

Bonsoir à vous tous,

J'ai un formulaire sur une table de Fctures Un numéro de client sert de lien
avec la table des Clients, reliée à ma table de Facture avec Intégrité
réérentielle. Lorsque le cient n'est pas sur ma table de Clients, je veux
pouvoir créer l'enregistrement manquant sur la table des Clients directement
dans mon formulaire avant de poursuivre avec ce même client pour créer la
nouvelle facture.

Comment faire autrement qu'en quittant le formulaire de création de ma
facture?

Merci de partager vos connaissances et votre expérience.


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr




Avatar
Eric
Bonjour,

(Adapter les noms de table et champs)

Sur l'évènement NotInList de ta combo, tu mets un truc du genre:
Private Sub NumClient_NotInList(NewData As String, Response As Integer)
If MsgBox("Créer le client " & UCase(NewData) & " ?", _
vbYesNo + vbQuestion _
+ vbDefaultButton2) = vbYes Then
Response = acDataErrAdded
DoCmd.OpenForm "Buveur1", acNormal, , , _
acFormAdd, acDialog, NewData
Else
Me.NumClient.Undo
Response = acDataErrContinue
End If
End Sub

Sur l'évènement Load de FormulaireSaisieClient et en supposant que le
NumClient n'est pas un NuméroAuto mais un Entier Long dans la table
TableClient, sinon, le n° est généré automatiquement par Access.
Ci-dessous tu fais évaluer le NumClient et affectes le nom saisi dans la
liste au champ NomClient (donc pas resaisi). Il faudrait que tu mettes
avant le end if une instruction donnant le focus sur le 1er champ à
compléter (Me.AutreChamp.SetFocus)

Private Sub Form_Load()
If Not IsNull(Me.OpenArgs) Then
Me!NumClient = DMax("NumClient", "TableClient") + 1
Me!NomClient = Me.OpenArgs
End If
End Sub

Merci Éric pour ta réponse. Tout a bien fonctionné.
Par contre, j'aimerais éviter d'entrer le numéro de client quand je me
transporte d'un formulaire à l'autre. Comment m'y prendre pour que le numéro
s'ajoute sans le réinscrire dans chacun des formulaires?
Merci


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Eric
.../...
Erreur de copier-coller
Remplacer Buveur1 par le nom du formulaire de saisie des Clients dans la
ligne : DoCmd.OpenForm "Buveur1", acNormal, ...


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr
Avatar
Cerveza
Grand merci encore une fois à toi Eric.
Ton code a très bien fonctionné. J'ai cependant ajouté l'instruction suivant
dans l'événement NotInList quand le test (If) est positif.
Me.NumClient.Value = NewData
Cela empêche de faire apparaître un message d'erreur qui dit de choisir le
numéro dans la table. L'instruction semble réactiver la mise à jour du champ
qui permet d'éviter un message d'erreur non signifiant.

Pour mon information, dans le code de ton dernier message, deux questions...
1) Quelle est l'utilité de l'instruction
Me!NumClient = DMax("NumClient", "TableClient") + 1 ?
2) Quelle est la différence entre «Me.» et «Me!»?

Merci encore une fois.
--
On naît tous ignorant
@+
Cerveza



..../...
Erreur de copier-coller
Remplacer Buveur1 par le nom du formulaire de saisie des Clients dans la
ligne : DoCmd.OpenForm "Buveur1", acNormal, ...


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr



Avatar
Eric
Bonsoir,

Dans le cas où NumClient n'est pas un numéroAuto,
DMax("NumClient", "TableClient") + 1 renvoie le nouveau numéro c'est à
dire qu'on récupère le plus grand déjà affecté dans la table et on lui
ajoute 1. C'est pourquoi dans ma réponse je précisais que NumClient
n'était pas un NuméroAuto.

Le . sert en général à appeler une propriété ou une méthode d'un objet
Par exemple : NumClient.Enabled= False
Le ! pour accéder à un contrôle de formulaire, ou encore un champ d'un
objet recordset.
Par ex : Me!Nomclient="toto" ou Debug.? Me!NomClient
Pour bénéficier de la complétude, on a tendance à utiliser souvent le .
pour le ! , mais ca peut parfois jouer de mauvais tour.
Ainsi si tu tapes Me. une liste déroulante te propose toutes les
propriétés et méthodes d'un formulaire mais aussi affiche, dans la
liste, les contrôles contenus dans le formulaire.
Donc Me.NumClient.Enabled = False revient à Me!NumClient.Enabled = False
La 2ème écriture est la bonne et respecte la syntaxe d'Access. La 1ère
est, je suppose, interprétée par Access.

Grand merci encore une fois à toi Eric.
Ton code a très bien fonctionné. J'ai cependant ajouté l'instruction suivant
dans l'événement NotInList quand le test (If) est positif.
Me.NumClient.Value = NewData
Cela empêche de faire apparaître un message d'erreur qui dit de choisir le
numéro dans la table. L'instruction semble réactiver la mise à jour du champ
qui permet d'éviter un message d'erreur non signifiant.

Pour mon information, dans le code de ton dernier message, deux questions...
1) Quelle est l'utilité de l'instruction
Me!NumClient = DMax("NumClient", "TableClient") + 1 ?
2) Quelle est la différence entre «Me.» et «Me!»?

Merci encore une fois.


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Cerveza
Explications claires.
Merci et à la prochaine.

--
On naît tous ignorant
@+
Cerveza



Bonsoir,

Dans le cas où NumClient n'est pas un numéroAuto,
DMax("NumClient", "TableClient") + 1 renvoie le nouveau numéro c'est à
dire qu'on récupère le plus grand déjà affecté dans la table et on lui
ajoute 1. C'est pourquoi dans ma réponse je précisais que NumClient
n'était pas un NuméroAuto.

Le . sert en général à appeler une propriété ou une méthode d'un objet
Par exemple : NumClient.Enabled= False
Le ! pour accéder à un contrôle de formulaire, ou encore un champ d'un
objet recordset.
Par ex : Me!Nomclient="toto" ou Debug.? Me!NomClient
Pour bénéficier de la complétude, on a tendance à utiliser souvent le .
pour le ! , mais ca peut parfois jouer de mauvais tour.
Ainsi si tu tapes Me. une liste déroulante te propose toutes les
propriétés et méthodes d'un formulaire mais aussi affiche, dans la
liste, les contrôles contenus dans le formulaire.
Donc Me.NumClient.Enabled = False revient à Me!NumClient.Enabled = False
La 2ème écriture est la bonne et respecte la syntaxe d'Access. La 1ère
est, je suppose, interprétée par Access.

Grand merci encore une fois à toi Eric.
Ton code a très bien fonctionné. J'ai cependant ajouté l'instruction suivant
dans l'événement NotInList quand le test (If) est positif.
Me.NumClient.Value = NewData
Cela empêche de faire apparaître un message d'erreur qui dit de choisir le
numéro dans la table. L'instruction semble réactiver la mise à jour du champ
qui permet d'éviter un message d'erreur non signifiant.

Pour mon information, dans le code de ton dernier message, deux questions...
1) Quelle est l'utilité de l'instruction
Me!NumClient = DMax("NumClient", "TableClient") + 1 ?
2) Quelle est la différence entre «Me.» et «Me!»?

Merci encore une fois.


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr