Filtre Galerie Power Apps

Étiquetté : , ,

  • Filtre Galerie Power Apps

    Posté par Andre Taguissa sur 26 avril 2022 à 12h20

    Bonjour à tous,

    J’ai un problème dont je ne maitrise la formule appropriée pour le résoudre.

    Il s’agit de trouver le moyen ou la formule qui sur Power apps me permettrait de filtrer dans un catalogue de produits (qui comporte pour chaque produit: article + prix de l’article +vendeur +taille de l’article) crée via une galerie sur le nom du produit ou sur le vendeur a partir de 2 textbox bien distincts. Sauriez vous m’indiquer la formule appropriée? ou alors des pistes de réflexion svp?

    PostID=u56z954yDLlkYZy

    R3dKap a répondu Il y a 11 mois, 3 semaines 1 Membre · 10 Réponses
  • 10 Réponses
  • Alain Pujol

    Membre
    26 avril 2022 à 12h49

    Bonjour,

    dans le champ items de la gallerie:

    Filter(Catalogue;

    (IsBlank(ChoixProduit.Selected.Result) || IsEmpty(ChoixProduit.Selected.Result) || Produit = ChoixProduit.Selected.Result);

    (IsBlank(ChoixVendeur.Selected.Result) || IsEmpty(ChoixVendeur.Selected.Result) || Vendeur = ChoixVendeur.Selected.Result)

    )

    Catalogue : ta liste Catalogue
    ChoixProduit : ta liste déroulante Produit
    ChoixVendeur : ta liste déroulante Vendeur

    IsBlank(choix) = vrai si aucun choix dans la liste pas de filtre appliqué
    IsBlank(choix) = faux si un choix est fait dans la liste déroulante et c’est ‘LeChamp’ = Choix.SelectedResult qui s’applique

    le point virgule entre les deux lignes est égal a ET

    donc
    soit aucun filtre n’est appliqué
    Soit l’un des deux
    Soit les deux

    CommentID=LTzHkzhHqifZ4KO, PostID=u56z954yDLlkYZy

    • Andre Taguissa

      Membre
      26 avril 2022 à 13h39

      Merci Alain, J’ai essayé d’appliquer mais c’est sans succès pour le moment. Certainement parce que mon choixProduit est une entrée de texte et non une liste déroulante. Ca change quoi et a quel niveau sur la syntaxe que vous avez suggéré?🙂

      Par ailleurs, le “||” signifie “ou” c’est ca?

      Merci

      SubCommentID=Jr80MaUMJxuZ7a0, CommentID=LTzHkzhHqifZ4KO, PostID=u56z954yDLlkYZy

  • Guillaume RENARD

    Membre
    26 avril 2022 à 13h33

    Bonjour @Andre ,

    Si tes champs sont des champs texte, tu peux utiliser cette formule :

    Filter(n    Catalogue;n    txtProduit.Text in Produit;n    txtVendeur.Text in Vendeurn)

    J’utilise ici l’opérateur “in” qui permet de rechercher le texte saisi par l’utilisateur n’importe où dans le nom du produit et du vendeur, mais tu peux aussi utiliser la fonction StartsWith() pour ne rechercher que les produits et les vendeurs qui commencent par le texte saisi :

    Filter(n    Catalogue;n    StartsWith(Produit; txtProduit.Text);n    StartsWith(Vendeur; txtVendeur.Text)n)

    Comme l’expliquait @Alain, le “;” entre les conditions applique l’opérateur ET. Si tu souhaites appliquer un OU entre les conditions, tu peux utiliser la fonction OR comme ceci :

    Filter(n    Catalogue;n    If(nOr(!IsBlank(txtArticle.Text);!IsBlank(txtVendeur.Text));n        Or(nIf(!IsBlank(txtArticle.Text);StartsWith(article; txtArticle.Text);false);nIf(!IsBlank(txtVendeur.Text);StartsWith(vendeur; txtVendeur.Text);false)n        );n        truen    )n)

    Attention toutefois sur l’utilisation des opérateurs (in, StartsWith…) pour filtrer ta source de données, cela peut engendrer des problèmes de délégation.
    De quel type est ta source de données ? Et combien d’enregistrements peut-elle atteindre ?

    CommentID=VkbCzDCIv1c0cF9, PostID=u56z954yDLlkYZy

  • Andre Taguissa

    Membre
    26 avril 2022 à 17h37

    Bonjour Guillaume,

    Merci pour ton retour.

    J’ai essayé de combiner les 2 (zone de liste déroulante et entrée de texte) pour parvenir a faire ta formule avec un “Or” afin de filtrer dans les 2 cas de figures mais ca ne marche pas.

    La voici:

    Filter(Catalogue;Or(If(IsBlank(ChoixVendeur.Selected.’Compte vendeur’);Catalogue;’Compte vendeur’ = ChoixVendeur.Selected.’Compte vendeur’);(If(IsBlank(ChoixProduit.Text in ‘Nom produit’);Catalogue;ChoixProduit.Text in ‘Nom produit’).

    Ce qui marche à moitié aujourd’hui c’est ca (je reussi a filtrer uniquement sur le vendeur dans la zone de liste deroulante mais à coté pour l’entrée de texte, le nom de produit est K.O):

    If( IsEmpty( Filter( Catalogue;(‘Compte vendeur’ = ChoixVendeur.Selected.’Compte vendeur’ && ChoixProduit.Text in ‘Nom produit’) ) ); Catalogue;

    Filter( Catalogue;(‘Compte vendeur’ = ChoixVendeur.Selected.’Compte vendeur’ && ChoixProduit.Text in ‘Nom produit’)))

    Par ailleurs, le “||” signifie quoi stp?

    CommentID=J05tFhYFPpzC9qw, PostID=u56z954yDLlkYZy

  • Sylvain

    Membre
    27 avril 2022 à 3h36

    Hello Andre,

    || signifie or. C’est la même chose.

    pour ton filtre, je vois plutôt une recherche. Tu peux aisément faire une recherche sur 2 colonnes de ta galerie.

    Créé dans ton Canevas un textbox que tu appelles par exemple txb_search, puis comme source de la galerie tu mets ce code :

    Search(Catalogue;txb_search.Text; "Produit";"Vendeur")

    ça devrait faire l’affaire 😄

    CommentID=6ifds99IJGdjRXW, PostID=u56z954yDLlkYZy

  • Andre Taguissa

    Membre
    27 avril 2022 à 9h44

    merci Sylvain.

    J’ai pu composé avec tout ce que vous m’avez dit et trouver une solution 🙂

    CommentID=5ioLUmqCIjfQ2XP, PostID=u56z954yDLlkYZy

  • Guillaume RENARD

    Membre
    27 avril 2022 à 10h06

    Bonjour @Andre,

    On veut filtrer les articles contenus dans la collection Catalogue
    On souhaite appliquer la condition suivante pour le filtre :
    – Le vendeur est égal au vendeur sélectionné dans la liste déroulante
    OU
    – Le nom de l’article contient le texte saisi dans le champ de recherche

    La fonction Filter() va tester chaque élément contenu dans la collection Catalogue, en fonction de la condition que l’on va appliquer dans le second paramètre de la fonction.
    Ce second paramètre doit renvoyer la valeur true ou false pour indiquer si l’élément en question doit être affiché dans la galerie.

    Si je reprends ta formule :

    Filter(ntCatalogue;ntOr(nttIf(ntttIsBlank(ChoixVendeur.Selected.'Compte vendeur');ntttCatalogue;nttt'Compte vendeur' = ChoixVendeur.Selected.'Compte vendeur'ntt);nttIf(ntttIsBlank(ChoixProduit.Text in 'Nom produit');ntttCatalogue;ntttChoixProduit.Text in 'Nom produit'ntt)nt)n)

    Première condition :

    If(n    IsBlank(ChoixVendeur.Selected.'Compte vendeur');ntCatalogue;nt'Compte vendeur' = ChoixVendeur.Selected.'Compte vendeur'n);

    Ici ta condition se traduit par :
    – si la propriété ‘Compte vendeur’ pour la valeur sélectionnée dans la liste déroulante est Vide,
    – alors je renvoie ma collection complète d’article contenue dans mon catalogue,
    – sinon je vérifie si la propriété ‘Compte vendeur’ de l’article est égale à la propriété ‘Compte vendeur’ de la valeur sélectionnée dans la liste déroulante

    Il faut modifier la condition pour renvoyer true ou false, et pas la collection complète des produits du catalogue.

    Seconde condition :

    If(n    IsBlank(ChoixProduit.Text in 'Nom produit');n    Catalogue;n    ChoixProduit.Text in 'Nom produit'n)

    Ici ta condition se traduit par :
    – si le texte saisi dans le champ de recherche est contenu dans le nom du produit est Vide,
    – alors je renvoie ma collection complète d’article contenue dans mon catalogue,
    – sinon je vérifie si le texte saisi dans le champ de recherche est contenu dans le nom du produit

    Même chose que pour la première condition, il faut modifier la condition pour renvoyer true ou false, et pas la collection complète des produits du catalogue.
    De plus, la conditon IsBlank() n’est pas bien implémentée, elle doit uniquement vérifier si le champ texte de recherche est Vide.

    Je te propose d’essayer la formule suivante :

    Filter(n    Catalogue;n    If(nAnd(IsBlank(ChoixProduit.Text);IsBlank(ChoixVendeur.Selected.Value));ntttrue;n        Or(n            If(!IsBlank(ChoixProduit.Text);StartsWith('Nom produit'; ChoixProduit.Text);false);n            ChoixVendeur.Selected.Value = 'Compte vendeur'n        );n    )n)

    Je fais d’abord une première condition pour tester s’il n’y a aucun texte saisi dans le champ de recheche du produit ET si la liste déroulante de sélection du vendeur est vide.
    Je renvoie true dans ce cas pour remonter tous les éléments, car aucun filtre n’est appliqué.

    Je fais ensuite une condition Or pour tester les 2 champs de recherche.
    Le premier, si une valeur est saisie dans le champ texte, je vérifie si celle-ci est contenue dans le nom du produit.
    Le second, si la valeur sélectionnée dans la liste déroulante du vendeur est égale à la propriété ‘Compte vendeur’ du produit.
    Si l’une des conditions est vraie, le produit sera affiché dans la galerie.

    CommentID=5g8CvlBoYxNbjFe, PostID=u56z954yDLlkYZy

  • R3dKap

    Membre
    28 avril 2022 à 13h08

    @Andre je complète et amende un peu la technique de @Guillaume RENARD…

    D’une manière générale, lorsque l’on veut filtrer une galerie basée sur une valeur saisie dans une text box (pareil pour une combo box), la formule s’écrit tout simplement comme ceci :

    Filter(n    TaSourceDeDonnées;n    IsBlank(TextBox.Text) || TaColonne = TextBox.Textn)

    En gros : si je n’ai rien saisi, renvoie-moi toutes les lignes de ma source de données, et dans le cas contraire renvoie-moi uniquement les lignes qui correspondent à ce que j’ai saisi dans la text box.

    Si tu veux filtrer ta galerie sur 2 text box, alors la formule s’écrit ainsi :

    Filter(n    TaSourceDeDonnées;n    (IsBlank(TextBox1.Text) || TaColonne1 = TextBox1.Text) && (IsBlank(TextBox2.Text) || TaColonne2 = TextBox2.Text)n)

    Dis-nous comment tu as réussi à le faire de ton côté… 😉

    CommentID=ovvokBmJj3plRTJ, PostID=u56z954yDLlkYZy

  • Andre Taguissa

    Membre
    28 avril 2022 à 14h09

    Hello @R3dKap

    J’ai réussi à avoir cette solution qui me convient:

    Filter(

    Catalogue;

    ‘Compte fournisseur’ = ChoixVendeur.Selected.VendorAccountNumber || IsBlank(ChoixVendeur.Selected.VendorAccountNumber);

    ‘Nom produit’ = listedechoixproduit.Selected.’Nom produit’ || IsBlank(listedechoixproduit.Selected.’Nom produit’);

    )

    )

    Merci à tous 😉

    CommentID=wvxxR9HvWXU6czj, PostID=u56z954yDLlkYZy

  • R3dKap

    Membre
    28 avril 2022 à 16h27

    C’est exactement ça ! 👍

    CommentID=da28uXEfofqt88h, PostID=u56z954yDLlkYZy

Connectez-vous pour répondre.