OVH Cloud OVH Cloud

Incrémentation ds 1 sous-formulaire et 1 formulaire

9 réponses
Avatar
Christophe
Bonjour,

Voilà mon problème :
J’ai un formulaire «F Principal» construit à partir d’une table contenant le
champ [T1_Identifiant] en clé primaire
et un sous-formulaire « SF sousformulaire » construit à patir d’une seconde
table ayant pour clé principale les 2 champs [T2_Identifiant] et [T2_Num]
Les 2 tables sont reliées par une relation « un-plusieurs » entre
[T1_Identifiant] et [T2_ Identifiant].

Le sous-formulaire a pour champ fils [T2_ Identifiant] et pour champ père
[T1_ Identifiant].

Je n’ai pas voulu utiliser les numéros automatiques pour incrémenter : j’ai
inséré dans la propriété « Sur activation » de « F Principal » le code
ci-dessous que j’ai trouvé dans le newsgroup, donné par 3stone :

Private Sub Form_Current()
If Me.NewRecord Then
Me. T1_ Identifiant = Nz(DMax("[T1_ Identifiant]", "T1"), 0) + 1
End If
End Sub

J’ai voulu faire la même chose dans le sous formulaire pour incrémenter
automatiquement [T2_Num] mais, plaçant le code équivalant dans l’événement «
Sur activation » de « SF sousformulaire », le stylet indiquant une saisie en
cours se place tout de suite dans le sous formulaire et un message d’erreur
m’avertit que le champ [T2_Identifiant] ne peut contenir la valeur null.

J’ai bidouillé toute la journée pour placer le code sur un autre événement
du sous formulaire mais force est d’admettre que je ne connais rien au VB… Je
ne sais pas dans quel événement placé le code ou alors je ne sais pas faire
référence aux contrôles en VB.

Comment permettre l’incrémentation automatique de [T2_Num] du sous
formulaire et celle de [T1_Identifiant] du formulaire, sans utiliser les
numauto ?

En vous remerciant sincérement pour l’aide que vous pourrez m’apporter,
avant de me jeter contre les murs…

Christophe

9 réponses

Avatar
Christophe
Bonjour,
comme je n'ai pas eu de réponse, je reformule ma question. Je vais essayer
plus court.
Je suis sous Access 2003 et débutant pour le VBA. J'ai mis dans la propriété
SurActivation d'un sous-formulaire le code

Private Sub Form_Current()
If Me.NewRecord Then
Me. T1_ Identifiant = Nz(DMax("[T1_ Identifiant]", "T1"), 0) + 1
End If
End Sub

Lorsque j'ouvre le formulaire principal, l'enregistrement est déjà en cours
dans le sous-formilaire et j'obtiens un message d'erreur m'indiquant que le
"champ fils" correspondant à la clef primaire ne peut contenir de valeur
null...
Comment empécher que l'enregistrement soit "activé" dans le sous-formulaire,
lorsque l'on ouvre le formulaire principal ou que l'on créé un nouvel
enregistrement dans le formulaire principal, c'est-à-dire avant même d'avoir
cliqué dans un champ du sous-formulaire ?

Merci sincérement,

Christophe


Bonjour,

Voilà mon problème :
J’ai un formulaire «F Principal» construit à partir d’une table contenant le
champ [T1_Identifiant] en clé primaire
et un sous-formulaire « SF sousformulaire » construit à patir d’une seconde
table ayant pour clé principale les 2 champs [T2_Identifiant] et [T2_Num]
Les 2 tables sont reliées par une relation « un-plusieurs » entre
[T1_Identifiant] et [T2_ Identifiant].

Le sous-formulaire a pour champ fils [T2_ Identifiant] et pour champ père
[T1_ Identifiant].

Je n’ai pas voulu utiliser les numéros automatiques pour incrémenter : j’ai
inséré dans la propriété « Sur activation » de « F Principal » le code
ci-dessous que j’ai trouvé dans le newsgroup, donné par 3stone :

Private Sub Form_Current()
If Me.NewRecord Then
Me. T1_ Identifiant = Nz(DMax("[T1_ Identifiant]", "T1"), 0) + 1
End If
End Sub

J’ai voulu faire la même chose dans le sous formulaire pour incrémenter
automatiquement [T2_Num] mais, plaçant le code équivalant dans l’événement «
Sur activation » de « SF sousformulaire », le stylet indiquant une saisie en
cours se place tout de suite dans le sous formulaire et un message d’erreur
m’avertit que le champ [T2_Identifiant] ne peut contenir la valeur null.

