Document PDF vide
Tagged: Microsoft 365, powerapps
-
Document PDF vide
Posté par Estelle sur 1 décembre 2022 at 22h01Bonjour,
Me voilà avec un nouveau problème. J’ai fait une application d’évaluation pratique d’utilisation d’un appareil. Je veux qu’à la fin, quand on clique sur “submit”, une nouvelle ligne s’ajoute dans la liste sharepoint et un document pdf se créé avec les infos de l’évaluation (avec power automate). Quand on clique sur “submit” on arrive automatiquement sur la page dans laquelle il y a le Texte HTML de mon future pdf. Ça marche très bien, le html est bien rempli sur power apps… par contre, parfois le pdf est correct, parfois c’est juste écris “Affichez votre texte HTML ici”.
Où est-ce que je dois chercher le problème ? Power Automate ou power Apps ? est-ce qu’il se peut qu’il y ait un problème de temps de chargement des infos de mon html qui fait que power automate ne lit rien ?
Merci
Estelle
PostID=7GdImoaDXz8V0Lo
Fabrice a répondu 9 months, 1 week ago 4 Membres · 16 Réponses -
16 Réponses
-
Salut Estelle,
À mon avis le problème est du côté Power Apps. Dans certains cas de figure tu dois avoir une erreur de balise Html, soit mal formée soit non fermée. C’est pour ça que ton PDF n’est pas généré.
Le convertisseur PDF natif dans Power Automate attends de l’Html parfaitement formé. Il est un peu touchy… 😉
CommentID=cFl0tOF99sOVscD, PostID=7GdImoaDXz8V0Lo
-
Juste pour essayer, hier soir j’ai mis la même formule à 3 endroits différents dans powerapps : au moment de cliquer sur Submit, dans “On visible” sur ma page où le html apparaît et quand on clique sur “Accueil” dans ma page html. Pour le même document html, ça va parfois marcher et parfois non. Est-ce que PowerApps me corrige mon html à certains moments ?
Je vous enverrais bien le html que j’ai fait pour que vous regardiez, mais il est pas mal long !
SubCommentID=hcDpvTLeGbMKGVM, CommentID=cFl0tOF99sOVscD, PostID=7GdImoaDXz8V0Lo
-
-
Cela peut se produire pour plusieurs raisons :
-
L’objet HtmlText n’est pas sur l’écran actif
-
Le patch de la ligne SP ne se fait pas en une fois (ex un envoie de formulaire suivi d’un patch pour ajouter le contenu html) => ajouter un délai + obtenir un item dans une liste SP dans power automate
-
Le patch est envoyé avant que le contenu html soit affiché dans l’objet => ajouter un timer avant le patch
CommentID=NQHGAWEo2Nw2QIs, PostID=7GdImoaDXz8V0Lo
-
-
Ok j’ai plein de questions :
-
L’objet HtmlText n’est pas sur la même page que le bouton “Submit”. Est-ce que c’est correct que sur mon bouton “submit” je commence par Navigate() puis je fais ma formule pour mon pdf, ou ma formule doit être sur ma page où il y a le HtmlText (dans “On visible” par exemple)
-
Comment j’ajoute un timer ?
Merci
CommentID=VQuLlprxXKWrBeN, PostID=7GdImoaDXz8V0Lo
-
-
Estelle est-ce que tu peux nous décrire plus précisément l’architecture de ta solution ? Ce que j’ai compris jusque là :
-
Sur un écran tu as un formulaire SharePoint où l’utilisateur fait son évaluation
-
Une fois qu’il a terminé il clique sur un bouton SUBMIT ce qui soumet le formulaire et crée donc la ligne correspondante dans ta liste SP
-
A la suite de quoi il arrive sur un autre écran où tu lui affiches son évaluation au format HTML (où tu utilises donc les données de l’évaluation créée précédemment)
Questions :
-
Est-ce que la génération du PDF est déclenchée par l’apparition de la nouvelle ligne dans la liste SP ou par le clic d’un bouton sur l’écran avec l’HTML ?
-
Lors de la génération du PDF (si elle déclenchée par un bouton sur ton écran) est-ce que tu transmets l’HTML de l’écran au flux Power Automate ?
Par rapport à tes questions :
-
La bonne pratique veut que l’on ne mette pas de code après un Navigate(). En effet, Power Apps n’attends pas la fin de l’exécution de ton bouton SUBMIT pour naviguer : il voit le Navigate() -> il navigue. Et du coup le code qui avait derrière s’exécute alors que tu n’es même plus sur l’écran où se trouve le bouton. Tu me suis ?
-
Autre bonne pratique : lorsque sur un écran où il y a un formulaire on veut naviguer vers un autre écran une fois que les données ont été correctement traitée, alors le Navigate() doit être placé dans l’événement OnSuccess du formulaire -> c’est lui qui garanti que tes données ont été correctement créées/mises à jour.
Il faut voir dans sa tête l’enchaînement des événements qui vont se produire quand tu fais une action :
-
Je clique sur SUBMIT
-
Cela déclenche le SubmitForm() -> le système effectue l’opération sur la source de données -> on ne met pas de code non plus après un SubmitForm() puisqu’on ne sait pas encore si ça va bien se passer ou pas.
-
Une fois que le système a réalisé l’opération sur la source de données, il y a 2 résultats possibles :
-
Ca s’est mal passé -> c’est l’événement OnFailure du formulaire qui est déclenché
-
C’est là qu’en général on affiche un message d’erreur et du coup on ne quitte pas l’écran on reste dessus pour donner une chance à l’utilisateur de retenter
-
-
Ca s’est bien passé -> c’est l’événement OnSuccess du formulaire qui est déclenché -> la propriété
MonFormulaire.LastSubmit
contient l’enregistrement complet qui vient d’être créé ou modifié-
C’est là qu’on affiche un message de succès et qu’on navigue
-
C’est là aussi qu’on peut éventuellement faire une autre opération (avec un Patch() par ex.) sur une autre source de données qui est dépendante de la première
-
etc.
-
-
Tu vois l’idée ?
CommentID=2zsNgluPNgOUIJ7, PostID=7GdImoaDXz8V0Lo
-
-
Merci beaucoup pour votre aide à tous les 2. Là, je crois qu’il y a beaucoup de choses que je ne connais pas, alors je ne suis pas sûre du tout que tout ce que j’ai fait soit bon 🙁 . Déjà, vu que l’HtmlText n’était pas sur l’écran actif, je l’ai mis en non visible sur l’écran actif et ça semble résoudre le problème… mais est-ce vraiment le cas…
Donc voilà ma structure. J’ai un formulaire d’un liste sharepoint qui est remplit grace à 3 écrans (je ne voulais pas que les gens aient à scroller l’écran). Sur ma dernière page de formulaire, j’ai le bouton submit. Je voudrais que ce bouton permette de faire 3 choses : enregistrer les infos sur ma liste sharepoint, envoyer mon pdf et naviguer sur un écran où on visualise ce que va donner le pdf.
Suite à nos échanges, j’ai mis le HtmlText dans l’écran contenant le bouton submit, puis sur mon écran de visualisation du pdf, j’ai fait référence à cet HtmlText. J’ai testé de mettre la navigation dans “on Success” mais ça ne marchait pas.
Du coup voici ce que j’ai écrit pour mon bouton submit :
PDFdocumentRecertification.Run(HtmlText1_2.HtmlText; DataCardValue40.Text; ur”) ;; Patch(‘Validation évaluation chariots élévateurs’; Defaults(‘Validation évaluation chariots élévateurs’); FormDebut.Updates; FormMilieu.Updates; FormFin.Updates) ;; Navigate(HTML_FR;ScreenTransition.None)
Est-ce que j’ai tout faux ?
Aussi, dans mon HtmlText, je fais références aux DataCard. Exemple ci-dessous. C’est pas ça que j’aurais dû faire ?
CommentID=vLjwkZ6vqnmkK0o, PostID=7GdImoaDXz8V0Lo
-
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 unUpdateContext({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
-
Bonjour,
Merci beaucoup pour le temps passé à m’aider. C’est super intéressant !
Pour cette fois, je ne vais pas tout défaire et donc vais garder la transmission des données des formulaires d’un écran à l’autre, mais c’est certain que je vais utiliser l’autre solution pour mon autre projet (je suis tombée amoureuse de Power Apps :-p ).
Par contre le bout que je ne comprends pas, c’est ce que je vais mettre dans mon HtlmText, Comment je sais à quoi correspond chaque Datacard dans mes locDebut(/Milieu)Updates ? Comment je fais référence à ce qu’est devenu ma DataCardKey1 et mon Radio1_1 par exemple ?
Question conne : Est-ce qu’avec des updates de PowerApps, je peux me retrouver que dans 3 mois mes applis ne marchent plus ? J’y mets tellement de temps que ça me ferait ch… lol
SubCommentID=EAKc1o0yuK6yh15, CommentID=PFRYtEXIvj0mI4d, PostID=7GdImoaDXz8V0Lo
-
Avec plaisir… J’😍 les gens qui 😍 Power Apps… 😁
Alors pour ton HtmlText… En fait, un datacard n’est qu’un joli truc qui t’affiches sur ton écran tout ce qu’il faut pour afficher/saisir les données d’UNE COLONNE de ta liste SharePoint ou de ta table Dataverse : une étoile si la colonne est obligatoire, le libellé de la colonne, le contrôle pour la saisie de la donnée (qui change selon le type de donnée de la colonne) et un libellé pour afficher des messages d’erreur juste en-dessous du contrôle de saisie. Mais tout ça ne sert que pour UNE COLONNE précise : celle qui est spécifiée dans la propriété DataField de ton datacard.
Donc pour résumer : un datacard = une colonne de ta liste. Donc, dans ton HtmlText :
-
si DataCardKey1 est dans le datacard de la colonne “Prénom” alors dans ton HtmlText :
locDebut.Prénom
-
si Radio1_1 est dans le datacard de la colonne “Marié” alors dans ton HtmlText :
locDebut.Marié
C’est tout… 😉
Et pour répondre à ta dernière question : lorsque tu publies une application Power Apps elle se verrouille sur la version du Core Power Apps à ce moment-là. Cela garanti sa stabilité dans la durée.
CEPENDANT… Il y a des parties du Core Power Apps qui, lorsqu’elles sont modifiées par l’équipe Microsoft, peuvent effectivement avoir des effets de bords sur ton application publiée. C’est la raison pour laquelle Microsoft recommande de republier régulièrement ses applications afin qu’elles se branchent sur la dernière version du Core Power Apps et que cela fasse éventuellement ressortir des petits soucis que tu pourras alors facilement corriger.Voilou…
SubCommentID=V3SrxmycnTo6Tzb, CommentID=PFRYtEXIvj0mI4d, PostID=7GdImoaDXz8V0Lo
-
-
-
Allez, j’y suis presque… je crois…
Alors pour mes Radio, ça va bien, j’arrive à remplir mon HtmlText. Par contre dans une DataCard, il y a la datacardkey qui définit le titre de mon item à évaluer, et le bouton radio qui permet d’évaluer la personne sur cet item. Est-ce qu’il y a quelque chose qui correspond à mon datacardkey dans mon locDebut ?
CommentID=GsdHJVYfEGzEBFy, PostID=7GdImoaDXz8V0Lo
-
Le datacardkey c’est le libellé de ta colonne. Elle est fixe et ne change jamais. Est-ce que tu voudrais afficher le libellé de ta colonne dans ton HTML ?
Pour le dire autrement : il n’y a pas de données sur la datacardkey…
CommentID=jQ3TEQeQgfznBH7, PostID=7GdImoaDXz8V0Lo
-
Ce n’est pas une obligation de l’avoir donc c’est ok.
Si on est dans l’écran du milieu par exemple, et que la personne veut changer une réponse de l’écran du début, est-ce que je dois écrire quelque chose pour conserver les réponses précédentes quand il passe d’un écran à l’autre.
Et pour être sûre, est-ce que j’ai raison de penser que mes locDebut et locMilieu, je n’ai pas besoin de les vider quand je retourne à l’écran d’accueil parce que c’est des variables locales qui ne fonctionnent que sur 1 écran ?
Merci
SubCommentID=N58pmhMbP2QBeNj, CommentID=jQ3TEQeQgfznBH7, PostID=7GdImoaDXz8V0Lo
-
Si tu veux afficher le libellé “officiel” de ta colonne (celle qui vient directement de SharePoint) dans ton HTML c’est possible : tu récupères ce qu’il y a dans la propriété DisplayName du datacard (c’est une fonction DataSourceInfo(…)). Tu mets cette formule DataSourceInfo(…) dans ton HTML et tu afficheras le libellé de ta colonne dans ton HTML. Et si tu changes le libellé de ta colonne dans SharePoint ça impactera directement ton HTML. Tu me suis ?
Si ton utilisateur est sur l’écran du milieu et qu’il veut revenir au début pour corriger quelque chose, il te suffit de rajouter sur ton écran du milieu un bouton “PRECEDENT” ou “RETOUR” dans lequel tu appelles simplement la fonction Back() qui te sert à revenir à l’écran précédent dans l’enchaînement des navigations d’écrans…
Et sinon, une variable locale n’existe que sur l’écran où elle est déclarée/utilisée mais ATTENTION elle n’est pas réinitialisée lorsque tu quittes l’écran. Ca veut dire que :
-
Ecran 1, variable locale locVariable = “toto“
-
Tu navigues vers l’écran 2
-
Tu reviens vers l’écran 1
-
locVariable est toujours = à “toto“
Donc, la bonne pratique c’est qu’on réinitialise les variables locale sur l’événement OnHidden de l’écran. Mais uniquement si c’est nécessaire -> faut voir en fonction de la logique de ton application… 😉
Quelques exemples de réinitialisation de variables locales :UpdateContext(n {n locVariableBooléenne: false;n locVariableText: Blank();n locVariableDate: Blank();n locVariableEnregistrement: Blank()n }n)
SubCommentID=lAhtvohvBaI4LPd, CommentID=jQ3TEQeQgfznBH7, PostID=7GdImoaDXz8V0Lo
-
-
J’avance bien dans mes changements, mais ça m’amène plein de questions :
-
Est-ce qu’il existe un équivalent au If( !IsEmpty(Errors…)) pour mon PDFdocumentRecertification.Run ?
-
Dans un bouton, peut-on faire référence à une galerie qui est sur un autre écran, ou ce n’est pas conseillé non plus. Ex If(Gallery.Selected.Adresse=”x”;….)
-
Je voudrais que mon bouton submit soit invisible quand il n’y a pas de connection internet, alors j’ai écrit “If(Connection.Connected=false;false;true)” mais ça n’a pas l’air de marcher
SubCommentID=1EnJai5uGvzOiZ2, CommentID=jQ3TEQeQgfznBH7, PostID=7GdImoaDXz8V0Lo
-
-
-
Salut Estelle, content que ça avance bien… 😉
-
Lorsque tu crées un flux Power Automate avec un déclencheur Power Apps tu as devant toi 2 possibilités :
-
Soit tu termines ton flux par une action Répondre à Power Apps et tu ajoutes sur l’action une valeur de type texte qui sera renvoyé à ton application (du coup dans ton flux si tout se passe bien tu peux par exemple renvoyer “OK” ou dans le cas contraire “KO” et t’en servir dans ton app)
-
Soit tu ne termines PAS ton flux par Répondre à Power Apps
-
Dans le premier cas, lorsque tu appelleras le flux depuis ton app, l’application va ATTENDRE la fin de l’exécution du flux pour continuer la suite du code -> donc, attention à ne pas mettre dans ce cas des appels à des flux qui durent trop longtemps (10s max je dirais).
Dans le deuxième cas, lorsque tu appelleras le flux, l’application se contentera simplement de déclencher le flux et de passer à la suite du code.
Donc pour résumer : 1er cas -> tu peux récupérer un code retour ; 2 cas -> t’as pas de code retour.
Du coup, dans le 2è cas il faut que le flux mette par exemple à jour une données quelque part dans une liste pour dire si le traitement s’est bien passé et que côté application tu regardes toutes les 5 secondes pour aller lire cette liste et voir comment ça s’est passé (ou laisser l’utilisateur cliquer sur un bouton refresh pour voir l’état). Tu peux aussi dans le flux envoyer une notification à l’utilisateur une fois le traitement terminé.-
Que ce soit dans un bouton ou ailleurs, la règle est toujours la même : il n’est pas conseillé de faire appel à des contrôles en-dehors de l’écran sur lequel on se trouve. Pour le cas de savoir sur plusieurs écrans quelle sélection a fait un utilisateur dans une galerie sur un premier écran, tu as 3 solutions :
-
Sur le OnSelect de la galerie tu mets le Gallery1.Selected dans une variable globale que tu pourras du coup utiliser où tu veux
-
Tu transmets le Gallery1.Selected à l’écran suivant via le Navigate() comme vu précédemment
-
Tu crées une formule nommée
nfGallery1SelectedItem = Gallery1.Selected
(voir ma petite session au FPB d’octobre 😉)
-
J’ai une petite préférence pour la 3è désormais… 😊
-
Ecrire ce que tu as écris reviens exactement à écrire simplement
Connection.Connected
dans la propriété OnVisible de ton bouton : en effet, la propriété Connected est booléenne et prends déjà la valeur true ou false. En l’écrivant comme ça tu dis : si je si connecté je vois le bouton, sinon je ne le vois pas. En fait, de manière générale, écrireIf(A=true; true; false)
revient à écrireA
tout seul.
Par contre pour tester le mode déconnecté tu ne peux évidemment pas le faire dans un navigateur. Tu ne peux le tester que dans 2 cas de figure :
-
sur un téléphone
-
via l’application Power Apps pour Windows que tu peux télécharger dans le store -> tu te connectes avec ton compte, tu lances l’application, tu déconnectes ton wifi et tu vois si ça marche (le Connection.Connected doit passer à false dans les secondes qui suivent)
Voilou…
CommentID=QFavuePLWKgUlB6, PostID=7GdImoaDXz8V0Lo
-
-
Bonjour,
Je me permets de réactiver cette conversation. Je rencontre une difficulté identique au problème d’Estelle. Je génère un formulaire de saisie, en pdf depuis power apps, je l’envoie par mail et il s’enregistre correctement dans la ma liste SharePoint, cependant, le PDF reçu par mail est à blanc… J’ai une image qui est affiché et les saisies n’apparaissent pas du tout !
Je pense ne pas être loin de résoudre, mais je ne vois pas ce qui cloche.
J’ai tenté de m’etre un conteneur, de mofidier les fonctions fx pour générer pdf, rien y fait…
Merci pour vos lumières.
Connectez-vous pour répondre.