[Résolu] [Base]Filtre avec deux éléments

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 !
Mastodor
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 11 janv. 2016 19:47

[Résolu] [Base]Filtre avec deux éléments

Message par Mastodor »

Bonjour,

J'ai une base de donnée pour gérer la formation de personnels.
Je voudrais sur le formulaire "f_Seances_Tir_Pers" ajouter une liste déroulante pour afficher soit toutes les armes, soit une en particulier.
Pour cela je me suis inspiré d'un tuto sur le forum mais j'obtiens le message d'erreur suivant sur ma macro "Erreur de syntaxe du BASIC. Symbole attendu : Arme".

Voici la macro :

Code : Tout sélectionner

REM  *****  BASIC  *****
Sub FiltrerArmes(oEv as Object)
Dim listArmes as String, oForm as Object
	listArmes = oEv.Source.SelectedItem
	oForm = oEv.Source.Model.Parent
   	With oForm
		.Filter=""Arme" =" & Apos(listArmes)
		.Applyfilter = True
		.Reload
	End With
End Sub

Function Apos(ByVal chaine As String) As String
Apos = "'" & join(split(chaine, "'"), "''") & "'"
End Function
Par la suite, avec cette sélection je voudrais ajouter une condition sur l'affichage des séances par rapport à leur date de création. Par exemple, afficher toutes les séances de moins d'un an.
Est-il possible de poser des conditions sur une date dans OoO ?

Merci d'avance de vos réponses.

Cordialement
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Oukcha le 04 févr. 2016 09:33, modifié 3 fois.
Raison : [Résolu] remplace [RESOLU]
Apache OoO 4.1.2
Windows 10
bm92
ManitOOu
ManitOOu
Messages : 2562
Inscription : 26 nov. 2005 13:42

Re: [Base]Filtre avec deux éléments

Message par bm92 »

Bonjour,
Règle syntaxique : tout guillemet à l'intérieur d'une chaîne déclarée doit être doublé, afin de le distinguer du guillemet de fin de chaîne.

Code : Tout sélectionner

.Filter="""Arme"" =" & Apos(listArmes)
La coloration syntaxique sert, entre autres, à vérifier que la chaîne écrite est bien interprétée par Basic.
Bernard

OpenOffice.org 1.1.5 fr / Apache OpenOffice 4.1.1 / LibreOffice 5.0.5.2 (X64)
MS-Windows 7 SP1 64bits Familial
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Base]Filtre avec deux éléments

Message par Piaf »

Bonjour
Une autre façon de filtrer à tester, voir le formulaire FormFiltre.
Filtres.png

Code : Tout sélectionner

Sub Filtrer(oEv as Object)
Dim oForm as Object, fPersonnel as Object,fArmes as Object, fMois as Object
Dim strSQL as String, maDate
	oForm = oEv.Source.Model.Parent
	fPersonnel = oForm.getByName("lstPers")
	fArmes = oForm.getByName("lstArme")
	fMois  = oForm.getByName("Mois")
	strSQL = "SELECT CONCAT( CONCAT( ""Nom"", ' ' ), ""Prenom"" ) ""Militaire"",""tSeanceTir"".""Date"", ""tArmes"".""Arme"", ""tSeanceTir"".""Nombre de cartouches"", ""tSeanceTir"".""Observation"", ""tSeanceTirPers"".""Obs"", ""tTypeSeanceTir"".""TypeSeanceTir"" FROM ""tSeanceTirPers"", ""tSeanceTir"", ""tTypeSeanceTir"", ""tArmes"", ""tPersonnels"" WHERE ""tSeanceTirPers"".""RefSeanceTir"" = ""tSeanceTir"".""IDséance"" AND ""tSeanceTir"".""refSeanceTypeTir"" = ""tTypeSeanceTir"".""IDtypesenceTir"" AND ""tSeanceTir"".""Arme"" = ""tArmes"".""ID"" AND ""tSeanceTirPers"".""RefPersTir"" = ""tPersonnels"".""NIGEND"""	
	Select Case oEv.Source.Model.Name
		Case "cmdAfficher"
			strSql = strSQL
			fPersonnel.SelectedItems = Array()
			fArmes.SelectedItems = Array()
			fMois.Text = ""
		Case Else
			If fPersonnel.CurrentValue <> "" Then
				StrSQL = strSQL & " AND CONCAT( CONCAT( ""Nom"", ' ' ), ""Prenom"" ) =" & Apos(fPersonnel.CurrentValue)
			End If
			If fArmes.CurrentValue <> "" Then
				strSQL = StrSQL & " AND ""tArmes"".""Arme"" =" & Apos(fArmes.CurrentValue)
			End If
			If Not isEmpty(fMois.CurrentValue) Then
				maDate = DateAdd("m",-fMois.CurrentValue,Date())
				strSQL = strSQL & " AND ""tSeanceTir"".""Date"" BETWEEN " & DateUS(maDate) & " AND " & DateUS(Date())
			End If
	End Select
	oForm.Command = strSQL
	oForm.Reload
