Macro et balise <method>

J’y perds mon latin.

Je m’essaye à créer un fichier macro mais j’ai systématiquement une erreur (UTF-8, sans BOM) :

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>

<!DOCTYPE macros SYSTEM "http://www.4d.com/dtd/2007/macros.dtd" >

<macros>

  <macro name="maMacro">
    <method>MaSuperMethodALancer
    </method>
  </macro>

</macros>

le message d’erreur :

Erreur de parsing XML dans xxxxxx/Macros v2/Macros.xml(15:11): element ‘method’ is not allowed for content model ‘(text)?’
Error code: 2 (xmlc)
Erreur de parsing XML dans /Users/sieste68/SynologyDrive/QS_ToolBox v18/QS_Toolbox.4dbase/Macros v2/Macros.xml(15:11): element ‘method’ is not allowed for content model ‘(text)?’
component: ‘xmlc’
task -14, name: ‘Process développement’

Une idée ?

Et avec la balise Method à l’intérieur d’une balise Text, çe donne quoi ?

<text><method>MaSuperMethodeALancer</method></text>

Error code: 2 (xmlc)
Erreur de parsing XML dans xxxxx/Macros v2/Macros.xml(15:11): element ‘method’ is not allowed for content model ‘(text)?’
component: ‘xmlc’
task -12, name: ‘Process développement’

TaSuperMethodeALancer :wink: finit bien par :

SET MACRO PARAMETER(Full method text;s_Text)

?

Ah, et version 2 probablement :

  <macro name="Entete"  version="2">
    <text><method>Macro_Entete("<method_name/>")</method></text>
  </macro>

https://doc.4d.com/4Dv18/4D/18/Creating-and-using-macros.300-4575525.en.html

C’est surtout que je souhaite lancer une méthode (qui lance un process) et qui n’a pas de paramètre. Du coup, SET MACRO PARAMETER ne me sert pas à grand chose, enfin, je crois.

C’est la manière de faire le $0

OK. J’essaye
Par contre, l’erreur, je l’ai au chargement de 4D et du coup la macro n’apparait ps.

Même punition : toujours l’erreur au démarrage de 4D :cold_sweat:

Mon exemple complet, qui fonctionne :

  <macro name="Entete"  version="2">
    <text><method>Macro_Entete("<method_name/>")</method></text>
  </macro>

Methode Macro_Entete :

C_TEXT(s_Text;$s_NomMethode)

$s_NomMethode:=$1

s_Text:="// ----------------------------------------------------"+Char(13)
s_Text:=s_Text+"// "+Current user(4D user account)+" - "+wNumeroVersionAppli +" - "+String(Current date)+" - WTS-"+Char(13)
s_Text:=s_Text+"// ----------------------------------------------------"+Char(13)
s_Text:=s_Text+"// Méthode : "+$s_NomMethode+Char(13)
s_Text:=s_Text+Char(13)
s_Text:=s_Text+"// Description"+Char(13)
s_Text:=s_Text+"//"+Char(13)
s_Text:=s_Text+Char(13)
s_Text:=s_Text+"// Paramètres"+Char(13)
s_Text:=s_Text+"//"+Char(13)
s_Text:=s_Text+"// ----------------------------------------------------"+Char(13)+Char(13)

SET MACRO PARAMETER(Full method text;s_Text)

OK. L’attendu dans ton cas est un text retourné.
dans mon cas c’est le lancement d’un process. Je vais essayer de tricher un peu

<macros>

  <macro name="QST_Main" version="2">
    <text><method>QST_macro_MNU_Start</method></text>
  </macro>

</macros>

et

$text:=""
$newProcess:=New process("_MNU_Start";0;"QST_Menu";"__Menu_og";*)
SET MACRO PARAMETER(Full method text;$text)

toujours l’erreur au lancement de 4D. Je suis en mode projet et 18R3? Je ne sais pas si cela peut être lié

J’ai essayé la même ligne de macro (xml + 4Dcode) dans 4Dv18R3 build 253468. Un processus a toujours été démarré avec succès dans ma base de données sans message d’erreur. Même lors du démarrage de 4D / DB, il n’y a pas de message d’erreur lors de la lecture du fichier xml qui se trouve dans le dossier v2. Mon dossier “Macros v2” est à côté du dossier “Project” au même niveau de dossier.
Je peux également omettre la commande “SET MACRO PARAMETER” (elle est également sans erreur) il vaut mieux ne rien retourner que de démarrer un nouveau processus et donc éventuellement plus la fenêtre de l’éditeur de méthode à partir de laquelle la macro a été appelée, mais une fenêtre qui est la première a ouvert le processus nouvellement démarré.
Je suppose qu’un coin différent plutôt que la cause du problème,
si une erreur d’analyse XML se produit au démarrage de 4D.
Il se peut que les macros aient été stockées à différents endroits et vous devriez également regarder à nouveau le chemin du message d’erreur afin de ne pas apporter accidentellement vos corrections dans le mauvais macro.xml inactif.

Bien sûr, la syntaxe suivante nécessite sans erreur selon le schéma
pour pouvoir être lu en:

<macro name="testMethod" version="2">
<text><method>macroTestMethod</method></text>
</macro>

Si j’omets le comme dans le premier post,
alors bien sûr, cela produit exactement le même message d’erreur pour moi:

<macro name="testMethod" version="2">
<method>macroTestMethod</method>
</macro>

Un “SET MACRO PARAMETER” n’est pas nécessaire,
vous ne l’utilisez que si vous voulez donner quelque chose en retour.

Merci à vous Thierry & Lutz :clap:

without changing anything inside the XML file after adding the tag, I removed the ‘Macros v2’ folder and recreate it. Start 4D again and it works.
No idea why it didn’t work before. very strange.
Anyway, like Lutz wrote, non need to use GET or SET MACRO PARAMETER.

Patrick

3 Likes

Salut Patrick,
je ne sais pas si c’est ça, mais je vois que mes macros qui emploient la balise method sont toutes “emballées” dans la balise text :

	<macro name="OBversDot/Œ" version="2">
	<!-- raccourci /Π= alt+cmde+o -->
		<text><method>MACRO_OBversDot</method></text>
	</macro>

Oui j’ai fais cela dès que Thierry me l’a signalé. Ce qui était bien plus surprenant, c’est que cela n’a pas fonctionné jusqu’à je supprime le dossier pour le recréer, sans rien changer au fichier xml.

Mmmmm des histoires de cache ?

J’ai le souvenir d’un temps où toute modif d’un fichier macro se répercutait immédiatement. Depuis quelque temps je dois quitter/relancer.

Sais pas …

I think macro files (as well as XLIFF, maybe CSS too) that were successfully loaded at startup are constantly reloaded when the design process is activated, but once it aborts with a parser error, 4D will no longer refresh them in the same session, probably for fear of an alert deadlock.

We need to restart interpreted after we fix the syntax error.

4 Likes