|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
| 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
sFiltre est une chaîne = "Col_TypeFiches IN ('ANIMATEUR', 'FORMATEUR')"
TableActiveFiltre(TABLEH_PEC1.COL_TypeFiches,filtreContient,sFiltre)
Trace(sFiltre)
|
| |
| |
| | | |
|
| | |
| |
Membre enregistré 2 299 messages |
|
| Posté le 18 août 2025 - 09:20 |
| |
| |
| | | |
|
| | |
| |
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" 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 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 :
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 RTFMMessage 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'utiliser plutôt une requête paramétrée. Après, c'est toi le capitaine du navire . 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")
TableActiveFiltre(NomDeLaTable, "NomDeLaColonne", "Valeur1" + TAB + "Valeur2")
-- Bon dev, Jean-PierreMessage 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'utiliser plutôt une requête paramétrée. Après, c'est toi le capitaine du navire  . 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") 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.
CdltMessage modifié, 20 août 2025 - 13:51 |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|