J’ai bidouillé toute la journée pour placer le code sur un autre événement
du sous formulaire mais force est d’admettre que je ne connais rien au VB… Je
ne sais pas dans quel événement placé le code ou alors je ne sais pas faire
référence aux contrôles en VB.

Comment permettre l’incrémentation automatique de [T2_Num] du sous
formulaire et celle de [T1_Identifiant] du formulaire, sans utiliser les
numauto ?

En vous remerciant sincérement pour l’aide que vous pourrez m’apporter,
avant de me jeter contre les murs…

Christophe




Avatar
3stone
Salut,

"Christophe"
| Je suis sous Access 2003 et débutant pour le VBA. J'ai mis dans la propriété
| SurActivation d'un sous-formulaire le code
|
| Private Sub Form_Current()
| If Me.NewRecord Then
| Me. T1_ Identifiant = Nz(DMax("[T1_ Identifiant]", "T1"), 0) + 1
| End If
| End Sub
|
| Lorsque j'ouvre le formulaire principal, l'enregistrement est déjà en cours
| dans le sous-formilaire et j'obtiens un message d'erreur m'indiquant que le
| "champ fils" correspondant à la clef primaire ne peut contenir de valeur
| null...
| Comment empécher que l'enregistrement soit "activé" dans le sous-formulaire,
| lorsque l'on ouvre le formulaire principal ou que l'on créé un nouvel
| enregistrement dans le formulaire principal, c'est-à-dire avant même d'avoir
| cliqué dans un champ du sous-formulaire ?


Il n'est pas toujours bon de sortir quelques lignes de code hors de leur contexte...

Mais, aurais-tu mis la propriété "Entrée données" à oui ??


--
A+
Pierre (3stone) Access MVP
Perso: http://users.skynet.be/accesshome/
Conseils MPFA: http://users.skynet.be/mpfa/
Email : http://www.cerbermail.com/?Xfg61Z3IQw
Avatar
Christophe
Bonjour.
Merci 3stone pour ta réponse. Malheureusement, ce n'est pas ça :
La propriété "Entrée données" n'est pas à oui.
As-tu une autre idée ? Ne pourrait-on pas mettre le code pour
l'incrémentation automatique dans une propriété ?

Christophe


Salut,

"Christophe"
| Je suis sous Access 2003 et débutant pour le VBA. J'ai mis dans la propriété
| SurActivation d'un sous-formulaire le code
|
| Private Sub Form_Current()
| If Me.NewRecord Then
| Me. T1_ Identifiant = Nz(DMax("[T1_ Identifiant]", "T1"), 0) + 1
| End If
| End Sub
|
| Lorsque j'ouvre le formulaire principal, l'enregistrement est déjà en cours
| dans le sous-formilaire et j'obtiens un message d'erreur m'indiquant que le
| "champ fils" correspondant à la clef primaire ne peut contenir de valeur
| null...
| Comment empécher que l'enregistrement soit "activé" dans le sous-formulaire,
| lorsque l'on ouvre le formulaire principal ou que l'on créé un nouvel
| enregistrement dans le formulaire principal, c'est-à-dire avant même d'avoir
| cliqué dans un champ du sous-formulaire ?


Il n'est pas toujours bon de sortir quelques lignes de code hors de leur contexte...

Mais, aurais-tu mis la propriété "Entrée données" à oui ??


--
A+
Pierre (3stone) Access MVP
Perso: http://users.skynet.be/accesshome/
Conseils MPFA: http://users.skynet.be/mpfa/
Email : http://www.cerbermail.com/?Xfg61Z3IQw





Avatar
3stone
Salut,

"Christophe"
| Merci 3stone pour ta réponse. Malheureusement, ce n'est pas ça :
| La propriété "Entrée données" n'est pas à oui.
| As-tu une autre idée ? Ne pourrait-on pas mettre le code pour
| l'incrémentation automatique dans une propriété ?


| > | Private Sub Form_Current()
| > | If Me.NewRecord Then
| > | Me. T1_ Identifiant = Nz(DMax("[T1_ Identifiant]", "T1"), 0) + 1
| > | End If
| > | End Sub


Avec l'exemple, il ne te calcule un T1_Identifiant QUE si tu est
dans un nouvel enregistrement...
Ce n'est donc pas lui qui le déclenche !

Tu dois chercher ailleurs... tu as un autre code quelque part ?


