[Résolu] [Base] Sélection multi-critères dans un formulaire

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: 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 !
ema
NOOuvel adepte
NOOuvel adepte
Messages : 14
Inscription : 21 sept. 2007 20:08

[Résolu] [Base] Sélection multi-critères dans un formulaire

Message par ema »

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
Dernière modification par ema le 06 nov. 2007 17:57, modifié 2 fois.
3.0 sous Windows Vista
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

Message par Pierre-Yves Samyn »

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.

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
ema
NOOuvel adepte
NOOuvel adepte
Messages : 14
Inscription : 21 sept. 2007 20:08

Message par ema »

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.

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