Contrôle de champs "texte" pour plaque d'immatriculation
Étiquetté : powerapps
-
Contrôle de champs "texte" pour plaque d'immatriculation
Posté par jean sur 29 septembre 2023 à 9h04Bonjour,
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 11 mois, 3 semaines 1 Membre · 16 Réponses -
16 Réponses
-
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
-
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
-
-
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
-
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
-
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
-
Je vais tester pour voir ce que ça donne, ça a le mérite d’être moins bricolé
SubCommentID=e65LFvyiEJRAQz7, CommentID=Mhd8KDY1ArSpayt, PostID=erpIzqrXOw59kfW
-
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
-
-
“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
-
😂 On est d’accord, sur le “tous les cas d’erreur”…
SubCommentID=IMgXoqLNhdBTczj, CommentID=h483eKSMhQKHTUt, PostID=erpIzqrXOw59kfW
-
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
-
-
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
-
-
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
-
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
-
Ben si cela peut aider certains… 😉
SubCommentID=7EvudlYKa2HcV7w, CommentID=IBrEsTk6G2ibufk, PostID=erpIzqrXOw59kfW
-
-
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
-
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.