--
A+
Pierre (3stone) Access MVP
Perso: http://users.skynet.be/accesshome/
Conseils MPFA: http://users.skynet.be/mpfa/
Email : http://www.cerbermail.com/?Xfg61Z3IQw
Avatar
Christophe
Il existe le même code dans la propriété "SurActivation" du formulaire
principal pour incrémenter "l'identifiant principal". J'ai trouvé l'origine
des messages d'erreurs disant que le champs fils du sous-formulaire ne peut
contenir de valeur null : j'avais en effet inséré le nom d'une requête de
regroupement comme domaine de la fonction DMax. En effet, je voudrais que
l'identifiant secondaire du sous-formulaire reparte de 1 pour chaque valeur
de l'identifiant principal (c'est à dire du champ père qui lui est incrémenté
dans le formulaire).
En mettant le nom de la table source du sous-formulaire comme domaine de
DMax, je n'ai plus les messages d'erreur mais par contre l'identifiant
secondaire s'incrémente automatiquement et indépendamment de l'identifiant
primaire et un enregistrement est ajouté sytématiquement à la table source du
sous-formulaire dés l'ouverture du formulaire principal comme lors de la
saisie d'un nouvelle enregistrement dans la table principale.
Y aurait-il moyen d'empécher cet ajout systématique d'un nouvel
enregistrement dans la table source du sous-formualire et de faire en sorte
qu'il ne se fasse qu'avec la saisie d'une valeur d'un des champs du
sous-formulaire, tout en gardant l'incrémentation automatique de
l'identifiant secondaire ?

J'espère avoir été clair ; c'est pas évident... Vraiment un grand merci pour
ton aide.

Christophe


Salut,

"Christophe"
| Merci 3stone pour ta réponse. Malheureusement, ce n'est pas ça :
| La propriété "Entrée données" n'est pas à oui.
| As-tu une autre idée ? Ne pourrait-on pas mettre le code pour
| l'incrémentation automatique dans une propriété ?


| > | Private Sub Form_Current()
| > | If Me.NewRecord Then
| > | Me. T1_ Identifiant = Nz(DMax("[T1_ Identifiant]", "T1"), 0) + 1
| > | End If
| > | End Sub


Avec l'exemple, il ne te calcule un T1_Identifiant QUE si tu est
dans un nouvel enregistrement...
Ce n'est donc pas lui qui le déclenche !

Tu dois chercher ailleurs... tu as un autre code quelque part ?


--
A+
Pierre (3stone) Access MVP
Perso: http://users.skynet.be/accesshome/
Conseils MPFA: http://users.skynet.be/mpfa/
Email : http://www.cerbermail.com/?Xfg61Z3IQw




Avatar
3stone
Salut,

"Christophe"
| Il existe le même code dans la propriété "SurActivation" du formulaire
| principal pour incrémenter "l'identifiant principal". J'ai trouvé l'origine
| des messages d'erreurs disant que le champs fils du sous-formulaire ne peut
| contenir de valeur null : j'avais en effet inséré le nom d'une requête de
| regroupement comme domaine de la fonction DMax. En effet, je voudrais que
| l'identifiant secondaire du sous-formulaire reparte de 1 pour chaque valeur
| de l'identifiant principal (c'est à dire du champ père qui lui est incrémenté
| dans le formulaire).
| En mettant le nom de la table source du sous-formulaire comme domaine de
| DMax, je n'ai plus les messages d'erreur mais par contre l'identifiant
| secondaire s'incrémente automatiquement et indépendamment de l'identifiant
| primaire et un enregistrement est ajouté sytématiquement à la table source du
| sous-formulaire dés l'ouverture du formulaire principal comme lors de la
| saisie d'un nouvelle enregistrement dans la table principale.
| Y aurait-il moyen d'empécher cet ajout systématique d'un nouvel
| enregistrement dans la table source du sous-formualire et de faire en sorte
| qu'il ne se fasse qu'avec la saisie d'une valeur d'un des champs du
| sous-formulaire, tout en gardant l'incrémentation automatique de
| l'identifiant secondaire ?


Si je comprends bien... (pas sûr ;)

Dans ta table principale, ta numérotation des enregistrements sont:

1, 2, 3, 4, 5, 6....

dans ta table secondaire, la clé externe qui sera identique et un second
champ qui doit repartir à 1 à chaque incrémentation de la clé externe

1 - 1, 1 - 2, 1 - 3, 1 - 4 ....
2 - 1, 2 - 2, 2 - 3 ...

c'est ca ?

dans ce cas, tu peux numéroter ton second champ en vérifiant les
enregistrements qui correspondent à la clé externe:

If Me.Newrecord Then
'sur une ligne...
SecondChamp Nz(DMax("ChampSecondaire","Tablesecondaire","CleExt="
& Me.Parent.ClePrimaire),0)+1