End Sub
Pas trop le temps de voir pour le filtre sur les dates maintenant.
 Ajout : J'ai changé la base Jointe avec la prise en compte du filtre sur les dates. 
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
Mastodor
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 11 janv. 2016 19:47

Re: [Base]Filtre avec deux éléments

Message par Mastodor »

Merci pour les réponses. Je comprends de mieux en mieux le fonctionnement, mais c'est pas encore totalement ça.
Je veux conserver mon type de document c'est à dire navigation dans les noms avec un sous formulaire.
J'ai modifié la macro pour avoir un filtre sur les Armes dans un premier temps.
Mais quand je met en route la macro, rien ne se passe.
Je pense que cela vient du fait qu'il y a un sous formulaire.
Pouvez vous m'éclairer ?

Code : Tout sélectionner

option explicit

Sub Filtrer(oEv as Object)
Dim oForm as Object, fArmes as Object
Dim strSQL as String
	oForm = oEv.Source.Model.Parent
	fArmes = oForm.getByName("lstArme")	
	strSQL = "SELECT ""tSeanceTir"".""Date"", ""tArmes"".""Arme"", ""tSeanceTir"".""Nombre de cartouches"", ""tSeanceTir"".""Observation"", ""tSeanceTirPers"".""Obs"", ""tSeanceTirPers"".""RefPersTir"", ""tTypeSeanceTir"".""TypeSeanceTir"" FROM ""tSeanceTirPers"", ""tSeanceTir"", ""tTypeSeanceTir"", ""tArmes"" WHERE ""tSeanceTirPers"".""RefSeanceTir"" = ""tSeanceTir"".""IDséance"" AND ""tSeanceTir"".""refSeanceTypeTir"" = ""tTypeSeanceTir"".""IDtypesenceTir"" AND ""tSeanceTir"".""Arme"" = ""tArmes"".""ID"""
	Select Case oEv.Source.Model.Name
		Case "cmdAfficher"
			strSql = strSQL
			fArmes.SelectedItems = Array()
		Case Else
				strSql = StrSQL & " AND ""tArmes"".""Arme"" =" & Apos(fArmes.CurrentValue)
	End Select
	oForm.Command = strSQL
	oForm.Reload
End Sub

Function Apos(ByVal chaine As String) As String
	Apos = "'" & join(split(chaine, "'"), "''") & "'"
End Function

Merci d'avance
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Apache OoO 4.1.2
Windows 10
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Base]Filtre avec deux éléments

Message par Piaf »

Re
Mastodor a écrit :Je pense que cela vient du fait qu'il y a un sous formulaire.
Exact :)
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
Mastodor
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 11 janv. 2016 19:47

Re: [Base]Filtre avec deux éléments

Message par Mastodor »

Super, merci pour la réponse !

Je tente de modifier la macro Filtrer afin qu'elle m'affiche l'ensemble des personnels qui ont participé à un séance avec le type d'arme sélectionné. Je pense que je dois modifier la manière de construire la fonction, mais je suis bloqué sur la compréhension exacte de la fonction. Pour l'instant, si je ne spécifie pas de personnel, je ne peux rien obtenir de plus.

Code : Tout sélectionner

Sub Filtrer(oEv as Object)
Dim oForm as Object, fPersonnel as Object,fArmes as Object, fMois as Object
Dim strSQL as String, maDate
	oForm = oEv.Source.Model.Parent
	fPersonnel = oForm.getByName("lstPers")
	fArmes = oForm.getByName("lstArme")
	fMois  = oForm.getByName("Mois")
	strSQL = "SELECT CONCAT( CONCAT( ""Nom"", ' ' ), ""Prenom"" ) ""Militaire"",""tSeanceTir"".""Date"", ""tArmes"".""Arme"", ""tSeanceTir"".""Nombre de cartouches"", ""tSeanceTir"".""Observation"", ""tSeanceTirPers"".""Obs"", ""tTypeSeanceTir"".""TypeSeanceTir"" FROM ""tSeanceTirPers"", ""tSeanceTir"", ""tTypeSeanceTir"", ""tArmes"", ""tPersonnels"" WHERE ""tSeanceTirPers"".""RefSeanceTir"" = ""tSeanceTir"".""IDséance"" AND ""tSeanceTir"".""refSeanceTypeTir"" = ""tTypeSeanceTir"".""IDtypesenceTir"" AND ""tSeanceTir"".""Arme"" = ""tArmes"".""ID"" AND ""tSeanceTirPers"".""RefPersTir"" = ""tPersonnels"".""NIGEND"""	
	Select Case oEv.Source.Model.Name
		Case "cmdAfficher"
			strSql = strSQL
			fPersonnel.SelectedItems = Array()
			fArmes.SelectedItems = Array()
			fMois.Text = ""
		Case Else
			If fPersonnel.CurrentValue <> "" Then
				StrSQL = strSQL & " AND CONCAT( CONCAT( ""Nom"", ' ' ), ""Prenom"" ) =" & Apos(fPersonnel.CurrentValue)
			End If
			If fArmes.CurrentValue <> "" Then
				strSQL = StrSQL & " AND ""tArmes"".""Arme"" =" & Apos(fArmes.CurrentValue)
			End If
			If Not isEmpty(fMois.CurrentValue) Then
				maDate = DateAdd("m",-fMois.CurrentValue,Date())
				strSQL = strSQL & " AND ""tSeanceTir"".""Date"" BETWEEN " & DateUS(maDate) & " AND " & DateUS(Date())
			End If
	End Select
	oForm.Command = strSQL
	oForm.Reload
