Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Synchronisation deux formulaires

14 réponses
Avatar
William Kameron
Bonjour à tous.

Je tente de synchroniser dans un formulaire deux sous formulaires renvoyant
les enregistrements d'une même table dont l'un en liste "mode tabulaire" et
l'autre détaillé en "Mode Colonne".

J'ai tenté sans succès dans l'évènement "Current" l'expression suivante:

Dans Form_Classes_F1
Me.Parent![Classes_F2].Form.RecordsetClone.FindFirst "[RéfClasse] = " &
Me![RéfClasse]
Me.Parent![Classes_F2].Bookmark =
Me.Parent![Classes_F2].RecordsetClone.Bookmark


Dans Form_Classes_F2
Me.Parent![Classes_F1].Form.RecordsetClone.FindFirst "[RéfClasse] = " &
Me![RéfClasse]
Me.Parent![Classes_F1].Bookmark =
Me.Parent![Classes_F1].RecordsetClone.Bookmark


Que faut-il faire ?

4 réponses

1 2
Avatar
William Kameron
Bonjour. Merci 3Stone pour le coup de main.

Nous célébrons chez nous demain le "1er Mai - Fête des travailleurs"
Bonne fête à tous.

Actuellement j'ai toujours mon formulaire qui fonctionne dans un sens : Le
changement d'enregistrement dans sous form F1 (Formulaires continus -
tableau) induit celui de sous form F2 (Formulaire unique). Mais pas dans
l'autre. En fait le challenge est que cela soit réciproque.

Dans sous form F2, en écrivant :
Private Sub Form_Current()
On Error GoTo Err_Current
Dim Ctrl As Control

Set Ctrl = Me.Parent!F1
With Me.Parent!F1.Form.RecordsetClone
.FindFirst "[Réf]= " & Me.Réf
Ctrl.Form.Bookmark = .Bookmark
End With

Exit_Current:
Set Ctrl = Nothing
Exit Sub

Err_Current:
Select Case Err.Number
Case 2465, 2455, 91
Debug.Print Err.Number & " " & Err.Description
Resume Next

Case Else
Debug.Print Err.Number & " " & Err.Description
MsgBox Err.Number & vbCr & Err.Description
Resume Exit_Current
End Select

End Sub

nous avons l'erreur :
"2465 Impossible de trouver le champ 'SousFormF1' auquel il est fait
référence dans votre expression."

Dans F1, malgré ces erreurs, nous avons bel et bien le changement
d'enregistrement dans F2. Dans l'autre, le selecteur s'obstine à ne pas se
déplacer.

Merci encore. Et puis c'est pas trop tard. Je prend mon temps car cela fais
plus d'un bon bout de temps que je sèche sur cette expression.



Salut,

| "William Kameron"
|| Dans un contrôle Onglet je suis parvenu à un résultat apréciable.
|| En programmant l'évenement "OnChange" de l'onglet je peux raffraîchir la
|| page juste avant qu'elle ne s'affiche et retrouver mon enregistrment que j'ai
|| quitté de l'autre côté.
|| C'est déjà pas mal. C'est embêtant. Je voulais les deux en vis-à-vis. comme
|| un "SCROLL"
| [...]
|
| Je dois m'absenter... ce sera pour tantôt...


Le "tantôt" s'est éternisé, désolé...


Bon, pour tes deux sous-formulaire, tu peux mettre dans l'événement
"Sur activation" (form_current) ceci :

'---- sous-form Classes_f2

Dim Ctrl As Control
Set Ctrl = Me.Parent!Ctrl_Classes_F2

With Me.Parent!Ctrl_Classes_F2.Form.RecordsetClone
.FindFirst "NomPK=" & NomPK
Ctrl.Form.Bookmark = .Bookmark
End With

Set Ctrl = Nothing

'---- sous-form Classes_f1

Dim Ctrl As Control
Set Ctrl = Me.Parent!Ctrl_Classes_F1

With Ctrl.Form.RecordsetClone
.FindFirst "NomPK=" & NomPK
Ctrl.Form.Bookmark = .Bookmark
End With

Set Ctrl = Nothing

---------------------------------------

NomPK :
représente le nom de la clé primaire, identique pour les 2 sous-form

Ctrl_Classes_F1 :
représente le control sous-formulaire qui contient le formulaire Classes_F1
(qui n'a pas *forcément* le même nom que le form qu'il contient)

idem pour Ctrl_Classes_F2

A l'ouverture du formulaire "principal", tu risque d'obtenir une errreur
(dû à l'ouverture séquencielle des 2 sous-form ;-( )
tu cliqueras sur ok et cela fonctionnera tout de même...
si tel est bien le cas chez toi - dis le pour adaption


et encore désolé pour le retard et... je repart aussitôt :-(

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)






Avatar
3stone
Salut,

"William Kameron"
| Actuellement j'ai toujours mon formulaire qui fonctionne dans un sens : Le
| changement d'enregistrement dans sous form F1 (Formulaires continus -
| tableau) induit celui de sous form F2 (Formulaire unique). Mais pas dans
| l'autre. En fait le challenge est que cela soit réciproque.
[...]


Dans le Form_Current du sous-form2 tu mets :

sFrm_Loaded = True ' (expliqué plus loin...)
Dim Ctrl As Control
Set Ctrl = Me.Parent!CtrlF1
With Me.Parent!CtrlF1.Form.RecordsetClone
.FindFirst "[Réf]= " & Me.Réf
Ctrl.Form.Bookmark = .Bookmark
End With

