[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 !
sebmdp
Membre hOOnoraire
Membre hOOnoraire
Messages : 125
Inscription : 08 juil. 2008 16:31
Localisation : Orleans / France

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

Message par sebmdp »

Bonjour à toutes & tous.

Ma question fait suite à ce tutoriel : http://user.services.openoffice.org/fr/ ... 662#p81395
Plus particulièrement au message de Pierre-Yves Samyn le 01 Fév 2009 13:19. A ce propos un grand merci car cela fonctionne à merveille.

J'essaye d'adapter ce code en remplaçant les zones listes par des cases à cocher.
J'ai donc changer le nom des listes dans le code par celles de mes cases à cocher, rentrer les valeurs d'état 1 & 0 dans les propriétés des cases, & modifier ainsi les parties "with" du code (le code complet étant sur le fil cité plus haut)

Code : Tout sélectionner

with PysForm.getByName("MaBox01")
   if .currentValue <> "" then 'Si la liste n'est pas vide (chargement du formulaire)
      redim PysChoix(0)
      if .currentValue = "1"  then
         PysChoix(0) = " MonChamp" = 'MaValeur'"
      else
         PysChoix(0) = " MonChamp LIKE '*'"
      end if   
   end if
end with
Je n'obtiens aucune erreur de code, mais le résultat de ma requête me donne toujours un résultat pour une valeur '0' de "MaBox01".
Autrement dit que je coche ou non mes cases le résultat est le même, ma requête n'est pas filtrée.
J'ai bien associé le déclenchement de ma macro à l'événement statut modifié de mes case à cocher. Les données de mon formulaire (& de sa table de contrôle), ainsi que dans la macro sont bien une instruction SQL du type

Code : Tout sélectionner

SELECT * FROM MaRequête
J'ai tourner le code dans tous les sens (enfin presque puis que je n'ai trouvé la solution...) avec des fonctions booléennes, l'état '.state', rajouté une condition if, etc... mais toujours sans résultat. Ne serait-ce pas si simple que j'aurais pu le croire ?
Par avance, merci.
Seb.

PS : J'ai le même formulaire avec des zones (sur d'autres critères) qui lui fonctionne.
Dernière modification par Oukcha le 23 févr. 2009 16:56, modifié 3 fois.
Raison : Balisage : avisé par MP
Open Office 3.2.1
Mac OS 10.5.8
Avatar de l’utilisateur
MrPropre
MOOdérateur
MOOdérateur
Messages : 1138
Inscription : 01 oct. 2008 16:54

Re: [Base] Sélection multi-critères dans un formulaire

Message par MrPropre »

Bonsoir,



Afin que l'on puisse vous répondre de façon correcte, ne détachez pas votre signature, cette information peut s'avérer essentielle.

Pour rattacher votre signature, un fois connecté :
  • Cliquez sur Panneau de l'utilisateur (en haut à gauche)
  • Onglet Préférences du forum > Modifier les options d'affichage
  • Sélectionnez le bouton radio Oui pour Afficher les signatures
  • Cliquez sur Envoyer
En plus du code, fournissez un fichier complet. Cela augmentera vos chances de réponse en évitant d'avoir à recréer quelque chose qui au final, pourrait ne pas convenir.

Merci de votre participation et de nous faciliter le travail de modération.

Cordialement, l'équipe de modération.
Nettoyez votre PC du piratage, utilisez des logiciels libres à chaque lavage.
Une seule dose de OpenOffice suffit à éliminer durablement toute trace de MS-Office.
sebmdp
Membre hOOnoraire
Membre hOOnoraire
Messages : 125
Inscription : 08 juil. 2008 16:31
Localisation : Orleans / France

Re: [Base] Sélection multi-critères dans un formulaire

Message par sebmdp »

Bonjour,

Voici donc les informations manquantes :
La base en pj, le code en question complet ci après. Ce code est rattaché au formulaire "F_RSommeT2F_ByT2F" dont les données sont issues de la requête "RSommeParT2F" fondée elle même sur la "Vue1" crée à partir de la table "Ecritures".

Code : Tout sélectionner

option explicit

sub PysActualiser(PysEvt as object)

dim PysForm as object, PysRadio as object
dim PysSQL as string, PysChoix() as string, PysOper as string
dim PysNb as integer

