Exécution d'un script après avoir apporté une modification. Ne fonctionne pas sans fermer et rouvrir le script - pourquoi ?J'apprends JSL et j'obtiens un comportement que je ne pense pas avoir eu quand j'ai commencé. J'aimerais savoir si ce comportement est attendu ou s'il se produit en raison d'un changement de paramètre que j'ai peut-être fait par inadvertance.
J'ai un simple script "principal" qui appelle une fonction et un autre script. Lorsque j'ouvre JMP et que j'exécute à nouveau le script principal ou les autres fonctions/scripts qu'il appelle, ils fonctionnent tous correctement et produisent les résultats attendus. Cependant, ils ne fonctionnent pas lorsque j'apporte une modification à l'un d'entre eux (par exemple, si je commente le script qui est inclus dans le script principal, par exemple la dernière ligne ci-dessous). Si je ferme tous les scripts ouverts, puis les relance, ils fonctionnent à nouveau. Venant d'autres langages de programmation, je ne m'attends pas à un tel comportement. Toute direction est très appréciée
Exemples de mon script principal ci-dessous (je suis sur JMP13).
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");Commentant la dernière ligne ci-dessus (ou si je décommente clear log ()) c'est-à-dire
//clear log ();
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
//include ("generateJournal.jsl");me donne l'erreur suivante dans le script ci-dessus
Name Unresolved: getDataTable4partID in access or evaluation of 'getDataTable4partID' , getDataTable4partID( "partID", "partIDname" ) /*###*/
Fermer tous les scripts et fonctions ouverts (et parfois JMP) et les renvoyer à nouveau semble tout faire fonctionner à nouveau. Pas sûr de ce qui se passe....
Toute direction est très appréciée.
Automatisation et scriptRe : Exécuter un script après avoir effectué une modification. Ne fonctionne pas sans fermer et rouvrir le script - pourquoi ?Oui, la fonction getDataTable4partID doit être analysée par JSL avant que vous puissiez l'appeler.L'instruction include lit la fonction et la charge en mémoire.Une fois qu'il est en mémoire, il peut être appelé.
Re : Exécuter un script après avoir effectué une modification. Ne fonctionne pas sans fermer et rouvrir le script - pourquoi ?Veuillez m'excuser pour mon ignorance, mais est-ce votre explication de la raison pour laquelle je dois utiliser
include ("getDataTable4partID.jsl");pour que mon appel de fonction fonctionne ?
Re : Exécuter un script après avoir effectué une modification. Ne fonctionne pas sans fermer et rouvrir le script - pourquoi ?La fonction doit être analysée avant de pouvoir être appelée.L'interpréteur JSL descend dans le code une ligne à la fois.S'il n'a pas parcouru le code de la fonction avant que vous n'essayiez d'appeler cette fonction, JSL s'arrêtera.Il en va de même pour toutes les variables, etc. dans JSL. Ainsi:
Names Default to Here( 1 );
Clear Symbols();
print( a );
a = 42;
échouera avec
Name Unresolved: a in access or evaluation of 'a' , a/*###*/
at line 3 in Script 4.jsl
Alors que
Names Default to Here( 1 );
Clear Symbols();
a = 42;
print( a );
fonctionnera sans erreur
Re : Exécuter un script après avoir effectué une modification. Ne fonctionne pas sans fermer et rouvrir le script - pourquoi ?Ajouter
include ("getDataTable4partID.jsl");avant l'appel de la fonction ( getDataTable4partID.jsl étant le nom du script de fonction )
getDataTable = getDataTable4partID("partID","partIDname"); c'est à dire
Names Default to Here( 1 );
Clear Symbols();
include (''getDataTable4partID.jsl");
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");semble avoir résolu tous les problèmes. Quelle est la raison?
Re : Exécuter un script après avoir effectué une modification. Ne fonctionne pas sans fermer et rouvrir le script - pourquoi ?@txnelson
La fonction getDataTable4partID a été défini, enregistré et exécuté. Cela fonctionnait comme prévu auparavant.
Le script principal qui l'appelle ou l'autre script inclus dans le script principal ne fonctionne plus et ne fonctionne pas non plus.
Re : Exécuter un script après avoir effectué une modification. Ne fonctionne pas sans fermer et rouvrir le script - pourquoi ?Names Default to Here( 1 );
Clear Symbols();
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");
Je suppose que c'est votre première section de votre code. Correct?
Votre troisième ligne dans le code recherche une fonction appelée "getDataTable4partID".Cette fonction n'a pas été définie lorsque le code tente d'exécuter cette ligne.Vous devez exécuter la définition de la fonction avant de pouvoir l'appeler.
Re : Exécuter un script après avoir effectué une modification. Ne fonctionne pas sans fermer et rouvrir le script - pourquoi ?Merci @txnelson . OK, c'est ce que j'ai fait et maintenant mes scripts et fonctions ne fonctionnent pas même après la fermeture et la réexécution ou après le redémarrage de JMP.
Mon scénario principal
Names Default to Here( 1 );
Clear Symbols();
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");Ma fonction est (sans les détails de la base de données)
Names Default to Here (1)
getDataTable4PartID = Function({PartID}, {dtTemp},
dtTemp = Open Database("connectionstring",
"select '" || PartID || "' as value
from dual",
PartID
);
return(dtTemp);
);et mon scénario
plotallcharts.jsl;
a aussi sa ligne de poing comme
Names Default to Here (1)
Je reçois toujours l'erreur
Name Unresolved: getDataTable4partID in access or evaluation of 'getDataTable4partID' , getDataTable4partID( "partID", "partIDname" ) /*###*/
mais parfois le journal n'affiche rien lors de l'exécution du script principal.
Re : Exécuter un script après avoir effectué une modification. Ne fonctionne pas sans fermer et rouvrir le script - pourquoi ?Vous devriez commencer tout votre script avec :
Names Default to Here( 1 );
Clear Symbols();
Cela stabilisera l'environnement Namespace et effacera toutes les valeurs précédentes, vous recommençant ainsi chaque fois que vous exécutez le code à partir du haut.
Re : Exécuter un script après avoir effectué une modification. Ne fonctionne pas sans fermer et rouvrir le script - pourquoi ?Merci @txnelson .
Voici la fonction
getDataTable4partID
Suggérez-vous que j'utilise
clear symbols();
// clear globals();
en haut de mon script principal ?
Si oui, alors je l'ai fatigué sans aucun changement de comportement.
De plus, j'ai oublié de mentionner ci-dessus que lorsque le script principal ne s'exécute pas (après y avoir apporté une modification) et que je dois redémarrer JMP pour que le script s'exécute à nouveau comme prévu, je dois également exécuter la fonction que mon script principal appelle , une fois, sans quoi mon script principal ne s'exécute pas. C'est clairement un comportement indésirable et je crains de ne pas faire les choses correctement.
Re : Exécuter un script après avoir effectué une modification. Ne fonctionne pas sans fermer et rouvrir le script - pourquoi ?Dans votre exemple, je ne vois pas où vous définissez la fonction
getDataTable4partID
JSL est un langage interprété et nécessite la création de tous les éléments référencés dans le code, avant son appel.Ce n'est pas un langage compilé, qui passe d'abord par tout le code et les fonctions d'identification, etc. Maintenant, ce qui peut être source de confusion, c'est qu'une fois la fonction définie, elle restera en mémoire et disponible jusqu'à ce qu'elle soit effacée avec un
clear symbols();<BR />// or<BR />clear globals();
Si vous suivez votre code en gardant cela à l'esprit, vous comprendrez peut-être pourquoi votre JSL ne trouve pas la fonction.