End if


PS:
Dans "Me.Parent.ClePrimaire" tu dois remplacer "CléPrimaire"
par le nom de la clé primaire du formulaire principal.


--
A+
Pierre (3stone) Access MVP
Perso: http://users.skynet.be/accesshome/
Conseils MPFA: http://users.skynet.be/mpfa/
Email : http://www.cerbermail.com/?Xfg61Z3IQw
Avatar
Christophe
Effectivement, c'est tout à fait ça et l'incrémentation se fait correctement
maintenant dans les deux champs du sous-formulaires.
Mais j'ai toujours un problème à l'ouverture du formulaire, lorsque les
tables sont vides ou bien, si je suis sur le dernier enregistrement de la
table principale, dés que je clique, dans le formulaire principale, sur
enregistrement suivant : le message d'erreur ci-dessous s'affiche :

"Erreur d'éxécution 3075
Erreur de syntaxe (opérateur absent) dans l'expression "CleExt=" "
(avec, bien sûr, le vrai non de la clé reliant le sous formulaire au
formulaire à la place de "CleExt")

Cela est-il dû au fait que CleExt soit vide ?

De plus, après avoir arrêté le débogage lié à cette erreur, un
enregistrement est systématiquement ajouté dans la table source du
sous-formulaire,
même sans avoir cliqué dans un contrôle de ce sous-formulaire.

Y aurait-il moyen de rajouter un enregistrement dans la table source du
sous-formulaire (la table secondaire) que lorsque l'on clique sur un contrôle
du sous-formulaire ? Ou bien la table secondaire, source du sous formulaire
actuel, doit-elle être remplie par un autre formulaire "pricipal" et pas dans
un sous-formulaire ?

En te remerciant une nouvelle fois pour tous tes conseils,

Christophe



Salut,

Si je comprends bien... (pas sûr ;)

Dans ta table principale, ta numérotation des enregistrements sont:

1, 2, 3, 4, 5, 6....

dans ta table secondaire, la clé externe qui sera identique et un second
champ qui doit repartir à 1 à chaque incrémentation de la clé externe

1 - 1, 1 - 2, 1 - 3, 1 - 4 ....
2 - 1, 2 - 2, 2 - 3 ...

c'est ca ?

dans ce cas, tu peux numéroter ton second champ en vérifiant les
enregistrements qui correspondent à la clé externe:

If Me.Newrecord Then
'sur une ligne...
SecondChamp > Nz(DMax("ChampSecondaire","Tablesecondaire","CleExt="
& Me.Parent.ClePrimaire),0)+1

End if


PS:
Dans "Me.Parent.ClePrimaire" tu dois remplacer "CléPrimaire"
par le nom de la clé primaire du formulaire principal.


--
A+
Pierre (3stone) Access MVP
Perso: http://users.skynet.be/accesshome/
Conseils MPFA: http://users.skynet.be/mpfa/
Email : http://www.cerbermail.com/?Xfg61Z3IQw





Avatar
3stone
re,

"Christophe"
[...]
| De plus, après avoir arrêté le débogage lié à cette erreur, un
| enregistrement est systématiquement ajouté dans la table source du
| sous-formulaire,
| même sans avoir cliqué dans un contrôle de ce sous-formulaire.
|
| Y aurait-il moyen de rajouter un enregistrement dans la table source du
| sous-formulaire (la table secondaire) que lorsque l'on clique sur un contrôle
| du sous-formulaire ? Ou bien la table secondaire, source du sous formulaire
| actuel, doit-elle être remplie par un autre formulaire "pricipal" et pas dans
| un sous-formulaire ?


Il faut que l'enregistrement de la table principale existe, avant de pouvoir
ajouter un "fils" dans la table secondaire...


Si tu n'y arrive pas, envoie moi ta base avec juste ce qu'il faut
(les 2 tables et le formulaire)


--
A+
Pierre (3stone) Access MVP
Perso: http://users.skynet.be/accesshome/
Conseils MPFA: http://users.skynet.be/mpfa/
Email : http://www.cerbermail.com/?Xfg61Z3IQw
Avatar
Christophe
Merci réellement pour ton aide.

Je t'envoie les tables et les 2 formulaires qui me posent problème, comme tu
me l'as proposé.

En fait, je n'arrive à enregistrer correctement les données qu'avec 2
formulaires "principaux" ...
Mais la solution du sous formulaire m'intéresse toujours.
Cependant, avec cette solution, je n'arrive pas à saisir l'enregistrement
dans la table principale,
le sous formulaire me semble avoir le focus avant le formulaire principal...

Christophe