PysForm = PysEvt.source.model.Parent				'On "remonte" au parent (le formulaire)
PysRadio = PysForm.getByName("RadioGroup1")			'Les boutons radio soit ET (1), soit OU (2)

PysOper = iif(PysRadio.state = 0, " OR " , " AND ")

PysSQL = "SELECT * FROM RSommeParT2F WHERE " 

with PysForm.getByName("CheckBoxLog")
	if .currentValue <> "" then 		'Si la liste n'est pas vide (chargement du formulaire)
		redim PysChoix(0)
		if .currentValue = "1"  then
			PysChoix(0) = " TypeDeFrais = 'Logement'"
		else
			PysChoix(0) = " TypeDeFrais LIKE '*'"
	end if
end if	
end with

with PysForm.getByName("CheckBoxTax")
	if .currentValue <> "" then
		PysNb = ubound(PysChoix())+1
		redim preserve PysChoix(PysNb)
		if .currentValue = "1"  then
			PysChoix(PysNb) = " TypeDeFrais = 'Taxes'"
		else
			PysChoix(PysNb) = " TypeDeFrais LIKE '*'"
		end if
	end if
end with

with PysForm.getByName("CheckBoxCour")
	if .currentValue <> "" then
		PysNb = ubound(PysChoix())+1
		redim preserve PysChoix(PysNb)
		if .currentValue = "1"  then
			PysChoix(PysNb) = " TypeDeFrais = 'Courant'"
		else
			PysChoix(PysNb) = " TypeDeFrais LIKE '*'"
		end if
	end if
end with

with PysForm.getByName("CheckBoxCom")
	if .currentValue <> "" then
		PysNb = ubound(PysChoix())+1
		redim preserve PysChoix(PysNb)
		if .currentValue = "1"  then
			PysChoix(PysNb) = " TypeDeFrais = 'Com'"
		else
			PysChoix(PysNb) = " TypeDeFrais LIKE '*'"
		end if
	end if
end with

with PysForm.getByName("CheckBoxPro")
	if .currentValue <> "" then
		PysNb = ubound(PysChoix())+1
		redim preserve PysChoix(PysNb)
		if .currentValue = "1"  then
			PysChoix(PysNb) = " TypeDeFrais = 'Pro'"
		else
			PysChoix(PysNb) = " TypeDeFrais LIKE '*'"
		end if
	end if
end with

with PysForm.getByName("CheckBoxVac")
	if .currentValue <> "" then
		PysNb = ubound(PysChoix())+1
		redim preserve PysChoix(PysNb)
		if .currentValue = "1"  then
			PysChoix(PysNb) = " TypeDeFrais = 'Vacances'"
		else
			PysChoix(PysNb) = " TypeDeFrais LIKE '*'"
		end if
	end if
end with

with PysForm.getByName("CheckBoxLoi")
	if .currentValue <> "" then
		PysNb = ubound(PysChoix())+1
		redim preserve PysChoix(PysNb)
		if .currentValue = "1"  then
			PysChoix(PysNb) = " TypeDeFrais = 'Loisirs'"
		else
			PysChoix(PysNb) = " TypeDeFrais LIKE '*'"
		end if
	end if
end with

with PysForm.getByName("CheckBoxExc")
	if .currentValue <> "" then
		PysNb = ubound(PysChoix())+1
		redim preserve PysChoix(PysNb)
		if .currentValue = "1"  then
			PysChoix(PysNb) = " TypeDeFrais = 'Exceptionnel'"
		else
			PysChoix(PysNb) = " TypeDeFrais LIKE '*'"
		end if
	end if
end with

with PysForm.getByName("CheckBoxAut")
	if .currentValue <> "" then
		PysNb = ubound(PysChoix())+1
		redim preserve PysChoix(PysNb)
		if .currentValue = "1"  then
			PysChoix(PysNb) = " TypeDeFrais = 'Autres'"
		else
			PysChoix(PysNb) = " TypeDeFrais LIKE '*'"
		end if
	end if
end with

