Sub Afficher(oEv as Object)
Dim oForm as Object, Valeur as Variant
oForm = oEv.Source.Model.Parent
Valeur = oEv.Source.Model.CurrentValue
With oForm
.Filter="""NomComplet"" ='" & Valeur & "'"
.Applyfilter = True
If .isloaded = False Then
.load
Else
.reload
End If
End With
thisComponent.CurrentController.getControl(oForm.getByName("txtNom")).setFocus
oEv.Source.Model.SelectedItems = Array()
End Sub
Pour les formulaires Consultation - informations eleves et Modification - Informations Eleves.
Un peu plus compliqué pour le formulaire Modification - Inscriptions et locations.
Sub Filtre (oEv as Object)
Dim oForm as Object
Dim strEleve as String, intEleve as Integer, strAnnee as String, intAnnee as Integer
oForm = oEv.Source.Model.Parent
Select Case oEv.Source.Model.Name
Case "supFiltre"
With oForm
.getByName("lstEleves").SelectedItems = Array()
.getByName("lstAnnees").SelectedItems = Array()
.Applyfilter = False
End With
Case Else
strEleve = oForm.getByName("lstEleves").CurrentValue
strAnnee = oForm.getByName("lstAnnees").CurrentValue
If strEleve = "" Or strAnnee = "" Then
MsgBox "Les deux contrôles de filtrage doivent être renseignés"
Exit Sub
End If
intEleve = RecupererIdentifiant("rEleves","ID_Eleves","NomComplet",strEleve)
intAnnee = RecupererIdentifiant("Années","ID_Annee","Année",strAnnee)
oForm.Filter = """ID_Eleves"" =" & intEleve & " AND ""ID_Annee"" = " & intAnnee
oForm.Applyfilter = True
End Select
oForm.Reload
End Sub
A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Merci beaucoup, c'est tout à fait ce que je voulais et ça marche bien.
Cependant, est-ce que tu pourrais m'expliquer rapidement ton code stp ?
J'aimerais créer d'autres formulaires avec des filtres du même genre sans avoir besoin de vous redemander la même chose plusieurs fois. Par exemple un formulaire qui affiche la liste des élèves dans une classe donnée par année, avec une liste pour sélectionner la classe, une seconde pour sélectionner l'année.
J'imagine que le code restera globalement le même, il faudra juste changer quelques variables ? Mais lesquelles...
Bonsoir
Les deux cas sont différents.
Une petite précision, dans AOO, les listes déroulantes non affectées à un champ de la table ne permettent pas d'afficher un valeur et d'en récupérer une autre.
Pour la première procédure :
la liste déroulante (elle n'est affectée à aucun champ de la table) affiche le nom complet des élèves.
La même donnée existe dans la requête sur laquelle le formulaire est basé.
Il suffit donc de filtrer le jeux d'enregistrement du formulaire avec la valeur sélectionnée dans la liste.
Le code commenté :
Sub Afficher(oEv as Object)
Dim oForm as Object, Valeur as Variant
'oEv est l'événement qui déclenche la macro
'oEv.Source.Model est le modèle du contrôle qui déclenche l'événement
'Le parent du modèle, donc le formulaire
oForm = oEv.Source.Model.Parent
'La valeur sélectionnée dans la liste
Valeur = oEv.Source.Model.CurrentValue
'Application du filtre
With oForm
.Filter="""NomComplet"" ='" & Valeur & "'"
.Applyfilter = True
'Recharchement du formulaire filtré
If .isloaded = False Then
.load
Else
.reload
End If
End With
'Mise du focus sur le champ Nom
thisComponent.CurrentController.getControl(oForm.getByName("txtNom")).setFocus
'Suppression de la sélection dans la liste
oEv.Source.Model.SelectedItems = Array()
End Sub
Pour la seconde procédure :
Dans ce cas, les listes (toujours pas affectées à des champs de la table) affichent le nom complet des élèves et la saison.
Ces valeurs n'existent pas dans la table sous-jacente au formulaire, la table ne stocke que les identifiants.
Le but de la fonction RecupererIdentifiant est de récupérer ces identifiant en lui donnant les paramètres qui vont bien.
Une fois les identifiants récupérés, le principe est le même, il suffit de filtrer le jeux d'enregistrement avec les valeurs récupérées.
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64