Formulaire d’affichage dynamique.

  • Formulaire d’affichage dynamique.

    Posté par Sacha sur 25 avril 2025 at 10h03

    Bonjour à tous,

    Cette fois-ci j’ai un problème de code. J’ai 5 écrans ou une liste liée à une liste Sharepoint s’affiche pour 5 types de câble différents (photo 1) :

    La flèche à droite doit me permettre d’accéder à un formulaire d’affichage montrant toutes les données du touret sur lequel je clique. Alors je rentre ce code dans la propriété OnSelect de la flèche :

    <pre class=”language-plaintext”>Set(TypeDeCableSelectionne; "ZPAU");;
    Set(SourceDeDonneesTourets; Stock_ZPAU);;
    Set(TouretSelectionne; ThisItem);;
    Navigate(DetailsTouret; ScreenTransition.Fade)

    Puis dans l’e formulaire de l’écran DetrailsTouret je rentre ce code :

    <pre class=”language-plaintext”>DataSource = SourceDeDonneesTourets
    Item = LookUp(SourceDeDonneesTourets; ID = TouretSelectionne.ID)

    Toutes les flèches de l’écran ZPAU fonctionne alors je code la même chose en adaptant la source de données comme ci-dessous :

    <pre class=”language-plaintext”>OnSelect = Set(TypeDeCableSelectionne; "SCG");;
    Set(SourceDeDonneesTourets; Stock_SCG);;
    Set(TouretSelectionne; ThisItem);;
    Navigate(DetailsTouret; ScreenTransition.Fade)

    Etrangement, cette fois aucune flèche ne fonctionne et j’ai 2 erreurs sur ‘Stock_SCG’ et ‘ThisItem’ disant :

    <pre class=”language-plaintext”>Type incompatible. Nous ne pouvons pas évaluer votre formule, car les types de variable de contexte ne sont pas compatibles avec les types de valeurs ailleurs dans votre application.

    J’ai fais plusieurs vérification, toutes les variables, les sources de données et les écrans sont bien écrits il n’y a pas d’erreurs la dessus mais ducoup je ne comprend pas d’ou ca vient.

    Dans l’attente de vos réponses.

    R3dKap a répondu 17 hours, 20 minutes ago 2 Membres · 3 Réponses
  • 3 Réponses
  • R3dKap

    Member
    25 avril 2025 at 11h11

    Salut @Sacha,

    Ce que tu veux faire n’est pas possible, en tout cas pas de cette manière : un formulaire ne peut pas prendre comme source de données une variable où la source de données changerait inopinément.

    Tu dois mettre 5 formulaires sur ton écran de détail (ou faire 5 écrans de détail, au choix) : un pour chaque liste. Puis, tu affiches le formulaire (ou tu choisis l’écran) en fonction du type de câble.

    J’en profite pour te signaler que la bonne pratique pour transmettre des données d’un écran à l’autre consiste à utiliser le 3è paramètre de la fonction Navigate(). Ce 3è paramètre est un enregistrement dont les colonnes vont être des variables locales créées uniquement sur l’écran cible.

    Donc, par exemple, sur l’écran CâbleZPAU :

    • OnSelect de la flèche : Navigate(DetailsTouret; ScreenTransition.Fade; {locSelectedTouret: ThisItem; locTypeCâble: "ZPAU"})

    Sur l’écran DetailsTouret :

    • DataSource du formulaire : Stock_ZPAU
    • Item du formulaire : locSelectedTouret
    • Visible du formulaire : locTypeCâble = "ZPAU"

    Etc…

  • Sacha

    Member
    25 avril 2025 at 15h10

    Ok je vais donc créer un formulaire par type de câble. Aussi, est ce que tu sais si il est possible via un bouton de passer d’un formulaire d’affichage à u formulaire de modification pour avoir la possibilité de mofidfier les données d’un touret via son formulaire d’affichage, ou est ce que je suis obligé de créer un nouvel écran ?

  • R3dKap

    Member
    25 avril 2025 at 23h08

    Tu n’as besoin que d’un seul formulaire car nativement un formulaire peut prendre 3 états :

    • création
    • modification
    • affichage

    Pour définir l’état du formulaire, il y a 2 possibilités :

    1. Définir une variable avec l’état et positionner cette variable sur la propriété DefaultMode du formulaire
    2. Utiliser les fonction NewForm(), EditForm() et ViewForm()

    Dans le premier cas, par exemple sur ton écran Câble ZPAU :

    • lorsque tu cliques sur le bouton Crayon d’une ligne, tu y mets le code : Navigate(DetailsTouret; ScreenTransition.Fade; {locSelectedTouret: ThisItem; locTypeCâble: "ZPAU"; locFormMode: FormMode.Edit})
    • lorsque tu cliques sur le bouton Flèche tu y mets le code : Navigate(DetailsTouret; ScreenTransition.Fade; {locSelectedTouret: ThisItem; locTypeCâble: "ZPAU"; locFormMode: FormMode.View})
    • et lorsque tu cliques sur l’icône “+” : Navigate(DetailsTouret; ScreenTransition.Fade; {locSelectedTouret: ThisItem; locTypeCâble: "ZPAU"; locFormMode: FormMode.New})

    Et ensuite, sur l’écran DétailsTouret, tu mets la variable locFormMode sur la propriété DefaultMode du formulaire. Je préfère cette solution car je peux utiliser cette variable à différent endroit de mon écran pour différents besoins (autoriser des boutons, masquer des éléments, etc.).

    Dans le 2è cas, tu modifies l’état du formulaire AVANT de naviguer :

    • sur le bouton Crayon tu mets : EditForm(FormTouretZPAU);; Navigate(DetailsTouret; ScreenTransition.Fade; {locSelectedTouret: ThisItem; locTypeCâble: "ZPAU"})
    • sur le bouton Flèche tu mets : ViewForm(FormTouretZPAU);; Navigate(DetailsTouret; ScreenTransition.Fade; {locSelectedTouret: ThisItem; locTypeCâble: "ZPAU"})
    • sur le bouton “+” tu mets : NewForm(FormTouretZPAU);; Navigate(DetailsTouret; ScreenTransition.Fade; {locSelectedTouret: ThisItem; locTypeCâble: "ZPAU"})

    En fait, ces fonctions positionnent le statut du formulaire quelle que soit la valeur de la propriété DefaultMode (il n’en tient pas compte).

Connectez-vous pour répondre.