with PysForm.getByName("CheckBoxSan")
	if .currentValue <> "" then
		PysNb = ubound(PysChoix())+1
		redim preserve PysChoix(PysNb)
		if .currentValue = "1"  then
			PysChoix(PysNb) = " TypeDeFrais = 'Santé'"
		else
			PysChoix(PysNb) = " TypeDeFrais LIKE '*'"
		end if
	end if
end with

with PysForm.getByName("CheckBoxInt")
	if .currentValue <> "" then
		PysNb = ubound(PysChoix())+1
		redim preserve PysChoix(PysNb)
		if .currentValue = "1"  then
			PysChoix(PysNb) = " TypeDeFrais = 'Intra comptes'"
		else
			PysChoix(PysNb) = " TypeDeFrais LIKE '*'"
		end if
	end if
end with

with PysForm.getByName("CheckBoxSal")
	if .currentValue <> "" then
		PysNb = ubound(PysChoix())+1
		redim preserve PysChoix(PysNb)
		if .currentValue = "1"  then
			PysChoix(PysNb) = " TypeDeFrais = 'Salaires'"
		else
			PysChoix(PysNb) = " TypeDeFrais LIKE '*'"
		end if
	end if
end with

PysSQL = PysSQL & join(PysChoix, PysOper)

PysForm.command = PysSQL				'Redéfinition de la source du formulaire
PysForm.reload							'Recharge le formulaire

End sub
Ce code fonctionne donc avec des zones de listes (cf : formulaires "FViewParDate" ou "F_RSommeT2F_ByDate") mais j'aimerais l'adapter pour des cases à cocher.
Par avance, merci à toutes & tous, & toutes mes excuses pour n'avoir pas "respecté" les indications du forum.

Sebastien.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Open Office 3.2.1
Mac OS 10.5.8
cathala
Membre hOOnoraire
Membre hOOnoraire
Messages : 133
Inscription : 12 déc. 2007 13:42

Re: [Base] Sélection multi-critères dans un formulaire

Message par cathala »

Salut,
ton soucis vient que la valeur de tes cases dans ta macro ne passent pas à 1.
J'ai essayé une autre piste à toi de voir et de la compléter avec les autres cases?
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Windows 7 PRO Libre Office 4.1.3.2
Si je peu aider je n'hésite pas
sebmdp
Membre hOOnoraire
Membre hOOnoraire
Messages : 125
Inscription : 08 juil. 2008 16:31
Localisation : Orleans / France

Re: [Base] Sélection multi-critères dans un formulaire

Message par sebmdp »

Merci pour cette réponse mais malheureusement le résultat final reste le même.
Avec le code modifié, la valeur de la case à cocher reste à '1' & ne reprend plus la valeur '0'.

Ceci est facilement visible avec la fonction d'affichage que tu as insérée dans le code. Merci ! je ne connaissais pas & c'est très pratique.

Code : Tout sélectionner

print PysSQL
Les zones de groupe pour les case à cocher existent-elles ? Si oui & afin de forcer les états des cases, une déclaration de variable & d'état comme celle-ci en début de code comme pour les boutons radio fonctionnerait elle ?

Code : Tout sélectionner

dim PysCheckBox as object
dim PysOperCB as string

PysForm = PysEvt.source.model.Parent				'On "remonte" au parent (le formulaire)
PysCheckBox = PysForm.getByName("CheckBoxGroup1")			'Les case à cocher
	

PysOperCB = iif(PysCheckBox.state =  "0 " , " 1 ")
Encore merci pour l'aide & le temps passé.
Sebastien
Open Office 3.2.1
Mac OS 10.5.8
cathala
Membre hOOnoraire
Membre hOOnoraire
Messages : 133
Inscription : 12 déc. 2007 13:42

Re: [Base] Sélection multi-critères dans un formulaire

Message par cathala »

Désolé j'avais mis ..... currentvalue="0" au lieu de =0
On vas essayer de faire fonctionner les cases ensuite on verra pour la sélection de and et or
Et tous mettre à zéro au départ
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Windows 7 PRO Libre Office 4.1.3.2
Si je peu aider je n'hésite pas
sebmdp
Membre hOOnoraire
Membre hOOnoraire
Messages : 125
Inscription : 08 juil. 2008 16:31
Localisation : Orleans / France

Re: [Base] Sélection multi-critères dans un formulaire

Message par sebmdp »

