Bonjour,
Voila ce que j'ai créé pour simuler ta situation.
Table TXD (Code Projet, LCN, Série, Version, Variante, Quantite, Designation, Rang LCN, LCN Père)
Table TXH (Code Projet, LCN, Série, Version, Variante, Ref)
Formulaire principal basé sur TXD.
Contrôle zone de texte tb_CodeProjet <--> champ Code Projet
Contrôle zone de texte tb_LCN <--> champ LCN
Contrôle zone de liste lb_ListeConf
  contenu :
SELECT [TXD].[Code Projet], [TXD].[LCN], [TXD].[Série], [TXD].[Version], [TXD].[Variante], [TXD].[Quantite] FROM TXD WHERE (((TXD.[Code Projet])=[]![tb_CodeProjet]) AND ((TXD.LCN)=[]![tb_LCN]));
  Colonne liée : 0
  Nbre de colonne : 6
  Largeur colonnes : 0cm;0cm;3cm;2cm;2cm;2cm
Code événementiel:
Formulaire : Sur Activation (Form_Current())
zone de liste lb_ListeConf : Après MAJ (lb_ListeConf_AfterUpdate())
Module de code du formulaire.
Partie déclaration (variables globales)
1 2
| Dim blnEvFormCurrent As Boolean
Dim blnEvlb_ListeConf As Boolean |
Code événement Sur Activation (formulaire)
1 2 3 4 5 6
| Private Sub Form_Current()
If blnEvlb_ListeConf Then Exit Sub
blnEvFormCurrent = True
Call SyncList
blnEvFormCurrent = False
End Sub |
Code événement Après MAJ (lb_ListeConf)
1 2 3 4 5 6 7 8
| Private Sub lb_ListeConf_AfterUpdate()
If Me.lb_ListeConf.ListIndex = -1 Then Exit Sub
If blnEvFormCurrent Then Exit Sub
blnEvlb_ListeConf = True
Call SyncForm
blnEvlb_ListeConf = False
End Sub |
Les Sub appelées par les évènements:
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 46 47 48 49 50 51
| Sub SyncList()
Dim strKeyF As String, strKeyL As String
Dim i As Integer
' re-exécute requête de la liste si nécessaire
' (filtrée sur Code Projet et [LCN] du formulaire)
If Me.lb_ListeConf.ListCount > 0 Then
If Me.lb_ListeConf.Column(0) <> Me.tb_CodeProjet _
Or Me.lb_ListeConf.Column(1) <> Me.tb_LCN Then
Me.lb_ListeConf.Requery
End If
Else
Me.lb_ListeConf.Requery
End If
' concaténe les 5 chps clés du formulaire
strKeyF = Nz([Code Projet]) & Nz([LCN]) & _
Nz([Série]) & Nz([Version]) & Nz([Variante])
For i = 1 To Me.lb_ListeConf.ListCount
' concaténe 2 premiers chps clés du formulaire et
' les 3 1eres colonnes de la liste
strKeyL = [Code Projet] & [LCN] & _
Me.lb_ListeConf.Column(2, i - 1) & _
Me.lb_ListeConf.Column(3, i - 1) & _
Me.lb_ListeConf.Column(4, i - 1)
' Si clés identiques sélectionner ligne de la liste
If strKeyL = strKeyF Then
Me.lb_ListeConf = i - 1 ' Colonne liée = 0 => ListIndex
' cette méthode ne fonctionne pas
'Me.lb_ListeConf.Selected(i - 1) = True
Exit For
End If
Next
End Sub
Sub SyncForm()
Dim strRecherche As String, rs As DAO.Recordset
strRecherche = "[Code Projet]='" & Nz([Code Projet]) & "'"
strRecherche = strRecherche & " AND [LCN]='" & Nz([LCN]) & "'"
strRecherche = strRecherche & " AND [Série]='" & Me.lb_ListeConf.Column(2) & "'"
strRecherche = strRecherche & " AND [Version]='" & Me.lb_ListeConf.Column(3) & "'"
strRecherche = strRecherche & " AND [Variante]='" & Me.lb_ListeConf.Column(4) & "'"
Set rs = Me.RecordsetClone
rs.FindFirst strRecherche
If Not rs.NoMatch Then
Me.Bookmark = rs.Bookmark
End If
End Sub |
Les deux variables booléennes me servent à éviter que les événements ne se déclenchent en boucle.
Essaie déjà avec ça. On verra le cas du sous-formulaire ensuite.
A+
Partager