Recherche menu déroulant

  • Recherche menu déroulant

    Posté par Lamia sur 9 décembre 2021 à 14h02

    Bonjour à tous,

    Je rencontre un petit problème actuellement. Je suis une débutante dans PowerApps. Via SharePoint, j’ai créé une colonne qui est le résultat de deux colonnes fusionnées. Cette colonne reprend un code postal et le nom de la commune en question. ce que j’aimerais faire c’est de pouvoir faire une recherche soit par le numero du code postal, soit par le nom de la commune.

    Merci d’avance pour les personnes qui vont pouvoir m’aider 🙂

    PostID=V61aoLRCRNFfTPX

    Lamia a répondu Il y a 3 mois 1 Membre · 6 Réponses
  • 6 Réponses
  • R3dKap

    Membre
    9 décembre 2021 à 17h28

    @Lamia Bienvenue sur le PPFC 😉

    La question qui va tout déterminer c’est : combien as-tu de communes dans ta liste ?

    CommentID=WXr4IG1uohXeSl9, PostID=V61aoLRCRNFfTPX

    • Lamia

      Membre
      13 décembre 2021 à 8h52

      @R3dKap Il y en a plus de 2000 😅

      SubCommentID=o51MTxrAE7qvZjF, CommentID=WXr4IG1uohXeSl9, PostID=V61aoLRCRNFfTPX

    • R3dKap

      Membre
      13 décembre 2021 à 11h04

      @Lamia dans ce cas, et au vu de ta réponde aux questions de @Loïc Cimon, la solution la plus simple que j’entrevois pour toi c’est de procéder de la manière suivante…

      J’ai supposé dans le code que ta liste des codes postaux et communes s’appelle Communes et que les colonnes s’appellent CodePostal et NomCommune.

      Voici les instructions :

      • sur ton écran tu mets une seule combo box (en FR, une Zone de liste déroulante, pas une Liste déroulante) appelée ComboBox1
      • au-dessus de ta combo box, tu mets un text input (en FR, Entrée de texte) appelé TextInput1
      • sur la propriété OnChange de TextInput1, tu mets ceci :
      Clear(colCommunes);nIf(n    Not(IsBlank(TextInput1.Text)),n    If(n        IsNumeric(TextInput1.Text),n        Collect(n            colCommunes,n            Filter(n                Communes,n                StartsWith(n                    CodePostal,n                    TextInput1.Textn                )n            )n        ),n        Collect(n            colCommunes,n            Filter(n                Communes,n                StartsWith(n                    NomCommune,n                    TextInput1.Textn                )n            )n        )n    )n)n
      • définit la propriété IsSearchable de ComboBox1 à false
      • sur la propriété Items de ComboBox1 tu mets juste :
      colCommunesn
      • sur ComboBox1 tu cliques sur le lien Edit de Fields :

      • là tu changes le Layout et tu le définis sur Double :

      • puis dans Primary text et Secondary text tu mets respectivement tes colonnes de code postal et de commune :

      • et enfin, dans la propriété DisplayMode du ComboBox1 tu mets ceci :
      If(IsEmpty(colCommunes), DisplayMode.Disabled, DisplayMode.Edit)n

      Quelques explications…

      En gros, l’idée c’est tout d’abord d’utiliser une combo box en mode double pour afficher à la fois le code postal et la commune dans un seul composant :

      Ensuite, on ne peut malheureusement pas utiliser la recherche intégrée à la combo box car il y a plus de 2 000 éléments dans ta liste. Or la fonction Search() (qui est utilisée derrière pour faire cela) n’est pas délégable à SharePoint, c’est à dire que Power Apps ne peut pas dire à SharePoint “Fais la recherche pour moi” il est obligé de la faire lui-même. Et du coup, pour des raisons de performances, Power Apps ne fait la recherche que sur 2 000 enregistrements max.

      Du coup, pour contourner ce problème, on va utiliser une autre fonction qui, elle, est délégable à SharePoint : StartsWith().

      On mets donc un text input sur l’écran pour permettre à l’utilisateur de saisir son critère de recherche. Or, si on avait fait un StartsWith() sur un champ de type “1000-Bruxelles“, on aurait pu faire la recherche que sur le code postal et si on avait tapé “Brux” il n’aurait rien trouvé puisque la fonction StartsWith() ne compare la chaîne de recherche qu’avec le début de la valeur du champ (comme son nom l’indique d’ailleurs).

      C’est la raison pour laquelle dans le gros morceau de code fournit ci-dessus, on regarde si ce que l’utilisateur a saisit est un numérique (alors on fait un StartsWith() sur le code postal) ou une chaîne de caractères (auquel cas on fait un StartsWith() sur la commune).

      Le résultat du filtrage des communes avec l’un ou l’autre des StartsWith() est stocké dans une collection locale colCommunes et c’est elle qui alimente la combo box.

      Enfin, pour éviter que l’utilisateur n’ouvre la combo box alors qu’il vient de lancer une recherche et que l’on a pas encore les résultats du filtrage, on verrouille la combo box tant qu’il n’y a pas de données dans colCommunes. C’est le but du code que l’on a mit sur la propriété DisplayMode de ComboBox1.

      La seule chose à savoir pour l’utilisateur c’est qu’il doit appuyer sur <ENTREE> après avoir saisi son critère de recherche dans TextInput1 pour que cela déclenche la recherche et le filtrage des communes.

      Voilà ce que ça donne :

      Alors tu remarqueras que j’ai aussi mis une List box (à utiliser à la place de la combo box) qui peut être plus pratique pour afficher directement la liste des communes disponibles. Cela évite de devoir ouvrir la combo box pour voir le résultat du filtrage.

      Pour que cela fonctionne bien, il suffit de positionner ses propriétés ainsi :

      • Items :
      AddColumns(n    colCommunes,n    "CPCommune",n    CodePostal & " - " & NomCommunen)n
      • SelectMultiple à false

      Puis, choisit bien la colonne CPCommune pour l’affichage des valeurs :

      Et histoire de faire plus propre, pour faire en sorte que la liste se vide au moment où on veut faire une nouvelle recherche, définit la propriété OnSelect de TextInput1 à :

      Clear(colCommunes)n

      Voili voilou… Dis-nous si ça fonctionne chez toi…

      SubCommentID=fuxsTPvWHBXWyrE, CommentID=WXr4IG1uohXeSl9, PostID=V61aoLRCRNFfTPX

    • R3dKap

      Membre
      13 décembre 2021 à 11h29

      @Lamia du coup j’en ai fait un article dans la base de connaissances pour en faire profiter tout le monde… 😉

      SubCommentID=h8UrmKqIR9BIbBy, CommentID=WXr4IG1uohXeSl9, PostID=V61aoLRCRNFfTPX

  • Loïc Cimon

    Membre
    10 décembre 2021 à 14h29

    Hello @Lamia,

    Autres questions pour aider à répondre correctement:

    • quel est le format des records de ta collection derrière ta combobox ?
    • Dans ta liste SharePoint, as tu des colonnes juste pour le code postal et le nom de la commune ?

    CommentID=xn5l6jCrGyYiweK, PostID=V61aoLRCRNFfTPX

    • Lamia

      Membre
      13 décembre 2021 à 8h54

      Hello @Loïc Cimon ,

      1) Que veux tu dire par format des records?

      2) J’ai tout d’abord créer une liste sharepoint avec une colonne code postal et une colonne nom de la commune, ensuite j’ai créer une autre colonne pour les fusionner et j’ai rajouté cette colonne fusionné, dans ma liste sharepoint principale.

      SubCommentID=ZcgqGoEvYXfWwhV, CommentID=xn5l6jCrGyYiweK, PostID=V61aoLRCRNFfTPX

Connectez-vous pour répondre.