PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → activer un filtre dans une table
activer un filtre dans une table
Débuté par Guy CHAUDEAU, 16 aoû. 2025 14:57 - 12 réponses
Membre enregistré
5 messages
Posté le 16 août 2025 - 14:57
Bonjour

Je voudrais pouvoir activer un filtre sur une colonne d'une table pour récupérer plusieurs valeurs

Exemple je voudrais dans la colonne "typeFiches" récupérer les valeurs "Animateur" et "Formateur"

Merci de votre aide

Guy CHAUDEAU
Membre enregistré
1 011 messages
Posté le 16 août 2025 - 16:55
Bonjour,
Saut erreur de ma part, on peut activer un filtre par colonne (ajout les uns après les autres) mais on ne peut toujours pas appliquer plusieurs conditions sur une seule colonne (à moins que quelqu'un vienne démentir).

Quelle est la source de la table ?
Il est possible d'alimenter la table avec une requête dans laquelle vous pourriez poser plusieurs critères et éventuellement changer la source de la table à la volée pour l'alimenter avec la requête.

Vous pourriez aussi appliquer un filtre sur la table avec le premier critère puis lister le résultat dans une variable, modifier ensuite le filtre avec le deuxième critère et ajouter les résultats à la variable qui contient déjà les résultats du premier.
Ensuite vous remplissez la table avec le contenu de cette variable.

Cdlt
Posté le 16 août 2025 - 17:53
Cédric_34 a écrit :
Bonjour,
Saut erreur de ma part, on peut activer un filtre par colonne (ajout les uns après les autres) mais on ne peut toujours pas appliquer plusieurs conditions sur une seule colonne (à moins que quelqu'un vienne démentir).

Quelle est la source de la table ?
Il est possible d'alimenter la table avec une requête dans laquelle vous pourriez poser plusieurs critères et éventuellement changer la source de la table à la volée pour l'alimenter avec la requête.

Vous pourriez aussi appliquer un filtre sur la table avec le premier critère puis lister le résultat dans une variable, modifier ensuite le filtre avec le deuxième critère et ajouter les résultats à la variable qui contient déjà les résultats du premier.
Ensuite vous remplissez la table avec le contenu de cette variable.

Cdlt
Posté le 16 août 2025 - 17:59
Cédric_34 a écrit :
Bonjour,
Saut erreur de ma part, on peut activer un filtre par colonne (ajout les uns après les autres) mais on ne peut toujours pas appliquer plusieurs conditions sur une seule colonne (à moins que quelqu'un vienne démentir).

Quelle est la source de la table ?
Il est possible d'alimenter la table avec une requête dans laquelle vous pourriez poser plusieurs critères et éventuellement changer la source de la table à la volée pour l'alimenter avec la requête.

Vous pourriez aussi appliquer un filtre sur la table avec le premier critère puis lister le résultat dans une variable, modifier ensuite le filtre avec le deuxième critère et ajouter les résultats à la variable qui contient déjà les résultats du premier.
Ensuite vous remplissez la table avec le contenu de cette variable.

Cdlt


Bonjour

J'ai alimenter ma table avec une requete union rassemblant des enregistrement de fiches de type différents (8 au total)

j'ai ajouter un interrupteur affichant ces huit types et j'aimerais filtrer ma table avec le ou les choix de l'utilisateur

Voici ce que j'ai essayé

//MonchoixFiches est une tableau de chaînes
//
//POUR k = 1 _À_ BS_TypeFiches.Occurrence
// SI BS_TypeFiches[k] = 1 ALORS
// ajoute(MonchoixFiches,Majuscule(ExtraitChaîne(BS_TypeFiches[k].Libellé,1,".")))
// FIN
//
//FIN
//sFiltre est une chaîne
//POUR nIndice = 1 À Dimension(MonchoixFiches)
// sFiltre += "TypeFiche = '" + MonchoixFiches[nIndice] + "'"
// SI nIndice < Dimension(MonchoixFiches) ALORS
// sFiltre += " OU "
// FIN
//FIN

//TableActiveFiltre(TABLEH_PEC1.COL_TypeFiches,filtreContient, sFiltre)
// Supposons que les catégories sélectionnées soient stockées dans ce tableau
sCategoriesSelectionnees est un tableau de chaînes = ["ANIMATEUR", "FORMATEUR"]

// On construit la chaîne de filtre
sFiltre est une chaîne = "Col_TypeFiches IN ('ANIMATEUR', 'FORMATEUR')"
// On applique le filtre à la table des produits
TableActiveFiltre(TABLEH_PEC1.COL_TypeFiches,filtreContient,sFiltre)
Membre enregistré
5 messages
Posté le 18 août 2025 - 07:10
Bonjour

J'ai essayé ces deux possibilités mais aucune ne donne de résultats

Avez vous une idée merci

Guy CHAUDEAU


// 1 ere possibilité

// Récupération des chois de fiches a partir du bouton segmenté


//MonchoixFiches est une tableau de chaînes
//
//POUR k = 1 _À_ BS_TypeFiches.Occurrence
// SI BS_TypeFiches[k] = 1 ALORS
// ajoute(MonchoixFiches,Majuscule(ExtraitChaîne(BS_TypeFiches[k].Libellé,1,".")))
// FIN
//
//FIN
//sFiltre est une chaîne
//POUR nIndice = 1 À Dimension(MonchoixFiches)
// sFiltre += "TypeFiche = '" + MonchoixFiches[nIndice] + "'"
// SI nIndice < Dimension(MonchoixFiches) ALORS
// sFiltre += " OU "
// FIN
//FIN

//TableActiveFiltre(TABLEH_PEC1.COL_TypeFiches,filtreContient, sFiltre)

// 2 eme possibilité

// On construit la chaîne de filtre
sFiltre est une chaîne = "Col_TypeFiches IN ('ANIMATEUR', 'FORMATEUR')"


// On applique le filtre à la table des livrets
TableActiveFiltre(TABLEH_PEC1.COL_TypeFiches,filtreContient,sFiltre)

// La table n'affichera que les livrets ayant des fiches "Animateur" et "Formateur"
Trace(sFiltre)
Membre enregistré
2 299 messages
Posté le 18 août 2025 - 09:20
Bonjour,

Si tu alimentes ta table avec une requête, il suffit d'ajouter dynamiquement le filtre dans le code de la requête, de la réexécuter et de l'afficher.
Voir :
https://doc.pcsoft.fr/fr-FR/?1514082&name=Requetes_SQL_en_WLangage
https://doc.pcsoft.fr/fr-FR/?3044084&name=hexecuterequetesql_fonction
https://doc.pcsoft.fr/fr-FR/?3074003 TableAffiche (Fonction) avec taRéExécuteRequête

--
Bon dev,
Jean-Pierre
Membre enregistré
4 318 messages
Posté le 18 août 2025 - 09:28
Bonjour,
Ce que tu demandes entre dans les limites des fonction de filtre.
Guy CHAUDEAU a écrit :
J'ai essayé ces deux possibilités mais aucune ne donne de résultats

Je ne vois nulle part la première possibilité proposée par Cedric_34, à savoir l'alimentation par une requête. Le script de cette requête devra être construit en fonction des choix de l(utilisateur via par exemple un interrupteur.
Un truc du style :
Procedure FilitreTable()

saScript est une chaîne
sdREQ_Filtre est Source dede Données

saScript=CréationRequête()

HExécuteRequêteSQL(sdREQ_Filtre,hRequêteDéfaut,saScript)
<BLOC Création des liaisons de colonne>
TABLE_Employé.COL_Nom..LiaisonFichier = "sdREQ_Filtre.Nom"
//Etc
//Éventuellement
TABLE_Employé..RubriqueMémorisée = "sdREQ_Filtre.PK_Employé"
<FIN>

TABLE_Employé..AffichageActif=Faux
TableAffiche(TABLE_Employé)
TABLE_Employé..AffichageActif=Faux


FONCTION CréationRequête() : chaîne
saCorps est une chaîne
saTri est une chaîne
saCondition est chaîne

nNbProposition est entier
nNbChoix est entier


<BLOC Initialisation des chaînes "constantes" de la requête>
saCorps=[
SELECT
Employé.Prénom,
Employé.Nom,
....
FROM
Employé
]

saTri=[
ORDER BY
Employé.Fonction,
Employé.Nom
]
<FIN>


<BLOC Conditions de filtre>
nNbProposition=InterrupteurOccurrence(INT_Filtre)
POUR nIndChoix=1 _À_ nNbProposition
SI INT_Filtre[nIndChoix] ALORS
SI nNbChoix=0 ALORS //Première condition
saCondition=ChaîneConstruit("WHERE%1Employé.Fonction = %2",CRLF,INT_Filtre[nIndChoix].Libellé)
SINON
saCondition=ChaîneConstruit("%1%2AND Employé.Fonction = %3",saCondition,CRLF,INT_Filtre[nIndChoix].Libellé)
FIN
nNbChoix++
FIN
FIN
<FIN>

RENVOYER ChaîneConstruit("%1%2%3%3%2%4",saCorps,CRLF,saCondition,saTri)


--
Il y a peut être plus simple, mais, ça tourne
Quand tout a échoué, utilise l'option RTFM
Posté le 18 août 2025 - 09:59
Jean-Pierre BLOCH a écrit :
Bonjour,

Si tu alimentes ta table avec une requête, il suffit d'ajouter dynamiquement le filtre dans le code de la requête, de la réexécuter et de l'afficher.
Voir :
https://doc.pcsoft.fr/fr-FR/?1514082&name=Requetes_SQL_en_WLangage
https://doc.pcsoft.fr/fr-FR/?3044084&name=hexecuterequetesql_fonction
https://doc.pcsoft.fr/fr-FR/?3074003 TableAffiche (Fonction) avec taRéExécuteRequête

--
Bon dev,
Jean-Pierre


Oui j'alimente ma table avec une requete union qui regroupe 6 requetes recupérant les fiches de chaque type de fiches

Je cherche comment faire en utilisant TableActiveFiltre
Membre enregistré
5 messages
Posté le 18 août 2025 - 10:13
Bonjour,

J'utilise une requête Union regroupant 6 requêtes récupérant les fiches de chaque type de fiches

Je cherche a utiliser TableActiveFiltre
Membre enregistré
4 318 messages
Posté le 18 août 2025 - 11:14
1-Comme précisé plus haut, TableActiveFiltre est très minimaliste (encore plus que HFiltre) quant à ses possibilités, et n'accepte pas les condition multiples. Tu peux éventuellement tenter de faire un HFiltre sur ta la requête qui alimente ton champ table.
2-
Oui j'alimente ma table avec une requete union qui regroupe 6 requetes recupérant les fiches de chaque type de fiches

N'y-a-t'il pa moyen de passer par des sous requêtes ou un CASE WHEN ?
3-Quoiqu'il en soit, si la solution 1 ne fonctionne rien n'empêche d'ajouter dynamiquement les condition dans les requêtes "membre" de ton UNION.

--
Il y a peut être plus simple, mais, ça tourne
Quand tout a échoué, utilise l'option RTFM
Message modifié, 18 août 2025 - 11:17
Membre enregistré
2 299 messages
Posté le 18 août 2025 - 11:31
Rebonjour Guy,

C'est à la base une bonne idée de vouloir utiliser la fonction TableActiveFiltre.
Malheureusement, son utilisation est "versatile", donc compliquée à utiliser et ne produisant pas forcément le résultat attendu ... ;(
D'où les conseils qui te sont donnés :D d'utiliser plutôt une requête paramétrée.
Après, c'est toi le capitaine du navire 8).
NB : je reproduis le commentaire de Cédric confirmé par Voroltinquo :
"Saut erreur de ma part, on peut activer un filtre par colonne (ajout les uns après les autres) mais on ne peut toujours pas appliquer plusieurs conditions sur une seule colonne (à moins que quelqu'un vienne démentir)"

NB : Tu indiques :
"J'ai essayé ces deux possibilités mais aucune ne donne de résultats"
Ce que je comprends "Pas d'erreur de syntaxe mais table vide" ?

Suggestion 1 : remplacer filtreContient par filtreEgal
Suggestion 2 : Autre syntaxe plus ou moins suggérée par IA ( Copilot qui utilise une syntaxe non connue ;( cf. ci-dessous ) :
TableActiveFiltre(TABLEH_PEC1.COL_TypeFiches, filtreContient, "ANIMATEUR" + TAB + "FORMATEUR")

// Filtrer une colonne pour afficher uniquement les lignes avec "Valeur1" ou "Valeur2"
TableActiveFiltre(NomDeLaTable, "NomDeLaColonne", "Valeur1" + TAB + "Valeur2")

--
Bon dev,
Jean-Pierre
Message modifié, 18 août 2025 - 11:35
Posté le 18 août 2025 - 13:56
Jean-Pierre BLOCH a écrit :
Rebonjour Guy,

C'est à la base une bonne idée de vouloir utiliser la fonction TableActiveFiltre.
Malheureusement, son utilisation est "versatile", donc compliquée à utiliser et ne produisant pas forcément le résultat attendu ... ;(
D'où les conseils qui te sont donnés :D d'utiliser plutôt une requête paramétrée.
Après, c'est toi le capitaine du navire 8).
NB : je reproduis le commentaire de Cédric confirmé par Voroltinquo :
"Saut erreur de ma part, on peut activer un filtre par colonne (ajout les uns après les autres) mais on ne peut toujours pas appliquer plusieurs conditions sur une seule colonne (à moins que quelqu'un vienne démentir)"

NB : Tu indiques :
"J'ai essayé ces deux possibilités mais aucune ne donne de résultats"
Ce que je comprends "Pas d'erreur de syntaxe mais table vide" ?

Suggestion 1 : remplacer filtreContient par filtreEgal
Suggestion 2 : Autre syntaxe plus ou moins suggérée par IA ( Copilot qui utilise une syntaxe non connue ;( cf. ci-dessous ) :
TableActiveFiltre(TABLEH_PEC1.COL_TypeFiches, filtreContient, "ANIMATEUR" + TAB + "FORMATEUR")

// Filtrer une colonne pour afficher uniquement les lignes avec "Valeur1" ou "Valeur2"
TableActiveFiltre(NomDeLaTable, "NomDeLaColonne", "Valeur1" + TAB + "Valeur2")

--
Bon dev,
Jean-Pierre


Je confirme j'ai essayé toute ces possibilités Pas d'erreur de syntaxe mais table vide

Je continue de chercher
Membre enregistré
1 011 messages
Posté le 20 août 2025 - 13:44
Bonjour,
Je suppose que vous n'avez pas trouvé le moyen d'activer un filtre avec plusieurs valeurs (je n'en serai pas surpris ;( )
Si vous ne pouvez vraiment pas aller vers la solution des requêtes, il y a cette astuce qui peut répondre à votre demande si le volume de données dans la table n'est pas trop important.

1 - Vous ajoutez des variables au niveau de la fenêtre pour chaque valeur possible dans le champ Interrupteur :

MonAnimateur est une chaîne
MonFormateur est une chaîne


Lorsque vous cliquez sur les sélecteurs, vous renseignez les variables, par exemple, si l'interrupteur "Animateur" est coché :

MonAnimateur = "ANIMATEUR"


( Si l'interrupteur "Animateur" est décoché, MonAnimateur = "" )
et ainsi de suite pour les autres valeurs de l'interrupteur.

2 - Vous ajoutez dans votre table une colonne de Type "Interrupteur" nommée "Col_Filtre" (colonne invisible).

3 - Vous parcourez la Table pour comparer la colonne "COL_TypeFiches" à la liste des interrupteurs cochés pour Cocher ou Non la colonne "Col_Filtre" puis vous activez le Filtre sur la Table :

POUR TOUTE LIGNE DE TABLEH_PEC1
SI TABLEH_PEC1.COL_TypeFiches DANS (MonAnimateur, MonFormateur) ALORS
TABLEH_PEC1.Col_Filtre = Vrai
FIN
FIN
TableActiveFiltre(TABLEH_PEC1.Col_Filtre, filtreEgal, Vrai)


C'est un exemple, il faut peaufiner pour décocher la colonne "Col_Filtre" sinon l'application du prochain Filtre sera faussée.

Cdlt
Message modifié, 20 août 2025 - 13:51