Problème de formule

  • Problème de formule

    Posté par Tom Victor sur 14 juin 2024 à 10h50

    Bonjour,

    J’ai un problème avec une de mes formules qui doit récupérer le temps passé des prestation selon la commande que nous avons choisis.

    Pour avoir plus de contexte, entre ma prestation et ma commande, j’ai une liste qui répertorie toute les lignes de commande. Quand je crée une prestation elle provient forcément de la liste LigneCommande.

    Voici ma formule :

    <pre class=”language-markup”>Sum(Filter('IX-Prestation'; ligneCommande.Id = LookUp('IX-LigneCommande'; Commande.Id = Gallery8.Selected.ID;ligneCommande.Id));temps_Passe)

    Avec cette formule, je récupère toute les prestations ce qui n’est pas ce que je recherche…

    De plus je vois qu’il récupère le bon ID pour ma Commande mais qu’il récupère tout de même tout les ID de ligneCommande.

    Merci pour votre aide,

    Tom Victor

    Tom Victor a répondu Il y a 5 mois, 1 semaine 2 Membres · 12 Réponses
  • 12 Réponses
  • R3dKap

    Membre
    14 juin 2024 à 12h45

    Salut Tom,

    Essaie ceci :

    <pre class=”language-markup”>Sum(Filter('IX-Prestation'; ligneCommande.Id = Gallery8.Selected.ID);temps_Passe)

  • Tom Victor

    Membre
    14 juin 2024 à 14h00

    Salut R3dKap,

    J’ai essayé ta formule et ceci ne marche toujours pas. Cette fois-ci plus rien n’est affiché.

  • R3dKap

    Membre
    14 juin 2024 à 15h32

    Ok, alors il me faudrait les infos suivantes :

    1. C’est des listes SharePoint que tu utilises ou des tables Dataverse ?
    2. Quelles sont les colonnes de tes 3 listes/tables ? Surtout les colonnes qui les connectent entre elles…
    3. Qu’as-tu dans le Items de ta galerie Gallery8 ?
    4. Quelle est la logique métier entre tes 3 listes ? Chaque commande a plusieurs lignes de commandes + il y a plusieurs prestations pour chaque commande ? J’ai l’impression que les prestations et lignes de commande font un peu doublon, mais je me trompe sûrement…
  • Tom Victor

    Membre
    14 juin 2024 à 16h01

    Pas de soucis voici les infos que tu m’as demandé :

    <div>1. Ce sont des listes SharePoint.</div>
    <div>2. Dans la table Commandes j’ai :</div>

    • Commande
    • Description
    • Date

    <div> </div>
    <div> Dans la table LigneCommande j’ai : </div>

    • Commande(LookUp)
    • LigneCommande
    • PU
    • Quantité

    <div> </div>
    <div> Dans la table Prestation j’ai : </div>

    • ligneCommande(LookUp)
    • temps_Passe
    • lieu
    • intervenant
    • datePrestation

    <div> </div>
    <div>3. Dans le Items de Gallery8 j’ai ceci :</div>
    <div> </div>
    <div>
    <pre class=”language-markup”>Sort(Filter('IX-Commande'; Client.Value = Gallery7.Selected.nom); nom; SortOrder.Ascending)
    </div>
    <div>PS: pas besoin de te montrer Gallery7 car elle est utilisé en temps que sélecton, il n’y a pas de réel intéret je pense</div>
    <div> </div>
    <div>4. Premièrement je crée une commande qui me sert de référentiel. Ensuite, je crée des ligne de commande qui me permette de montrer les tâches a faire pendant cette commande. Enfin Prestation me sert pour pouvoir écrire quelque part ce que j’ai fais pour quelle commande et pour quelle ligne de commande (C’est ce que j’ai effectué en gros).</div>

  • R3dKap

    Membre
    14 juin 2024 à 18h42

    Super. Merci pour le détail.

    Question importante : est-ce qu’il peut y avoir plusieurs lignes dans Prestations qui pointent vers la même ligne de commande ? C’est à dire : est-ce qu’il peut y avoir plusieurs personnes qui réalisent la même ligne de commande ?

    Sinon une remarque : pourquoi ton Sort() sur Gallery8 trie sur la colonne Nom qui n’existe pas dans ta liste des Commandes ? N’y a-t-il pas confusion entre le nom du client et le n° de la commande (qui doit être la colonne Commande je suppose).

  • Tom Victor

    Membre
    17 juin 2024 à 9h11

    En effet il peut y avoir plusieurs prestation pour une ligne de commande avec différent prestataires.

    Pour ce qui est du Nom : Commande = Nom (je ne sais pas pourquoi elle a été nommée de cette manière d’autant plus que dans la liste LigneCommande elle est nommée Commande…)

  • R3dKap

    Membre
    17 juin 2024 à 11h18

    Ok, alors essaie ceci :

    <pre class=”language-markup”>Sum(
    Filter(
    Prestations;
    Ligne.Id in ShowColumns(
    Filter(
    Lignes;
    Commande.Id = Gallery8.Selected.ID
    );
    ID
    )
    );
    Temps
    )

    Je te laisse mettre les bons noms de listes et de colonnes. ATTENTION à bien respecter les majuscules et minuscules entre ID et Id…😉
    Explications (on lit toujours une formule de l’intérieur vers l’extérieur) :

    • on filtre d’abord la liste des lignes correspondant à la commande
    • ensuite on restreint le résultat à la seule colonne ID pour pouvoir utiliser l’opérateur in
    • puis, on filtre les lignes de prestations sur la base des lignes identifiées précédemment
    • et enfin on somme le temps passé

    Dans cette formule tu vas avoir un problème de délégation car la fonction Filter() n’est pas capable de déléguer à SharePoint une condition du type ChampLookup.Id. Donc si tu as un jour plus de 2000 lignes dans ta liste Lignes ou ta liste Prestations, le résultat sera partiel voire vide, donc incorrect.

    Pour contourner ce problème je te recommande d’ajouter dans chacune de ces 2 listes une colonne qui va contenir l’ID de la donné liée. Soit :

    • Dans la liste Lignes : une colonne CommandeID de type numérique qui va stocker l’ID de la commande concernée
    • Dans la liste Prestations : une colonne LigneID de type numérique qui va stocker l’ID de la ligne de commande concernée

    Ca fait un peu redondance mais je me l’autorise pour régler les pronlèmes de délégation ou faciliter les opérations de filtrage des données.

    Alors tu pourras écrire la formule ci-dessus comme ceci et tu n’auras plus de problème de délégation :

    <pre class=”language-markup”>Sum(
    Filter(
    Prestations;
    LigneID in ShowColumns(
    Filter(
    Lignes;
    CommandeID = Gallery8.Selected.ID
    );
    ID
    )
    );
    Temps
    )

    Autre piste d’amélioration : ajouter directement une colonne CommandeID à ta liste Prestations pour éviter de devoir filtrer la liste Lignes. Tu pourrais alors simplement écrire :

    <pre class=”language-markup”>Sum(
    Filter(
    Prestations;
    CommandeID = Gallery8.Selected.ID
    );
    Temps
    )

    Voilou… N’hésite pas si tu as encore des questions…

  • Tom Victor

    Membre
    17 juin 2024 à 11h27

    Merci beaucoup pour les conseils, j’ai essayé ta formule et elle marche parfaitement !

  • R3dKap

    Membre
    17 juin 2024 à 11h28

    Déjà ?! 😂

  • Tom Victor

    Membre
    17 juin 2024 à 11h30

    On essaye d’être rapide vu qu’on est 2 sur l’appli 😂

  • Tom Victor

    Membre
    17 juin 2024 à 14h24

    Re bonjour, cette fois ci j’ai un soucis qui me parait étrange, je m’explique :

    J’ai fais différent filtre sur des galeries et jusque l’a je n’ai jamais rencontrer de soucis particulier (les filtres que j’utilise sont présent uniquement pour afficher les informations dont j’ai besoin en temps voulu).

    J’ai réalisé un filtre comme toute les autres fois et cette fois ci j’ai eu ce code d’erreur :

    Je ne comprend pas pourquoi j’ai une erreur sachant que c’est exactement le même filtre dans d’autre page (et même dans d’autres appli).

    Voici la formule que j’utilise pour filtrer et qui ne m’as jamais posé de problème jusqu’ici :

    <pre class=”language-markup”>LookUp('IX-LigneTache'; Commande.Value = Gallery9 .Selected.Commande)

  • Tom Victor

    Membre
    17 juin 2024 à 14h59

    Fausse alerte c’est juste moi qui suis devenue aveugle et qui a voulu filtrer une galerie sur elle-même

Connectez-vous pour répondre.