Contrôle de champs "texte" pour plaque d'immatriculation

Étiquetté : 

  • Contrôle de champs "texte" pour plaque d'immatriculation

    Posté par jean sur 29 septembre 2023 à 9h04

    Bonjour,

    Je cherche à m’assurer qu’un champ de saisie “texte” soit écrit selon le format attendu “XX-111-XX”

    L’objectif et de ne pas déranger la personne qui saisi le texte avec des messages d’erreur, mais de seulement s’assurer que le champ texte respecte l’attendue et si ce n’est pas le cas, appliquer la correction au bon format automatiquement. Est-ce possible ?

    PostID=erpIzqrXOw59kfW

    jean a répondu Il y a 9 mois, 3 semaines 1 Membre · 16 Réponses
  • 16 Réponses
  • Geoffroy

    Membre
    29 septembre 2023 à 13h08

    Bonjour Jean

    Je pense que le plus simple serait de découper le champ de saisie en 3 parties pour pouvoir vérifier si c’est du texte ou des chiffres. Ensuite, tu concatènes les 3 champs avec les traits d’union pour faire le résultat final.

    CommentID=do6ldy1BR2aiwow, PostID=erpIzqrXOw59kfW

    • jean

      Membre
      29 septembre 2023 à 13h41

      J’y ai pensé, mais ça risque d’alourdir l’interface pour rien, c’est mon plan B au cas où.

      SubCommentID=napH2d5eKIsVhlx, CommentID=do6ldy1BR2aiwow, PostID=erpIzqrXOw59kfW

  • Geoffroy

    Membre
    29 septembre 2023 à 13h20

    Une autre option serait d’imposer une saisie sous la forme ab123cd et de faire le formatage après (mise en majuscule et traits d’union). Ca suppose de limiter le nombre de caractères à 7 dans le TextInput.

    Si tu n’es pas sûr que l’utilisateur va respecter ce format (2 lettres, 3 chiffres, 2 lettres), il faudra vérifier pour chaque caractère s’il répond au masque demandé et par exemple mettre le fond du TextInput en rouge si ce n’est pas bon.

    CommentID=Mhd8KDY1ArSpayt, PostID=erpIzqrXOw59kfW

    • jean

      Membre
      29 septembre 2023 à 13h44

      Cette idée correspond plus à ce que je souhaite faire, j’ai une expression régulière toute prête :

      , mais je ne sais pas comment l’utiliser pour en sortir tous les cas d’utilisation lors d’erreur de saisie.

      SubCommentID=DPAlwVOrsQArlVJ, CommentID=Mhd8KDY1ArSpayt, PostID=erpIzqrXOw59kfW

    • Geoffroy

      Membre
      29 septembre 2023 à 14h39

      J’ai testé une solution avec des formules nommées (mon TextInput s’appelle plaque)

      nfPlaque1=With({inputString:Mid(plaque.Text;1;1)};LookUp(ForAll(Sequence(255);{Num:Value;Character:Char(Value)});Character=inputString).Num);;nnfPlaque2=With({inputString:Mid(plaque.Text;2;1)};LookUp(ForAll(Sequence(255);{Num:Value;Character:Char(Value)});Character=inputString).Num);;

      Idem pour nfPlaque3 jusqu’à nfPlaque7

      Ensuite, dans le Fill du TextInput, je mets ça

      If(((nfPlaque1>=97&&nfPlaque1<=122)||(nfPlaque1>=65&&nfPlaque1<=90))&&((nfPlaque2>=97&&nfPlaque2<=122)||(nfPlaque2>=65&&nfPlaque2<=90))&&((nfPlaque3>=48&&nfPlaque3<=57))&&((nfPlaque4>=48&&nfPlaque4<=57))&&((nfPlaque5>=48&&nfPlaque5<=57))&&((nfPlaque6>=97&&nfPlaque6<=122)||(nfPlaque6>=65&&nfPlaque6<=90))&&((nfPlaque7>=97&&nfPlaque7<=122)||(nfPlaque7>=65&&nfPlaque7<=90))&&Len(plaque.Text)=7;RGBA(0;0;0;0);Color.Red)

      SubCommentID=Cjh269503hSZSmC, CommentID=Mhd8KDY1ArSpayt, PostID=erpIzqrXOw59kfW

    • jean

      Membre
      29 septembre 2023 à 15h35

      Je vais tester pour voir ce que ça donne, ça a le mérite d’être moins bricolé

      SubCommentID=e65LFvyiEJRAQz7, CommentID=Mhd8KDY1ArSpayt, PostID=erpIzqrXOw59kfW

    • Geoffroy

      Membre
      29 septembre 2023 à 15h37

      En fait, on peut simplifier le Fill en passant d’abord tout en majuscules dans les formules nommées

      nfPlaque1=With({inputString:Upper(Mid(plaque.Text;1;1))};LookUp(ForAll(Sequence(255);{Num:Value;Character:Char(Value)});Character=inputString).Num);;

      If(nfPlaque1>=65&&nfPlaque1<=90&&nfPlaque2>=65&&nfPlaque2<=90&&nfPlaque3>=48&&nfPlaque3<=57&&nfPlaque4>=48&&nfPlaque4<=57&&nfPlaque5>=48&&nfPlaque5<=57&&nfPlaque6>=65&&nfPlaque6<=90&&nfPlaque7>=65&&nfPlaque7<=90&&Len(plaque.Text)=7;RGBA(0;0;0;0);Color.Red)

      SubCommentID=QQres3USsd46oFC, CommentID=Mhd8KDY1ArSpayt, PostID=erpIzqrXOw59kfW

  • Geoffroy

    Membre
    29 septembre 2023 à 13h47

    “Deux choses sont infinies : l’Univers et le nombre de façons de remplir un champ texte. Mais, en ce qui concerne l’Univers, je n’en ai pas encore acquis la certitude absolue.”

    Albert E.

    CommentID=h483eKSMhQKHTUt, PostID=erpIzqrXOw59kfW

    • jean

      Membre
      29 septembre 2023 à 13h51

      😂 On est d’accord, sur le “tous les cas d’erreur”…

      SubCommentID=IMgXoqLNhdBTczj, CommentID=h483eKSMhQKHTUt, PostID=erpIzqrXOw59kfW

    • jean

      Membre
      29 septembre 2023 à 15h32

      J’ai fini par faire 3 champs qui sont concaténés et mis en majuscule dans un autre champ “masqué” le tout sera poussé dans la liste SharePoint prévu à cet effet.

      SubCommentID=Li1D6J7s1z10aCf, CommentID=h483eKSMhQKHTUt, PostID=erpIzqrXOw59kfW

  • DavidZed

    Membre
    29 septembre 2023 à 21h15

    Hello Jean ,

    Dans ce cas de figure, on peut utiliser les fonctions :

    • IsMatch() : Pour s’assurer qu’une chaîne respecte un certain format

    • Upper() : pour transformer les minuscules en majuscules

    • Right() et Left() : Pour extraire des caractères d’une chaîne

    • Substitute() : Pour remplacer des caractères dans une chaîne

    Tu peux ajouter un label texte pour indiquer si la saisie est correcte (attention syntaxe en anglais) :

    If(IsMatch(n    With({ // On nomme des constantes pour simplifier le la formule qui suitn        Immat:TextInputSaisie.Text,n        Sep1:Left(TextInputSaisie.Text,3),n        Sep2:Right(TextInputSaisie.Text,3)},nn        Upper( // on transofrme les minuscules en majusculesn            Substitute( n                Substitute( n                    Immat,Sep1,Left(Sep1,2)&"-"),// On remplace les 3 premiers caractères par les 2 premiers suivi de "-" = on remplace le 3eme caractère par un tiretn                    Sep2,"-"&Right(Sep2,2) // On remplace les 3 derniers caractères par un "-", suivi par les 2 derniers = on remplace le 7eme caractère par un tiretn                    ))),n    Match.Letter&Match.Letter&Match.Hyphen&Match.Digit&Match.Digit&Match.Digit&Match.Hyphen&Match.Letter&Match.Letter), // On verifie que le tout correspond au format : 2 lettres, tiret, 3 chiffres, tiret, deux lettresn    "Format OK" ,// Si ouin    "Merci de respecter le format ''AA-000-AA''" ) //Sinon

    ce qui devrait donner :

    Tu peux ensuite utiliser le IsMatch et son contenu pour conditionner l’update du datacard

    CommentID=5M4aIydMuSvUrQX, PostID=erpIzqrXOw59kfW

  • ypicot

    Membre
    30 septembre 2023 à 21h39

    Bonjour

    Une autre écriture, plus concise, peut utiliser les expressions régulières (regex pour regular expression).

    If(    n    IsMatch(n        Upper(TextInputSaisie.Text); n        "[A-Z]{2}[ -]?[0-9]{3}[ -]?[A-Z]{2}"n    );n    "Format ok";n    "Merci de respecter le format"n)

    Cette version permet à l’utilisateur de saisir “AB-123-CD”, mais aussi “AB 123 CD” ou “AB123CD”.

    Elle se lit de la manière suivante : un groupe de deux lettres, éventuellement un espace ou un tiret, un groupe de trois chiffres, éventuellement un espace ou un tiret, un groupe de deux lettres.

    Il existe d’autres écritures pour décrire la regex, mais celle-ci a l’avantage d’être relativement concise tout en étant assez compréhensible.

    Après se pose le problème de la sauvegarde au bon format (avec les tirets).

    On peut imaginer dans le bouton Submit du formulaire la formule suivante :

    UpdateContext({n    locImmat:    n    MatchAll(n        Upper(TextInputSaisie.Text);n        "(?<debut>[A-Z]{2})[ -]?(?<milieu>[0-9]{3})[ -]?(?<fin>[A-Z]{2})"n    )n})

    Ici, on utilise un motif identique au précédent, dans lequel on a rajouté les sous-correspondances nommées (parfois appelées “groupes de capture nommés” car elle permettent de capturer un bout du motif), définies par les parenthèses et leur nom entre chevrons. Ces sous correspondances vont être réutilisées dans la propriété Default du contrôle-qui-va-bien (cela peut être TextInputSaisie) :

    First(locImmat).debut & "-" & First(locImmat).milieu & "-" & First(locImmat).fin

    CommentID=IBrEsTk6G2ibufk, PostID=erpIzqrXOw59kfW

    • DavidZed

      Membre
      1 octobre 2023 à 9h58

      Super ypicot !

      J’ai toujours évité les regex autant que je le pouvais à case de cette syntaxe qui tient presque de l’incantation vaudou (et la doc MS learn est assez succincte sur ce volet). Merci car pour le coup, ta réponse démystifie plutôt bien le principe !

      ça vaudrait presque un article dans la base de connaissances 🙂

      SubCommentID=SzaZqjmzcX09H8w, CommentID=IBrEsTk6G2ibufk, PostID=erpIzqrXOw59kfW

    • ypicot

      Membre
      1 octobre 2023 à 20h32

      Ben si cela peut aider certains… 😉

      SubCommentID=7EvudlYKa2HcV7w, CommentID=IBrEsTk6G2ibufk, PostID=erpIzqrXOw59kfW

  • jean

    Membre
    2 octobre 2023 à 7h02

    Merci à tous pour ces solutions, cela reflète bien la multitude de chemins possible pour arriver à ses fins, j’espère que ça servira à d’autre personne.

    CommentID=xRmpafZ9QyVzU2g, PostID=erpIzqrXOw59kfW

  • jean

    Membre
    6 octobre 2023 à 9h43

    Bonjour,

    Voilà comment j’ai fini par faire :

    Mes champs sont inclus dans un “form” et la partie plaque d’immatriculation dans une “DataCard”.

    Le champ de saisie de la plaque est nommé “DataCardValue19” est limité à 9 caractères maximum avec le paramètre obligatoire “require=true”, dans l’étiquette de texte “ErrorMessage” de la DataCard, j’ai mis le code suivant :

     If(IsMatch((DataCardValue19.Text);"[A-Z]{2}[-]{1}?[0-9]{3}[-]{1}?[A-Z]{2}");"Syntaxe OK"; "Respecter la syntaxe AA-111-AA")n

    Merci à tous pour vos idées !👍

    CommentID=7o0xUJntWlKAu86, PostID=erpIzqrXOw59kfW

Connectez-vous pour répondre.