Colonne Lookup dans dataverse

Étiquetté : ,

  • Colonne Lookup dans dataverse

    Posté par Zliga Oumaima sur 9 février 2023 à 15h48

    Bonjour !

    Je me suis lancé dans le monde de Dataverse récemment, et je me retrouve devant des questions, si vous pouvez me rependre s’il vous plait.

    1- Comment je peux faire des colonnes lookup multi sélection? et comment je peux les renseignées à partir d’une app Canvas ?

    2- J’ai connectée ma table Dataverse avec mon application, j’ai fait un formulaire mais je ne peux pas voir le menu déroulant des combobox , il est vide pour tous les champs Lookup.

    Vraiment je suis perdu avec les lookup dans Dataverse soit au niveau des tables et aussi au niveau des app Canvas.

    Merci pour votre aide

    PostID=z324iIg1fpvSr5r

    R3dKap a répondu Il y a 11 mois, 3 semaines 1 Membre · 12 Réponses
  • 12 Réponses
  • DavidZed

    Membre
    9 février 2023 à 16h18

    Hello Zliga Oumaima ,

    Pour le lookup multivalue, ce qui s’en rapproche le plus dans Dataverse, c’est les N:N relationships (Relations plusieurs à plusieurs), on peut les créer à partir du menu relations dans les tables :

    Par contre, si ce type de relation fonctionne pas trop mal avec les apps model-driven, pour les avoir utilisé dans une app Canvas, cela devient vite assez acrobatique :

    Déjà, si tu ajoutes le champ dans un formulaire tu vas avoir ce type d’erreur :

    en essayant de remplacer le choice(_) par la source de donnée liée, ici utilisateurs, à nouveau un message d’erreur

    Pourtant cela est tellement simple quand le formulaire est couplé à une liste Sharepoint !

    En fait, pour gérer les relations N:N avec une app Canvas, il faut faire les liaisons hors du formulaire avec les fonctions Relate() et Unrelate(), ce qui est assez poussif.

    Généralement on préfère éviter les N:N autant que possible, et si on a vraiment besoin de ce type de relation, on préfère généralement créer une table intermédiaire de toute pièce. Ici par exemple, je créerai une table “Groupe de personnes” qui aura une relation 1:N avec la table “Utilisateurs” et une autre relation 1:N avec ma première table

    2 si ton menu déroulant est vide :

    Vérifie dans ses champs que la valeur à afficher est la bonne :

    sinon active et désactive les paramètres séléction multiple et recherche, parfois ils génèrent des bugs d’affichage :

    CommentID=X44UnP1OmuMMdKe, PostID=z324iIg1fpvSr5r

  • Zliga Oumaima

    Membre
    9 février 2023 à 16h52

    Merci DavidZed pour votre réponse.

    J’ai déjà créer ce type de relation, mais je ne peux pas l’intégrer dans une colonne. ou bien je ne sais pas comment l’utiliser.

    Je l’ai fait dans “Main de Form” Model Driven mais je sais pas comment je peux faire la recherche des utilisateurs, et même si je modifie un enregistrement et j’ajoute 2 users, j’enregistre et je ferme mais je ne trouve pas les données.

    On dois créer les tables intermédiaires dans Dataverse ?

    2- J’ai vérifié, mais toujours je vois pas les valeurs

    CommentID=99lZ2h093tUqbgi, PostID=z324iIg1fpvSr5r

    • DavidZed

      Membre
      9 février 2023 à 18h12

      La table intermédiaire des relations N:N n’est pas accessible, c’est bien cela le problème…

      Dans les model Driven, dans le formulaire il faut ajouter une sous-grille en cochant la case “Related data”, et là tu pourras lier tes enregistrements.

      Pour le combobox, c’est pareil si tu actives la recherche ?

      SubCommentID=RCUxvra51vokdVW, CommentID=99lZ2h093tUqbgi, PostID=z324iIg1fpvSr5r

  • R3dKap

    Membre
    9 février 2023 à 20h52

    Zliga Oumaima, les combo box dans Power Apps ne supportent pas les relations N:N du Dataverse.

    Et c’est normal que tu ne voies pas de colonnes pour représenter ta donnée multiple : elle n’existe pas. Comme indiqué par DavidZed lorsque tu crées une relation N:N le système crée une table cachée avec, en gros, 2 colonnes : une colonne contenant l’identifiant de ta première table et une colonne contenant l’identifiant de ta deuxième table. C’est tout. C’est comme ça que tu peux avoir 1 enregistrement de ta table 1 liées à plusieurs enregistrements de ta table 2.

    Et comme indiqué aussi précédemment par DavidZed, une solution plus commode consiste à créer toi-même ta propre table N:N. Ca veut dire :

    • supprimer la relation N:N que tu as créée (la “Prestations <-> Utilisateur“)

    • créer une table Prestations_Utilisateur avec 2 colonnes :

      • une colonne de lookup vers ta table Prestations

      • une colonne de lookup vers la table Utilisateur

    Et si tu veux avoir une combo box à valeurs multiples dans ton formulaire pour gérer ces relations Prestations – Utilisateurs, il va falloir tout gérer à la main :

    • créer une datacard personnalisée

    • y ajouter une combo box

    • alimenter la combox box à partir de la table Prestations_Utilisateurs à laquelle il te faudra ajouter une colonne avec un AddColumns() pour avoir à disposition le libellé des prestations pour l’utilisateur (ou des utilisateurs pour une prestation, selon ce que tu veux)

    • gérer là mise à jour des données dans le OnSuccess() du formulaire (perso, je ferais carrément un annule-et-remplace des liens en virant d’abord tous les liens existant l’utilisateur puis en recréant ceux pour les prestations sélectionnés dans la combo box)

    Comme tu peux le voir, le N:N dans le Dataverse c’est un peu l’enfer… 😅

    Est-ce que ça t’aide ? Est-ce que tu vois à peu près comment procéder ?

    CommentID=zKIo5vlSqgr1QWl, PostID=z324iIg1fpvSr5r

  • Zliga Oumaima

    Membre
    13 février 2023 à 15h04

    Merci DavidZed j’ai pu activer la recherche dans model Driven.

    Merci R3dKap pour ta réponse, j’ai testé la solution que tu m’as proposé mais je me suis bloquer dans les deux derniers points car j’ai pas bien compris .

    J’ai alimenter la combox box à partir de la table Prestations_Utilisateurs, je sais pas où et pourquoi utiliser AddColumn (je veux des utilisateurs pour une prestation).

    Je dois les enregistrer dans la table Prestations_Utilisateurs?

    Merci pour votre aide 😀

    CommentID=oaBuIwMLffoLeaN, PostID=z324iIg1fpvSr5r

  • R3dKap

    Membre
    13 février 2023 à 20h36

    Zliga Oumaima est-ce que tu peux d’abord préciser ton cas de figure stp :

    1. C’est l’utilisateur connecté qui se voit affecté plusieurs prestations

    2. L’utilisateur connecté choisit une prestations et lui affecte plusieurs utilisateurs

    3. L’utilisateur connecté choisit un utilisateur et lui affecte plusieurs prestations

    CommentID=lgD8PIopDqOeZG7, PostID=z324iIg1fpvSr5r

  • Zliga Oumaima

    Membre
    14 février 2023 à 8h39

    Bonjour R3dKap

    Mon cas est : l’utilisateur connecté choisit une prestations et lui affecte plusieurs utilisateurs.

    Mon champ multi sélections est “Equipe ingénieur” , plusieurs ingénieurs travaillent sur une seule prestation.

    Merci

    CommentID=qDC391HyMhVjeXp, PostID=z324iIg1fpvSr5r

  • R3dKap

    Membre
    14 février 2023 à 9h16

    Ok, parfait. Autre question : ta liste d’ingénieurs c’est une liste que tu as créé toi ou tu comptes utiliser la liste standard Utilisateurs ?

    CommentID=gYS9wl8TEeQLtvu, PostID=z324iIg1fpvSr5r

    • Zliga Oumaima

      Membre
      14 février 2023 à 9h18

      Je compte utiliser la liste standard Utilisateurs car tous les ingénieurs dedans.

      SubCommentID=Pv5yV7UKkQHuzXA, CommentID=gYS9wl8TEeQLtvu, PostID=z324iIg1fpvSr5r

  • R3dKap

    Membre
    14 février 2023 à 17h18

    Ok, alors voici comment procéder…

    Commence par ajouter une datacard personnalisée à ton formulaire. Ajoutes-y un libellé puis une combo box appelée DataCardValueIngénieurs (zone de liste déroulante) et assure-toi que sa propriété SelectMultiple est bien à true.

    Dans le Items de ta combo box où tu veux choisir les ingénieurs, met juste : Utilisateurs. En fait, on considère que ta combo box sert à sélectionner des personnes, donc on pointe directement sur la table des utilisateurs. Assure-toi que tu choisisses bien la colonne Nom complet pour afficher le nom des utilisateurs dans la liste déroulante.

    Reste à gérer les valeurs par défaut de la combo box et l’enregistrement/chargement des ingénieurs rattachés à une prestation.

    Je vais supposer que tu as un formulaire sur ton écran directement branché sur ta table Prestation ; et que ta colonne principale (qui est de type ‘Identificateur unique‘) s’appelle Prestation (c’est souvent le même nom que la table elle-même).

    Je vais aussi supposer que tu as bien une table Prestations_Utilisateurs avec 2 colonnes :

    • Prestation : un lookup vers ta table Prestation

    • Utilisateur : un lookup vers la table Utilisateurs

    Sur le DefaultSelectedItems de DataCardValueIngénieurs mets le code suivant :

    Filter(n    Utilisateurs; n    systemuserid in ShowColumns(n        Filter(n            Prestations_Utilisateurs; n            Prestation.Prestation = varSelectedPrestation.Prestationn        ); n        "systemuserid"n    )n)

    Le Filter() de niveau 2 va chercher tous les utilisateurs rattachés à la prestation qui est en train d’être éditée.

    Le Filter() tout en haut va chercher ces utilisateurs directement dans la table Utilisateurs.

    Je suppose que la prestation en cours d’édition (potentiellement choisie sur un écran précédent dans une galerie) se trouve dans une variable varSelectedPrestation.

    Dans le OnSuccess de ton formulaire, met le code suivant pour rattacher les utilisateurs choisis à la prestation sélectionnée :

    RemoveIf(Prestations_Utilisateurs; Prestation.Prestation = Form1.LastSubmit.Prestation);;nForAll(n    DataCardValueIngénieurs.SelectedItems As Ingénieur;n    Patch(n        Prestations_Utilisateurs;n        Defaults(Prestations_Utilisateurs);n        {n            Prestation: varSelectedPrestation;n            Utilisateur: Ingénieurn        }n    )n)

    En fait on fait de l’annule-et-remplace…

    Voilà… J’ai écris ça un peu à l’arrache… Le principe est là… Si tu as des erreurs, n’hésite pas à revenir vers moi. J’essaierais de reproduire ton cas plus précisément demain pour corriger 2 ou 3 petites choses si nécessaire.

    CommentID=qwCzQUj8OVUU52Z, PostID=z324iIg1fpvSr5r

  • Zliga Oumaima

    Membre
    15 février 2023 à 15h37

    Bonjour

    Merci R3dKap pour ta réponse.

    J’ai fait ce que tu m’as dit

    Ma table Presta_Users avec 2 colonnes :

    • LookPresta: un lookup vers ta table Prestation

    • LookUsers: un lookup vers la table Utilisateurs

      J’ai pas la colonne avec le nom systemuserid mais j’ai pris Utilisateur (Unique identifier)

    J’ai mis ce code, mais il ne marche pas il m’affiche l’erreur (Dans la photo), j’ai un problème dans la fonction Showcolumns

    Filter(

    Utilisateurs,

    Utilisateur in ShowColumns(

    Filter(Presta_Users,LookPresta.Prestations=VarPrestaActive.Prestations),

    Utilisateur))

    Merci

    CommentID=8QlVtArwYB0razi, PostID=z324iIg1fpvSr5r

  • R3dKap

    Membre
    16 février 2023 à 9h49

    Ok. Alors, en fait c’est la colonne domainname qu’il faut utiliser… Et l’erreur du ShowColumns() vient du fait que tu n’as pas mis les guillemets autour du nom de la colonne dans le 2ème paramètre.

    Donc, la formule devrait être :

    Filter(n    Utilisateurs; n    domainname in ShowColumns(n        Filter(n            Presta_Users; n            LookPresta.Prestations = varPrestaActive.Titlen        ); n        "domainname"n    )n)

    Par contre, je suis surpris par ton varPrestaActive.Title. Normalement tu dois utiliser la colonne de clé primaire de ta table Prestations donc en toute logique, si ta variable varPrestaActive est bien un vrai enregistrement de ta table Prestations, ça devrait être varPrestaActive.Prestations.

    Tu me suis ?

    Sinon, mets-moi une capture des colonnes de tes tables Prestations et Presta_Users où on voit bien les libellés et surtout les noms logiques des colonnes… 😉

    CommentID=1ewl59Eu6cqnED7, PostID=z324iIg1fpvSr5r

Connectez-vous pour répondre.