Merci ! :super:
Cela fonctionne très bien & m'a permis de voir une erreur sur la construction de ma requête puisqu'elle me sort tous les résultats ou aucun ! Du coup j'ai modifié le critère "*" (tout) par EMPTY dans le code.
Voici donc un code possible pour une sélection multi-critères par case à cocher dans un formulaire :

Code : Tout sélectionner



option explicit


sub PysActualiser(PysEvt as object)

dim PysForm as object, PysRadio as object
dim PysSQL as string, PysChoix() as string, PysOper as string
dim PysNb as integer

PysForm = PysEvt.source.model.Parent				'On "remonte" au parent (le formulaire)
PysRadio = PysForm.getByName("RadioGroup1")			'Les boutons radio soit ET (1), soit OU (2)
	

PysOper = iif(PysRadio.state = 0, "OR " , " AND ")

print PysOper										'Option pour afficher boite de dialogue sur le choix ET soit OU

PysSQL = "SELECT * FROM RSommeParT2F WHERE " 

Redim PysChoix(0)													'Défini la variable PysChoix à n0
    If PysForm.getByName("CheckBoxLog").currentValue = 0 then 		'lecture de l'état de la checked box
    PysChoix(0) =  " TypeDeFrais LIKE 'EMPTY'"		
		else
		PysChoix(0) = " TypeDeFrais = 'Logement'"
	end if

PysNb = ubound(PysChoix())+1										'Défini la variable PysChoix à n0+1
	redim preserve PysChoix(PysNb)
	    If PysForm.getByName("CheckBoxTax").currentValue = 0 then 
    	PysChoix(PysNb) =  " TypeDeFrais LIKE 'EMPTY'"		
			else
			PysChoix(PysNb) = " TypeDeFrais = 'Taxes'"
		end if

PysNb = ubound(PysChoix())+1										'Défini la variable PysChoix à n0+1+1
	redim preserve PysChoix(PysNb)
	    If PysForm.getByName("CheckBoxCour").currentValue = 0 then 
	    PysChoix(PysNb) =  " TypeDeFrais LIKE 'EMPTY'"		
			else
			PysChoix(PysNb) = " TypeDeFrais = 'Courant'"
		end if

PysNb = ubound(PysChoix())+1
	redim preserve PysChoix(PysNb)
	    If PysForm.getByName("CheckBoxCom").currentValue = 0 then 
	    PysChoix(PysNb) =  " TypeDeFrais LIKE 'EMPTY'"		
			else
			PysChoix(PysNb) = " TypeDeFrais = 'Com'"
		end if

PysNb = ubound(PysChoix())+1
	redim preserve PysChoix(PysNb)
	    If PysForm.getByName("CheckBoxPro").currentValue = 0 then 
	    PysChoix(PysNb) =  " TypeDeFrais LIKE 'EMPTY'"		
			else
			PysChoix(PysNb) = " TypeDeFrais = 'Pro'"
		end if

PysNb = ubound(PysChoix())+1
	redim preserve PysChoix(PysNb)
	    If PysForm.getByName("CheckBoxVac").currentValue = 0 then 
    	PysChoix(PysNb) =  " TypeDeFrais LIKE 'EMPTY'"		
			else
			PysChoix(PysNb) = " TypeDeFrais = 'Vacances'"
		end if

PysNb = ubound(PysChoix())+1
	redim preserve PysChoix(PysNb)
	    If PysForm.getByName("CheckBoxLoi").currentValue = 0 then 
    	PysChoix(PysNb) =  " TypeDeFrais LIKE 'EMPTY'"		
			else
			PysChoix(PysNb) = " TypeDeFrais = 'Loisirs'"
		end if

PysNb = ubound(PysChoix())+1
	redim preserve PysChoix(PysNb)
	    If PysForm.getByName("CheckBoxExc").currentValue = 0 then 
	    PysChoix(PysNb) =  " TypeDeFrais LIKE 'EMPTY'"		
			else
			PysChoix(PysNb) = " TypeDeFrais = 'Exceptionnel'"
		end if

