WP : remplacer formatage virgule par point

Bonjour,

Je ne dois pas être le seul, mais dans des zones Write passées en WP, les formatages de type ###,## ne fonctionnent pas, il faut remplacer la virgule par un point pour avoir ###.##
J’ai une base avec tellement de modèles WP qu’il n’est pas envisageable de le faire manuellement.

Et c’est là que ça coince car j’ai l’impression que :

  • le remplacement dans une zone objet WP d’un morceau d’une expression 4D ne semble pas possible
  • la suppression d’une expression 4D dans une zone objet WP n’est pas possible, on peut lire ou insérer.

Bref, je ne vois que des choses très complexes en passant par la transformation en texte, mettre des signes uniques autour des expressions 4D, changer dans le texte l’expression 4D puis reconstruire la zone objet en détectant et réinsérant les nouvelles expressions 4D pour y arriver…

N’est-ce possible qu’en repartant de la v16 et des modèles Write avant de passer en WP ?

Y-a-t-il une astuce en V17 en manipulant la zone objet WP ?

Merci d’avance,

Bonjour Michel

Est-ce que vous pourriez nous envoyer (en réponse ici) un exemple precis (sous form d’un doc .4wp par exemple) contenant une expression que vous souhaiteriez remplacer par une autre ? ou reformater ?
Ou une base exemple, la plus minimaliste possible ?

Soit on trouve une solution immédiate, soit on trouvera une solution, car les problèmes de compatibilité avec les document (donc aussi les templates) 4D Write sont une “priorité prioritaire”…

Merci.

Roland

: Roland LANNUZEL

Soit on trouve une solution immédiate, soit on trouvera une solution,
car les problèmes de compatibilité avec les document (donc aussi les
templates) 4D Write sont une “priorité prioritaire”…

Ah bon :?: je suis surpris d’entendre ça; ayant refait un simple test récent (avec la 17R5) sur un doc Write je suis tombé rapidement sur un bug de conversion sur une formule basique (bug ouvert sous TAOW 141537 : Conversion zone 4D Write en 4D Write Pro [ACI0098318])
J’ai pas poussé plus loin mais bon le bug n’est pas corrigé et c’est pourtant une formule plus que basique pour afficher une année sur un contrat… :-?

(re)bonjour

Bon, j’ai compris et j’ai une solution…(qui pourra etre améliorée par le langage par la suite, mais qui fonctionne…et que vous pourrez adapter facilement selon vos besoins).

J’ai un texte truffé d’expressions du genre String(Pi;"### ##0,00") qui devrait être sous forme String(Pi;"###,##0.00") pour etre affiché correctement.

Ce qui est affiché c’est donc “0 03” au lieu de “3,14” puisque ce ne sont pas les “bons” séparateur de milliers et décimales.

Le but est donc de parcourir le texte et de remplacer ces expressions en le reformatant…
en gros : remplacer “# #” par “#,#” et “0,0” par “0.0” (la virgule et le point seront in fine remplacés au moment du formatage par les séparateurs définis pas le système dans les paramètres de localisation)

Voilà le code qui fait ça.

<code 4D>
// text where expressions are replaced by single spaces
$text1:=WP Get text([DOCS]wp;wk expressions as space)
// text where expressions are kept as source
$text2:=WP Get text([DOCS]wp;wk expressions as source)

$n:=Length($text1)
$j:=0
For ($i;1;$n)
$j:=$j+1

