Optimisation d’une application “calendrier de l’avent”

  • Optimisation d’une application “calendrier de l’avent”

    Posté par Emmanuel sur 20 décembre 2023 à 17h17

    Bonsoir à tous,

    J’ai trouvé une APP sympa pour proposer un calendrier de l’avent.
    https://blog.atwork.at/post/PowerApps-Adventcalendar

    Les sources de données sont 2 listes SharePoint.
    Quand on clique sur une case du calendrier, on récupère dans la liste adventcalendar l’état de la case (colonne Open) et on le bascule (ouvert/fermé) + Patch sur la liste.

    Toutes les images de l’écran sont rafraichies avec des appels LookUp

    If(LookUp(adventcalendar; Title=username.Text && Door = 13).Open;LookUp(adventcalendardoors; Title=”13″).DoorImage;LookUp(adventcalendardoors; Title=”13″).DoorNumberImage).Full

    Avez-vous une idée de comment optimiser cette application pour éviter de réactualiser les 24 images + les appels getRows alors que l’état d’une seule case a été modifié ?

    R3dKap a répondu Il y a 10 mois, 3 semaines 2 Membres · 5 Réponses
  • 5 Réponses
  • R3dKap

    Membre
    22 décembre 2023 à 14h20

    Salut Bernard,

    Si ton objectif c’est d’éviter les appels à la liste SharePoint, la solution la plus simple que je vois c’est de charger la liste adventcalendar dans une collection au démarrage de l’application et ensuite d’utiliser cette collection partout dans l’application plutôt que d’attaquer à chaque fois la liste SP. Il n’y aura qu’au niveau des patchs qu’il faudrait évidemment que tu attaques la liste SP pour la mettre à jour. Mais pour toutes les opérations de lecture, autant le faire “en local” depuis la collection.

    • Emmanuel

      Membre
      28 décembre 2023 à 14h37

      Bonjour Emmanuel,

      • Oui mon objectif est bien d’éviter les appels à la liste SharePoint
      • J’ai chargé la liste adventcalendar dans la collection adventcalendarCollection au démarrage de l’application (dans l’action OnStart) :
      • J’ai utilisé cette collection partout dans l’application à la place de la liste SP.
      • Pour la mise à jour, j’ai appliqué un Patch sur la collection et sur la liste SP, est-ce la bonne façon de faire ou faut-il appliquer un Patch sur la collection et un ClearCollect pour recharger la collection à partir de la liste SP (ligne en commentaire gras) ?

      // Lookup the open status of the current door and react
      // First, check if we can open the door by comparing with Today
      Set(mydate; DateValue(Year(Now()) & “-” & Month(Now()) & “-” & door));;
      //Set(mydate, DateValue(Year(Now()) & “-12-” & door));
      If(DateValue(Text(Now();”yyyy-mm-dd”))>=mydate;
      // date is ok. Negate the open status from the list
      Set(myopen;!LookUp(adventcalendarCollection; Titre=username.Text && Door = door).Open);;
      // Change the open status
      Patch(
      adventcalendar;
      LookUp(adventcalendar; Title=username.Text && Door = door);
      { Open : myopen }
      );;
      Patch(
      adventcalendarCollection;
      LookUp(adventcalendarCollection; Title=username.Text && Door = door);
      { Open : myopen }
      );;
      //ClearCollect(adventcalendarCollection;adventcalendar);;
      // open the URL
      If(myopen; Launch(LookUp(adventcalendardoors; Title = Text(door)).DoorLink));;
      ;
      // too early
      Notify(“Sorry, you cannot open door ” & door & ” before ” & mydate;NotificationType.Information);;
      );;

      • Cette réponse a été modifiée Il y a 11 mois par  Emmanuel.
      • Cette réponse a été modifiée Il y a 11 mois par  Emmanuel.
  • R3dKap

    Membre
    30 décembre 2023 à 13h20

    Salut Emmanuel,

    Oui le principe consiste à patcher la liste SP puis à mettre à jour la collection.

    A noter que la fonction Patch() renvoie l’enregistrement mis à jour. Tu peux donc le récupérer pour mettre à jour ensuite la collection.

    • Emmanuel

      Membre
      5 janvier 2024 à 12h31

      Bonjour Emmanuel,

      Tout d’abord meilleur voeux pour cette année 2024 qui débute !

      Je mets à jour la liste SP avec l’instruction Patch.
      Le Patch est lui-même intégré dans une instruction Collect sur la collection.
      A l’excécution il n’y a pas d’erreur mais la collection ne se met pas à jour.

      La syntaxe est-elle correcte ?

      Collect(
      adventcalendarCollection;
      Patch(
      adventcalendar;
      LookUp(adventcalendar; Title=username.Text && Door = door);
      { Open : myopen }
      );;
      );;

      • R3dKap

        Membre
        7 janvier 2024 à 20h55

        Je te suggère de séparer le Patch() du Collect() car il te faut gérer les erreurs éventuelles du Patch() :

        <code class="language-plaintext">UpdateContext({locUpdatedItem: Patch(adventcalendar; ...etc...)});;
        If(
          IsBlank(locUpdatedItem);
          Notify("Erreur lors de la mise à jour !");
          UpdateIf(adventcalendarCollection; Title=username.Text && Door=door; locUpdatedItem)
        )

        Et je remplace le Collect() par un UpdateIf(). Ou alors avant ton Collect() t’es obligé de mettre un RemoveIf() pour éviter les doublons dans ta collection.

Connectez-vous pour répondre.