PysNb = ubound(PysChoix())+1
	redim preserve PysChoix(PysNb)
	    If PysForm.getByName("CheckBoxAut").currentValue = 0 then 
    	PysChoix(PysNb) =  " TypeDeFrais LIKE 'EMPTY'"		
			else
			PysChoix(PysNb) = " TypeDeFrais = 'Autres'"
		end if


PysNb = ubound(PysChoix())+1
	redim preserve PysChoix(PysNb)
    	If PysForm.getByName("CheckBoxSan").currentValue = 0 then 
    	PysChoix(PysNb) =  " TypeDeFrais LIKE 'EMPTY'"		
			else
			PysChoix(PysNb) = " TypeDeFrais = 'Santé'"
		end if

PysNb = ubound(PysChoix())+1
	redim preserve PysChoix(PysNb)
	    If PysForm.getByName("CheckBoxInt").currentValue = 0 then 
	    PysChoix(PysNb) =  " TypeDeFrais LIKE 'EMPTY'"	
			else
			PysChoix(PysNb) = " TypeDeFrais = 'Intra comptes'"
		end if

PysNb = ubound(PysChoix())+1
	redim preserve PysChoix(PysNb)
	    If PysForm.getByName("CheckBoxSal").currentValue = 0 then 
	    PysChoix(PysNb) =  " TypeDeFrais LIKE 'EMPTY'"		
			else
			PysChoix(PysNb) = " TypeDeFrais = 'Salaires'"
		end if

PysSQL = PysSQL & join(PysChoix, PysOper)
print PysSQL							'Option pour afficher boite de dialogue sur l'ensemble de la requête SQL

PysForm.command = PysSQL				'Redéfinition de la source du formulaire
PysForm.reload							'Recharge le formulaire

End sub

En tout cas un grand merci.
Cordialement.
PS : Pour faciliter les recherches des utilisateurs je me permet de rajouter un lien vers ce post à la suite du fil de Pierre-Yves "Filtrer une requête avec une liste déroulante".

Sebastien.
Open Office 3.2.1
Mac OS 10.5.8
cathala
Membre hOOnoraire
Membre hOOnoraire
Messages : 133
Inscription : 12 déc. 2007 13:42

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

Message par cathala »

Salut SEB,
je viens de tester ton code mais sans succés.
Il faut plancher encore du coté de "EMPTY",je pense.
Je te laisse réfléchir,je reviens à 13H00
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Windows 7 PRO Libre Office 4.1.3.2
Si je peu aider je n'hésite pas
sebmdp
Membre hOOnoraire
Membre hOOnoraire
Messages : 125
Inscription : 08 juil. 2008 16:31
Localisation : Orleans / France

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

Message par sebmdp »

Bonjour,

J'ai changé le nom du radio OU (RadioGroup1) pour qu'il soit conditionné aussi par le ET.
Le radio ET me servira au cas où une entrée appartienne à 2 "TypeDeFrais" distincts simultanément, ce qui n'est pas le cas pour l'instant.

Pour ma part la requête fonctionne, du moins elle répond à mes attentes, je m'explique : En fait ds celle ci je veux qu'un champ "TypeDeFrais" non renseigné (cad une case non cochée) ne soit pas pris en compte dans les résultats du contrôle de table, c'est pour ça que j'ai modifié le critère "*" (tout) par EMPTY dans le code. Autrement dit, aucune case cochée donne un résultat vide & seuls apparaissent les les champs "TypeDeFrais" cochés.

Est ce là le pb selon toi où ya-t-il une autre erreur dans le code ?
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Open Office 3.2.1
Mac OS 10.5.8
cathala
Membre hOOnoraire
Membre hOOnoraire
Messages : 133
Inscription : 12 déc. 2007 13:42

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

Message par cathala »

Ok je suis repassé entre deux effectivement cela fonctionne.
Je ne savais pas que tu avais changé le bouton radio OR/AND.
On peut dire que ta question est Résolu?
Windows 7 PRO Libre Office 4.1.3.2
Si je peu aider je n'hésite pas
sebmdp
Membre hOOnoraire
Membre hOOnoraire
Messages : 125
Inscription : 08 juil. 2008 16:31
Localisation : Orleans / France

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

Message par sebmdp »

Elle l'est effectivement. :D
Merci bcp pour ton aide.

Salutations.
Open Office 3.2.1
Mac OS 10.5.8