If ($text1[$i]#$text2[$j])  // mismatch ? hum…
	$expression:=ST Get expression([DOCS]wp;$i;$i)  // is that an expression ?
	If ($expression#"")
		  // yes it is !
		$l:=Length($expression)
		
		$expression:=Replace string($expression;"0,0";"0.0")  // reformat expression (decimal separator first)
		$expression:=Replace string($expression;"# #";"#,#")  // reformat expression (thousand separator second)
		
		ST INSERT EXPRESSION([DOCS]wp;$expression;$i;$i+1)  // replace expression in source text
		
		$j:=$j+$l-1  // add length of original SOURCE expression before going on looping
		
	End if 
End if 

End for
// done !

</code 4D>

Avant / Apres…

[]29822934;“Your comment here…”[/]

Et voila :slight_smile:

Roland Lannuzel

Bonjour…

(je ne suis pas forcément au courant de tous les cas taow… je ne suis pas à la qualité !)

J’ai répondu en donnant une solution (pour un formatage de nombre), je vois mal comment on pourrait faire autrement que comme cela.

je me souviens par contre d’une demande (légitime) de pouvoir récupérer dans une collection les élément du type “expression” afin d’éviter ce genre de boucle, mais en attendant, c’est une solution qui fonctionne.

Roland Lannuzel

Question (stupide ?): pourquoi cela ne fait-il pas partie de la conversion de doc 4D Write vers 4D Write Pro ? (si l’option d’utiliser le format système est cochée pour les anciennes bases (obligatoire sur les nouvelles) le format “### ##0,00” ne correspond à plus rien…)

Pour mon bug, si vous le relisez c’est également un problème de conversion qui rajoute un mauvais format:

Dans 4D Write:
“Annee de([Table]ChampDate):Systeme date court”

est traduit dans 4D Write Pro par:
Chaine(Annee de([Table]ChampDate);1) :?: :!:

A l’affichage on obtient : erreur N°8 :cry:

Je comprends.

Le pb qui est le suivant :

L’expression “Annee de([Table]ChampDate):Systeme date court” qui etait supportée par “4D Write” n’est pas supportée par “4D Write pro” car ce n’est pas une expression 4D valide !

Une expression 4D Valide serait (je prétends pas vous l’apprendre…)

Chaine(Annee de([Table]ChampDate;Systeme date court)"


Donc, selon l’endroit ou le formatage est placé (façon “4D Write” ou façon “4D”, le problème est soluble ou non…y compris pour les numérique (voir mon exemple plus haut).

À voir si un remplacement systématique de expression:format par string(expression;format) au moment de l’import fonctionnerait…

Je vais faire ‘ré-ouvrir’ le dossier, c’est promis.

Roland

Bonjour,

Je rentre et découvre vos messages.

Je pense que la solution de Roland est bonne (je testerai et vous confirmerai) j’étais dans cet esprit mais pas avec la fonction la plus adaptée.

Est-ce qu’on peut remplacer ###,## par |MonFormat_Numerique ?

Pour l’ambiance générale, je comprends et partage parfois l’énervement de Manuel PIQUET qui se demande pourquoi ce n’est pas fourni au départ.

Je pense qu’une solution constructive à laquelle chacun de nous pourrait participer serait d’avoir un endroit proche des téléchargements habituels quand on s’est identifié où 4D mettrait à disposition des méthodes génériques créées par 4D ou par d’autres développeurs et validées par 4D.

Ce n’est pas choquant qu’il reste pas mal de choses à corriger car la dead line est liée à Apple et pas à 4D qui a beaucoup de chantiers simultanés, mais laisser chacun recréer difficilement dans son coin ce qu’on pourrait partager facilement est plus discutable…

Prêt à faire remonter cette proposition vers les monts de l’Olympe 4D Roland ?

Merci encore de la réactivité ! je vous tiens au courant

Merci, même si j’ai pas trop suivi votre explication ? on parle de conversion de doc 4D Write vers 4D Write Pro donc oui les expressions qui se trouvent dans le doc 4D Write sont bien au format 4D Write (et pas 4D) je vous le confirme. Mais c’est bien la moindre des choses que la conversion fasse le nécessaire pour convertir au mieux (càd. en respectant les formats) ces expressions… :roll:

Bonjour,

Je n’ai pas réussi à faire fonctionner le code, mais il faudrait que d’autres le testent pour savoir si ce n’est pas un problème local à ma base au moment de l’enregistrement (bien que je sois en lecture écriiture)

L’appel est du genre
<code 4D>
CHERCHER([MaTable];Macondition)
Si(Enregistrements Trouvés ([MaTable])=1)
GG_WP_Expression_Remplace(->ChampWP_Objet;A_Chercher;A_Remplacer)
fin de si

</code 4D>

J’ai testé en essayant de remplacer “#,#” par “#.#” ($2 et $3)

Voici la version générisée du code de Roland en .C4D puisqu’il semble que beaucoup codent en anglais, ça permettra de ne pas avoir à changer la langue comme avec du code texte dans une autre langue que celle de votre 4D.

https://forums.4d.com/4DBB_Main/x_User/288560/files/29831600.zipMéthode générique d’après code Roland Lanuzel>

PS : ce qui est dans le Si(Faux) en fin de méthode en ligne 65-> 71 n’a aucun intérêt et peut être supprimé , c’est un reste de mes tests précédents

RePS : j’ai également testé en conservant le code original de Roland comme ci-dessous et ça n’a pas fonctionné chez moi.

<code 4D>
// GG_WP_Expression_Remplace2
// Effectuer des remplacements dans les expressions 4D d’une zone WP
// MTR CREATION 2019-05-17
// d’après forum 4D Roland Lanuzel https://forums.4d.com/Post/FR/29819796/1/29822625#29822625

LIBÉRER ENREGISTREMENT([MODEL])
LECTURE ÉCRITURE([MODEL])
CHERCHER([MODEL];[MODEL]Titre=“Allaitement”)

$A_chercher:="#,#"
$A_Remplacer:="#.#"

Si (Enregistrements trouvés([MODEL])=1)
//text where expressions are replaced by single spaces
$text1:=WP Lire texte([MODEL]WP_Objet;wk expressions as space)
//text where expressions are kept as source
$text2:=WP Lire texte([MODEL]WP_Objet;wk expressions as source)

$n:=Longueur($text1)
$j:=0
Boucle ($i;1;$n)
	$j:=$j+1
	
	Si ($text1[$i]#$text2[$j])  //mismatch? hum
		$expression:=ST Lire expression([MODEL]WP_Objet;$i;$i)  //is that an expression?
		Si ($expression#"")
			
			$l:=Longueur($expression)
			
			$A_Rempalcer_Existe:=position(
			$expression:=Remplacer chaîne($expression;"#,#";"#.#")  //reformat expression(thousand separator second)
			
			ST INSÉRER EXPRESSION([MODEL]WP_Objet;$expression;$i;$i+1)  //replace expression in source text
			
			$j:=$j+$l-1  //add length of original SOURCE expression before going on looping
			
		Fin de si 
	Fin de si 
Fin de boucle 

STOCKER ENREGISTREMENT([MODEL])

Fin de si

</code 4D>

Bonjour,

Est-ce que quelqu’un a pu tester ?

Bonjour,

Quelqu’un a-t-il résolu cela ?

Bonjour,

Dans 4D Write:
“Annee de([Table]ChampDate):Systeme date court”

est traduit dans 4D Write Pro par:
Chaine(Annee de([Table]ChampDate);1)

la conversion reste correcte car Systeme date court = 1
Le pb est que Annee de([Table]ChampDate) retourne un nombre or un nombre ne peut pas être formaté avec Systeme date court.

l’expression correcte dans 4D Write serait plutôt:

[Table]ChampDate:Systeme date court

ce qui donnerait bien alors dans 4D Write pro:

Chaine([Table]ChampDate;1)

Pour le pb de conversion des expressions avec décimal/millier il faudrait pouvoir indiquer à la commande WP New ou WP Import document la convention qui est utilisée dans les expressions du document 4W7 à importer, cette information n’étant pas sauvegardée dans le document 4W7: actuellement comme 4D Write pro ne connait pas le format d’origine pour les décimales/milliers il ne fait donc pas de conversion.

Cordialement,

Jacques.

Bonjour,

A priori, j’ai trouvé la solution.
La méthode que j’avais créée grâce aux diverses indications sur ce post fonctionnait (Merci Roland notamment !), mais bizarrement, le champ objet passé en pointeur $1 qui contenait bien les expressions modifiées ne s’enregistrait pas.
Je ne sais pas si c’est un bug 4D, mais en tous cas, en faisant une copie du champ objet dans un objet local et en redonnant au champ objet en pointeur la valeur de cet objet local juste avant de stocker, CA FONCTIONNE !

on peut donc remplacer dans write pro V17 les "#,# par “#.#” avec la méthode ci-dessous et avoir à nouveau un bon affichage des nombres, ouf…

https://drive.google.com/open?id=16kEHX-pSNi-oO_InteqVmkdObAoxnW1DMéthode de remplacement de formatage dans un champ objet Write Pro>

je pense d’ailleurs que le plus pratique est de remplacer par exemple des “###,##” par des “|MonFormatNumAvecPoint”.

Ainsi, on aura seulement ce format à maintenir , et si selon les systèmes/langue certains utilisateurs ont une interprétation différente de la virgule dans WP, on pourra par programmation les orienter facilement vers le format adapté…

: Jacques QUIDU

Dans 4D Write:
“Annee de([Table]ChampDate):Systeme date court”

est traduit dans 4D Write Pro par:
Chaine(Annee de([Table]ChampDate);1)

la conversion reste correcte car Systeme date court = 1
Le pb est que Annee de([Table]ChampDate) retourne un nombre or un
nombre ne peut pas être formaté avec Systeme date court.

l’expression correcte dans 4D Write serait plutôt:

[Table]ChampDate:Systeme date court

ce qui donnerait bien alors dans 4D Write pro:

Chaine([Table]ChampDate;1)

Je suis d’accord, mais le problème est que 4D Write dans ce cas de figure ne faisait rien et affichait simplement la chaine sans formatage. Alors que 4D Write Pro affiche une erreur 8.

Pour respecter au maximum la compatibilité des anciens documents 4D Write:

  • soit on teste la pertinence du format et si celui-ci ne sert à rien (ou est faux) il est retiré au moment de la conversion.
  • soit 4D Write Pro adopte le même comportement que 4D Write et ne retourne pas d’erreur mais ne fait qu’afficher la chaine sans la formater.