[Bug] Déclaration de variables locales de type 'record'

Étiquetté : , ,

  • [Bug] Déclaration de variables locales de type 'record'

    Posté par Sebastien sur 14 mars 2023 à 11h29

    Bonjour à tous.

    Récemment, je mets en place des systèmes de validation de données autour de mes Patch() avec des variables locales et des Regex et je suis tombé sur un cas un peu bizarre, donc je voulais savoir ce que vous en pensiez.

    Avant d’accéder au formulaire custom que j’ai mis en place, on déclare :

    UpdateContext(n{nlocValidContact: {n                Nom: If(!IsBlank(ThisItem.lastname) && IsMatch(ThisItem.lastname; "^\p{L}{1,50}(?:-\p{L}+)?\s*$"); true; false);n                Prenom: If(!IsBlank(ThisItem.firstname) && IsMatch(ThisItem.firstname; "^\p{L}{1,50}(?:-\p{L}+)?\s*$"); true; false);n                Tel: If(!IsBlank(ThisItem.mobilephone) && IsMatch(ThisItem.mobilephone; "^0\d{9}$") && Len(Value(ThisItem.mobilephone) <= 10); true; false);n                Mail:If(!IsBlank(ThisItem.'Courrier électronique') && IsMatch(ThisItem.'Courrier électronique'; "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"); true; false)n}n})

    En résumé, on déclare une variable locValidContact contenant locValidContact.Nom, locValidContact.Prenom…. dont la valeur est ‘true’ si l’information conforme à la Regex et ‘false’ si non.

    Pour finaliser le système, on ajoute dans le OnChange() des entrées de texte une formule de ce type :

    If(IsMatch(Self.Text;"^\p{L}{1,50}(?:-\p{L}+)?\s*$");nUpdateContext({locValidPrenom: Patch(locValidContact; {Prenom: true})});nUpdateContext({locValidPrenom: Patch(locValidContact; {Prenom: false})})n)

    Cette formule nous permet d’éditer une ligne de notre variable locValidContact sans toucher / effacer les autres.

    Jusque-là, tout semble fonctionner en mode édition et preview, mais dès que je lance réellement l’app, le bouton dans lequel je déclare ma variable locValidContact ne fonctionne plus, comme s’il avait une erreur qui n’apparaît pas en mode édition.

    Est ce que quelqu’un sait d’où vient ce comportement ?

    Merci d’avance !

    PostID=IcFS4j8K7dnDNDT

    Sebastien a répondu Il y a 7 mois, 3 semaines 1 Membre · 2 Réponses
  • 2 Réponses
  • R3dKap

    Membre
    14 mars 2023 à 14h41

    Sebastien Brandeis mon avis…

    Je mettrais un p’tit toggle togIsError caché dans le datacard où il y a besoin d’un contrôle de validité des données.

    Sur le Default de ce toggle je mettrais : !IsBlank(DataCardValueXXX) && !IsMatch(...). Si le toggle bascule à True c’est que la saisie est invalide. Je me sers alors du toggle pour :

    • afficher un message d’erreur adéquat dans le ErrorMessage.Text : If(togIsError.Value; "Saisie invalide"; Parent.Error)

    • changer la couleur de bordure du champ si erreur, DataCardValueXXX.BorderColor : If(IsBlank(Parent.Error) && !togIsError.Value; Parent.BorderColor; Color.Red)

    Et je ferais ça sur chaque datacard où il y a besoin d’avoir une validation des données. Ca évite de devoir jouer avec des variables et des Patch()… Et pour le côté obligatoire des champs, j’utiliserai le Required natif sur le datacard.

    Pour finir, je conditionnerais l’activation du bouton Sauvegarder avec : Form1.Valid && !togIsError1 && !togIsError2 && ...

    Tu vois ce que je veux dire ?

    Et probablement que ça règlerait ton pb entre la version Studio et la version publiée de ton app.

    CommentID=VjqTR6RvOeCtYJM, PostID=IcFS4j8K7dnDNDT

    • Sebastien

      Membre
      14 mars 2023 à 15h04

      Merci R3dKap !

      Je vois tout à fait, et je pense que ça fonctionnerait parfaitement. En réalité, j’ai déjà une alternative fonctionnelle, mais je n’ai pas vraiment envie d’admettre le fait que, sans raison ni message d’erreur, canvas en version publiée n’accepte juste pas les variables de type ‘Objet’ dans une fonction UpdateContext() alors que la doc dit que c’est possible.

      SubCommentID=jE5EeKQUcgPY8C1, CommentID=VjqTR6RvOeCtYJM, PostID=IcFS4j8K7dnDNDT

Connectez-vous pour répondre.