End Sub
Que renvoie ce code exactement ?

Code : Tout sélectionner

 StrSQL = strSQL & " AND CONCAT( CONCAT( ""Nom"", ' ' ), ""Prenom"" ) ="
Merci
Apache OoO 4.1.2
Windows 10
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Base]Filtre avec deux éléments

Message par Piaf »

Bonjour
Mastodor a écrit :elle m'affiche l'ensemble des personnels qui ont participé à un séance avec le type d'arme sélectionné
Tu dois construire un filtre sur la date de la séance et sur l'arme.

Code : Tout sélectionner

Sub Filter2(oEv as Object)
Dim oForm as Object, fDate as Object, fArmes as Object
Dim strSQL as String, maDate
	'Le formulaire
	oForm = oEv.Source.Model.Parent
	'La liste déroulante des dates de séances de tir
	fDate  = oForm.getByName("maDate")
	'La liste déroulante des armes
	fArmes = oForm.getByName("lstArme")
	'l'instruction SQL affichant tout
	strSQL = "SELECT CONCAT( CONCAT( ""Nom"", ' ' ), ""Prenom"" ) ""Militaire"",""tSeanceTir"".""Date"", ""tArmes"".""Arme"", ""tSeanceTir"".""Nombre de cartouches"", ""tSeanceTir"".""Observation"", ""tSeanceTirPers"".""Obs"", ""tTypeSeanceTir"".""TypeSeanceTir"" FROM ""tSeanceTirPers"", ""tSeanceTir"", ""tTypeSeanceTir"", ""tArmes"", ""tPersonnels"" WHERE ""tSeanceTirPers"".""RefSeanceTir"" = ""tSeanceTir"".""IDséance"" AND ""tSeanceTir"".""refSeanceTypeTir"" = ""tTypeSeanceTir"".""IDtypesenceTir"" AND ""tSeanceTir"".""Arme"" = ""tArmes"".""ID"" AND ""tSeanceTirPers"".""RefPersTir"" = ""tPersonnels"".""NIGEND"""	
	'Sélection du bouton sur lequel on a cliqué
	Select Case oEv.Source.Model.Name
		'Si c'est le bouton afficher tout
		Case "cmdAfficher"
			'On défini l'instruction à l'affichage de tous les enregistrements
			strSql = strSQL
			'on supprime les sélections éventuelles dans les listes déroulantes
			fDate.SelectedItems = Array()
			fArmes.SelectedItems = Array()
		'Si c'est le bouton filtrer	
		Case Else
			'S'il y a une sélection dans la liste des dates
			If fDate.CurrentValue <> "" Then
				'On applique un filtre sur le champ date de l'instruction SQL
				strSQL = strSQL & " AND ""tSeanceTir"".""Date"" = " & DateUS(CDate(fDate.CurrentValue))
			End If
			'S'il y a une sélection dans la listes des armes
			If fArmes.CurrentValue <> "" Then
				'On applique un filtre sur le champ Arme
				strSQL = StrSQL & " AND ""tArmes"".""Arme"" =" & Apos(fArmes.CurrentValue)
			End If
		End Select
	'On défini la commande du formulaire à l'instruction SQL	
	oForm.Command = strSQL
	'On recharge le formulaire
	oForm.Reload						
End Sub
Filtres.png
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
Mastodor
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 11 janv. 2016 19:47

Re: [Base]Filtre avec deux éléments

Message par Mastodor »

Super, merci pour vos réponses. Mon projet est donc terminé !
Apache OoO 4.1.2
Windows 10