Bonsoir,
J'essaie d'afficher un sous-formulaire à partir d'une sélection multi-critères (cf. Formulaire F_Visu dans la base jointe). J'ai écrit (copié et adapté ...) une macro pour un des critères (choix dans une zone de liste) mais je ne sais pas comment m'y prendre pour la combiner avec les autres zones de liste.
Savez vous comment ?
http://user.services.openoffice.org/fr/ ... 095005.odb
[Résolu] [Base] Sélection multi-critères dans un formulaire
Modérateur : Vilains modOOs
Règles du forum
Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !

Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
-
- NOOuvel adepte
- Messages : 14
- Inscription : 21 sept. 2007 20:08
[Résolu] [Base] Sélection multi-critères dans un formulaire
Dernière modification par ema le 06 nov. 2007 17:57, modifié 2 fois.
3.0 sous Windows Vista
-
- Grand Maître de l'OOffice
- Messages : 11276
- Inscription : 02 mai 2006 08:42
Bonjour
Base exemple : http://user.services.openoffice.org/fr/ ... 034152.odb
A priori ce genre de sélection est "cumulative" : les critères permettent d'affiner successivement les choix. Il serait possible de compliquer l'interface en proposant un choix d'opérateur.
La gestion de tout cela en serait d'autant compliquée...
Pour faire vite, ci-joint un exemple où on cumule donc simplement.
Comme ta liste "région" comprend une entrée "Toutes", on se sert de celle-ci pour "réinitialiser" les choix faits ailleurs, sachant que lorsqu'une entrée est déjà sélectionnée, sa "re-sélection" ne déclenche pas la macro.
En toute rigueur il faudrait donc compléter pour gérer les annulations de filtre sur les autres listes.
L'objectif étant de montrer comment on peut utiliser plusieurs critères je me suis limité à ce qui suit.
Les sélections en SQL se font avec une mot clé WHERE derrière lequel on indique les critères. Ne sachant pas à l'avance quelle liste sera utilisée pour filtrer en premier et pour éviter de gérer l'ajout de ce mot clé, j'ai déjà ajouté un filtre "fictif" avec comme condition TRUE = TRUE (autrement dit vrai = vrai) pour sélectionner tous les enregistrement au départ.
Base exemple : http://user.services.openoffice.org/fr/ ... 034152.odb
A priori ce genre de sélection est "cumulative" : les critères permettent d'affiner successivement les choix. Il serait possible de compliquer l'interface en proposant un choix d'opérateur.
La gestion de tout cela en serait d'autant compliquée...
Pour faire vite, ci-joint un exemple où on cumule donc simplement.
Comme ta liste "région" comprend une entrée "Toutes", on se sert de celle-ci pour "réinitialiser" les choix faits ailleurs, sachant que lorsqu'une entrée est déjà sélectionnée, sa "re-sélection" ne déclenche pas la macro.
En toute rigueur il faudrait donc compléter pour gérer les annulations de filtre sur les autres listes.
L'objectif étant de montrer comment on peut utiliser plusieurs critères je me suis limité à ce qui suit.
Les sélections en SQL se font avec une mot clé WHERE derrière lequel on indique les critères. Ne sachant pas à l'avance quelle liste sera utilisée pour filtrer en premier et pour éviter de gérer l'ajout de ce mot clé, j'ai déjà ajouté un filtre "fictif" avec comme condition TRUE = TRUE (autrement dit vrai = vrai) pour sélectionner tous les enregistrement au départ.
Code : Tout sélectionner
option explicit
function PysActualiser(PysEvt as object)
dim PysList as object, PysForm as object
dim PysSQL as string, PysChoix as string
dim PysRep as integer
PysList = PysEvt.source 'La liste déroulante
PysChoix = PysList.SelectedItem 'Choix fait dans la liste
PysForm = PysList.model.Parent.getByName("List_Cave") 'On "remonte" au parent (le formulaire)
PysSQL = PysForm.command
select case PysList.Model.Name
case "B_Actualiser"
PysSQL = ""
case "ListMillesime"
PysSQL = PysSQL & " AND Millesime = " & PysChoix
case "ListCouleur"
PysSQL = PysSQL & " AND Couleur = '" & PysChoix & "'"
case "ListAppellation"
PysSQL = PysSQL & " AND Appellation = '" & PysChoix & "'"
case "ListRegion"
if PysChoix = "Toutes" then
PysSQL = "SELECT * FROM T_Reg_App_Cave_List WHERE TRUE = TRUE"
else
PysSQL = PysSQL & " AND Region = '" & PysChoix & "'"
end if
end select
PysForm.command = PysSQL 'Redéfinition de la source du formulaire
PysForm.reload 'Recharge le formulaire
PysActualiser=true
End function
-
- NOOuvel adepte
- Messages : 14
- Inscription : 21 sept. 2007 20:08
Merci pour cette réponse. Elle m'a permis d'aller plus loin.
J'ai essayé de faire une sélection non cumulative c'est à dire qui reconstruit à chaque fois l'ordre SQL pour afficher le sous-formulaire.
L'écriture n'est pas très élégante et impose que l'ordre des zones de liste ne soit pas modifié mais cela semble marcher.
J'ai essayé de faire une sélection non cumulative c'est à dire qui reconstruit à chaque fois l'ordre SQL pour afficher le sous-formulaire.
L'écriture n'est pas très élégante et impose que l'ordre des zones de liste ne soit pas modifié mais cela semble marcher.
Code : Tout sélectionner
'Evènement bouton Archivées ou Encours
PysChoix1N = PysEvt.source
PysFormParent = PysChoix1N.model.Parent
PysSousForm = PysChoix1N.model.Parent.getByName("List_Cave")
'Modification de l'accès à la base
Select Case PysChoix1N.Model.Tag
'Archivées
Case "A"
If PysChoix1N.Model.State = 1 then
PysSQL = "SELECT * FROM T_Region_Appel_Cave_List WHERE Archive = 'True'"
end if
'En cours
Case "E"
If PysChoix1N.Model.State = 1 then
PysSQL = "SELECT * FROM T_Region_Appel_Cave_List WHERE Archive = 'False'"
end if
Case Else
PysSQL = "SELECT * FROM T_Region_Appel_Cave_List WHERE Archive = 'False'"
End Select
'Concaténation avec choix région
ChoixRegion = PysformParent.ControlModels(0).CurrentValue
if ChoixRegion <> "" and ChoixRegion <> "TOUTES" then
PysSQL = PysSQL & " AND Region = '" & ChoixRegion & "'"
end if
'Concaténation avec choix appellation
ChoixAppel = PysformParent.ControlModels(1).CurrentValue
if ChoixAppel <> "" and ChoixAppel <> "TOUTES" then
PysSQL = PysSQL & " AND Appellation = '" & ChoixAppel & "'"
end if
'Concaténation avec choix couleur
ChoixCouleur = PysformParent.ControlModels(2).CurrentValue
if ChoixCouleur <> "" and ChoixCouleur <> "TOUTES" then
PysSQL = PysSQL & " AND Couleur = '" & ChoixCouleur & "'"
end if
'Concaténation avec choix millésime
ChoixMillesime = PysformParent.ControlModels(3).CurrentValue
if ChoixMillesime <> "" and ChoixMillesime <> "TOUS" then
PysSQL = PysSQL & " AND Millesime = '" & ChoixMillesime & "'"
end if
'Modification de la source SQL et rechargement du sous-formulaire List_cave
PysSousForm.Command = PysSQL
PysSousForm.reload()
3.0 sous Windows Vista