Reply To: Document PDF vide

  • R3dKap

    Member
    5 décembre 2022 at 8h51

    Commençons par la structure logique de ton formulaire…

    Répartir un formulaire sur plusieurs écrans ça a l’avantage d’avoir des écrans légers mais l’inconvénient d’avoir une gestion plus complexe. En effet, pour des raisons de performances, la bonne pratique veut qu’à partir d’un écran A on ne fasse jamais référence qu’aux contrôles de cet écran A et surtout pas à des contrôles situés sur un écran B.

    Or, ton formulaire étant éclaté sur 3 écrans, ton Patch() sur l’écran de fin est obligé de faire référence aux formulaires de début et du milieu qui sont sur les 2 autres écrans : pas bieeeen… 😉
    Pour éviter ça, il faut “transporter” les données d’un écran à l’autre. C’est assez simple à faire…

    Sur ton écran de début, sur le bouton pour passer à l’écran suivant

    Navigate('Ecran milieu'; ScreenTransition.None; {locDebutUpdates: FormDebut.Updates}).

    Le troisième paramètre du Navigate() te permet d’envoyer des données à l’écran où tu vas naviguer. Ces données sont transmises sous la forme d’un enregistrement, c’est à dire au format {nomColonne1: valeurColonne1; nomColonne2: valeurColonne2; ...). Ce que fait Power Apps au moment de la navigation c’est qu’il crée sur l’écran d’arrivée une variable locale pour chacune des nomColonneX du 3è paramètre de ton Navigate(). Comme si sur l’écran d’arrivée tu avais fait un UpdateContext({nomColonne1: valeurColonne1; nomColonne2: valeurColonne2; ...}).

    Et donc sur l’écran du milieu, sur le bouton pour passer au dernier écran :

    Navigate('Ecran milieu'; ScreenTransition.None; {locDebutUpdates: locDebutUpdates; locMilieuUpdates: FormMilieu.Updates}).

    Eh oui, il ne faut pas oublier aussi de transmettre au dernier écran le locDebutUpdates.

    Tu te retrouves donc sur ton écran de fin avec le Patch() suivant :

    Patch('Validation évaluation chariots élévateurs'; Defaults('Validation évaluation chariots élévateurs'); locDebutUpdates; locMilieuUpdates; FormFin.Updates)

    Et là c’est bon parce-que tu ne fais plus référence aux formulaires qui sont sur les autres écrans.

    Tu me suis ?

    Par contre… Une autre solution (que perso je trouve assez élégante) pour éviter de scroller dans un formulaire consiste à faire un formulaire à onglets :

    • tu mets 3 boutons sur ton écran, en dehors du formulaire

    • au clic sur les boutons tu définis une variable locale qui va contenir un code qui représente chaque partie du formulaire

      • 1er bouton : UpdateContext({locOngletForm: "DEB"}) pour la première partie de ton formulaire

      • 2e bouton : UpdateContext({locOngletForm: "MIL"}) pour la 2è partie de ton formulaire

      • 3e bouton : UpdateContext({locOngletForm: "FIN"}) pour la dernière partie de ton formulaire

    • tu utilises la valeur de locOngletForm pour donner une couleur particulière au bouton qui est actif

    • sur chacun de tes datacards de formulaire tu définis sa visibilité en fonction de s’il doit apparaître au début, au milieu ou à la fin :

      • locOngletForm = "DEB" pour les datacards du début

      • locOngletForm = "MIL" pour les datacards du milieu

      • locOngletForm = "FIN" pour les datacards de la fin

    • du coup sur le bouton d’enregistrement de ton écran, tu peux faire un simple SubmitForm() pour enregistrer tes données (plus besoin de Patch()).

    Tu me suis toujours ? 🙂

    Revenons au code actuel de ton bouton sur ton écran de fin actuel :

    PDFdocumentRecertification.Run(HtmlText1_2.HtmlText; DataCardValue40.Text; ur");;nPatch('Validation évaluation chariots élévateurs'; Defaults('Validation évaluation chariots élévateurs'); FormDebut.Updates; FormMilieu.Updates; FormFin.Updates);; nNavigate(HTML_FR;ScreenTransition.None)

    Y’a un cas de figure où tu vas te retrouver dans une situation compliquée : c’est si ton Patch() ne marche pas -> tu te retrouves avec un PDF alors que les données n’existent pas dans ta liste SharePoint et en plus tu navigues vers l’écran suivant alors que quelque chose s’est mal passé sur ton écran actuel.
    D’ailleurs, ça me fait penser que c’est normal que ton Navigate() ne marchait pas dans le OnSuccess puisque le OnSuccess est déclenché par le SubmitForm() (que tu n’appelles pas puisque tu fais un Patch()).

    Il faut donc que tu mettes en place une gestion des erreurs sur ton Patch(). Pour cela on utilise la fonction Errors() qui renvoie la liste des erreurs qui sont apparues lors de la dernière opération effectuée sur une source de données :

    Patch('Validation évaluation chariots élévateurs'; Defaults('Validation évaluation chariots élévateurs'); FormDebut.Updates; FormMilieu.Updates; FormFin.Updates);;nIf(n    !IsEmpty(Errors('Validation évaluation chariots élévateurs'));n    Notify("Une erreur est survenue à l'enregistrement de vos données !"; NotificationType.Error; 4000);n    PDFdocumentRecertification.Run(HtmlText1_2.HtmlText; DataCardValue40.Text; ur");;n    Navigate(HTML_FR;ScreenTransition.None)n)

    En gros c’est :

    • si j’ai des erreurs suite au Patch() que j’ai fait :

      • alors j’affiche un message d’erreur à l’écran

      • sinon je déclenche la création PDF et je navigue

    Autre intérêt de procéder comme ceci : si par hasard ton flux de génération de PDF va lire les données dans ta liste SharePoint, cela te garanti que ta donnée a bien été enregistrée dans SharePoint AVANT que tu n’appelles le flux qui en a justement besoin.

    Enfin, pour ce qui est de la génération de ton PDF, même remarque que précédemment : tu n’est pas censé faire référence aux datacards qui sont situés sur les autres écrans. Il faut donc les remplacer par les variables locDebutUpdates, locMilieuUpdates et FormFin.Updates. Une fois que ton HTML est construit (en caché) sur ton écran de fin, transmets-le à ton écran de visualisation de PDF via le Navigate() comme vu précédemment : Navigate(HTML_FR; ScreenTransition.None; {locHTML: HtmlText1_2.HtmlText}). Et sur ton écran de visualisation, utilise locHTML comme valeur par défaut sur ton contrôle HTML. Comme ça, sur l’écran de visu du PDF tu évites de faire référence à ton contrôle caché HtmlText1_2 qui est sur l’écran de fin.

    Voilà… Quelle que soit la solution que tu choisisses, n’hésite pas à revenir vers nous si tu as encore des soucis. Peut-être, ne casse pas tout et met juste en place la transmission des données des formulaires d’un écran à l’autre… 😉

    CommentID=PFRYtEXIvj0mI4d, PostID=7GdImoaDXz8V0Lo