Dans le Form_Open du sous-form2 tu mets :

sFrm_Loaded = false


Dans le Form_Current du sous-form1 tu mets :

Dim Ctrl As Control
if sFrm_Loaded then ' teste en fait l'autre sous-form
Set Ctrl = Me.Parent!CtrlF2
With Me.Parent!CtrlF2.Form.RecordsetClone
.FindFirst "[Réf]= " & Me.Réf
Ctrl.Form.Bookmark = .Bookmark
End With
end if


Dans un module général, tu déclare la variable :

Public sFrm_Loaded as Boolean


L'explication :
Les sous-formulaires se charge les uns après les autres.
Lorsque le premier sous-form est chargé, il produit également
ses événements (via lesquels on exécute les procédures...)
Or, lorsque le premier sous-form exécure son "OnCurrent", l'autre
sous-form n'est pas encore chargé et possède encore moins
un "recordset" (et à foriori un recordsetclone).
C'est de la que vient l'erreur 2455 :-((
Il faut donc s'arranger pour que le premier sous-formulaire chargé
n'exécute le code sur son "OnCurrent" qu'à partir du moment que
l'autre est "pret"
C'est ce qu'on obtient en positionnant la variable sfm_loaded
sur Vrai dans l'autre sous-formulaire.

Note 1
L'ordre de chargement des sous-formulaires dépend de leur ordre
de création. Il se peut donc parfaitement que tu dois déplacer le test
sur la variable sfrm_loaded dans l'autre sous-form...
Si à l'ouverture du formulaire tu obtiens l'erreur 2455, tu sais que
tu dois déplacer le test dans l'autre sous-form.

Note 2
Tu écrit F1 et F2 pour les sous-formulaires...
Il faut t'assurer que tu t'adresse bien au control qui *contient* le sous
formulaire. Les assistants utilise malheureusement les mêmes noms
pour les deux - le conteneur et le contenu...
C'est pourquoi je préfixe par "Ctrl" et l'on distingue le CtrlF1 qui est
le conteneur de F1 qui est le contenu...

Evites aussi les accentués dans les noms d'objets ;-)

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)
Avatar
William Kameron
BINGO !
Ca marche !

Merci "3Stone"
Je vais généraliser la pratique de cet outil dans le traitement des tables
de paramétrage de mes applications.

Cet outil me permet de naviguer concomitament dans une formulaire de type
"Liste"
et dans un formulaire de type détails dans lequel j'affiche tout le contenu
de la table.

Mille merci.



Salut,

"William Kameron"
| Actuellement j'ai toujours mon formulaire qui fonctionne dans un sens : Le
| changement d'enregistrement dans sous form F1 (Formulaires continus -
| tableau) induit celui de sous form F2 (Formulaire unique). Mais pas dans
| l'autre. En fait le challenge est que cela soit réciproque.
[...]


Dans le Form_Current du sous-form2 tu mets :

sFrm_Loaded = True ' (expliqué plus loin...)
Dim Ctrl As Control
Set Ctrl = Me.Parent!CtrlF1
With Me.Parent!CtrlF1.Form.RecordsetClone
.FindFirst "[Réf]= " & Me.Réf
Ctrl.Form.Bookmark = .Bookmark
End With

Dans le Form_Open du sous-form2 tu mets :

sFrm_Loaded = false


Dans le Form_Current du sous-form1 tu mets :

Dim Ctrl As Control
if sFrm_Loaded then ' teste en fait l'autre sous-form
Set Ctrl = Me.Parent!CtrlF2
With Me.Parent!CtrlF2.Form.RecordsetClone
.FindFirst "[Réf]= " & Me.Réf
Ctrl.Form.Bookmark = .Bookmark
End With
end if


Dans un module général, tu déclare la variable :

Public sFrm_Loaded as Boolean


L'explication :
Les sous-formulaires se charge les uns après les autres.
Lorsque le premier sous-form est chargé, il produit également
ses événements (via lesquels on exécute les procédures...)
Or, lorsque le premier sous-form exécure son "OnCurrent", l'autre
sous-form n'est pas encore chargé et possède encore moins
un "recordset" (et à foriori un recordsetclone).
C'est de la que vient l'erreur 2455 :-((
Il faut donc s'arranger pour que le premier sous-formulaire chargé
n'exécute le code sur son "OnCurrent" qu'à partir du moment que
l'autre est "pret"
C'est ce qu'on obtient en positionnant la variable sfm_loaded
sur Vrai dans l'autre sous-formulaire.

Note 1
L'ordre de chargement des sous-formulaires dépend de leur ordre
de création. Il se peut donc parfaitement que tu dois déplacer le test
sur la variable sfrm_loaded dans l'autre sous-form...
Si à l'ouverture du formulaire tu obtiens l'erreur 2455, tu sais que
tu dois déplacer le test dans l'autre sous-form.

Note 2
Tu écrit F1 et F2 pour les sous-formulaires...
Il faut t'assurer que tu t'adresse bien au control qui *contient* le sous
formulaire. Les assistants utilise malheureusement les mêmes noms
pour les deux - le conteneur et le contenu...
C'est pourquoi je préfixe par "Ctrl" et l'on distingue le CtrlF1 qui est
le conteneur de F1 qui est le contenu...

Evites aussi les accentués dans les noms d'objets ;-)

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)




Avatar
3stone
Salut,

"William Kameron"
| BINGO !
| Ca marche !

Si cela te convient et fonctionne comme tu le souhaite, c'est ok ;-)

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)
1 2