Ejecutar un script después de realizar un cambio. No funciona sin cerrar y volver a abrir el script, ¿por qué?Estoy aprendiendo JSL y obteniendo un comportamiento que no creo que obtuve cuando comencé. Me gustaría saber si se esperaba este comportamiento o si se debe a un cambio de configuración que pude haber realizado sin darme cuenta.
Tengo un script "principal" simple que llama a una función y otro script. Cuando abro JMP fresco y ejecuto de nuevo el script principal o la otra función/scripts que llama, todos funcionan bien y producen los resultados esperados. Sin embargo, no funcionan cuando realizo un cambio en cualquiera de ellos (por ejemplo, si comento el script que está incluido en el script principal, por ejemplo, la última línea a continuación). Si cierro todos los scripts abiertos y luego los vuelvo a disparar, funcionan de nuevo. Viniendo de otros lenguajes de programación, no espero tal comportamiento. Cualquier dirección es muy apreciada.
Ejemplos de mi guión principal a continuación (estoy en JMP13).
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");Comentando la última línea de arriba (o si descomento borrar el registro ()), es decir
//clear log ();
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
//include ("generateJournal.jsl");me da el siguiente error en el script anterior
Name Unresolved: getDataTable4partID in access or evaluation of 'getDataTable4partID' , getDataTable4partID( "partID", "partIDname" ) /*###*/
Cerrar todos los scripts y funciones abiertos (y, a veces, JMP) y volver a activarlos parece hacer que todo vuelva a funcionar. No estoy seguro de lo que está pasando....
Cualquier dirección es muy apreciada.
Automatización y secuencias de comandosRe: Ejecutar un script después de hacer un cambio. No funciona sin cerrar y volver a abrir el script, ¿por qué?Sí, JSL debe analizar la función getDataTable4partID antes de que pueda llamarla.La declaración de inclusión lee la función y la carga en la memoria.Una vez que está en la memoria, se puede llamar.
Re: Ejecutar un script después de hacer un cambio. No funciona sin cerrar y volver a abrir el script, ¿por qué?Disculpe mi ignorancia, pero ¿es esta su explicación de por qué necesito usar
include ("getDataTable4partID.jsl");para que mi función llame al trabajo?
Re: Ejecutar un script después de hacer un cambio. No funciona sin cerrar y volver a abrir el script, ¿por qué?La función debe analizarse antes de poder llamarla.El intérprete de JSL recorre el código una línea a la vez.Si no ha recorrido el código de la función antes de intentar llamar a esa función, JSL se detendrá.Lo mismo es cierto para todas las variables, etc. en JSL. De este modo:
Names Default to Here( 1 );
Clear Symbols();
print( a );
a = 42;
fallará con
Name Unresolved: a in access or evaluation of 'a' , a/*###*/
at line 3 in Script 4.jsl
Mientras
Names Default to Here( 1 );
Clear Symbols();
a = 42;
print( a );
se ejecutará sin error
Re: Ejecutar un script después de hacer un cambio. No funciona sin cerrar y volver a abrir el script, ¿por qué?agregando
include ("getDataTable4partID.jsl");antes de la llamada de función ( getDataTable4partID.jsl es el nombre del script de función )
getDataTable = getDataTable4partID("partID","partIDname"); es decir
Names Default to Here( 1 );
Clear Symbols();
include (''getDataTable4partID.jsl");
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");parece haber resuelto todos los problemas. ¿Cuál es la razón?
Re: Ejecutar un script después de hacer un cambio. No funciona sin cerrar y volver a abrir el script, ¿por qué?@txnelson
La función getDataTable4partID ha sido definido, guardado y ejecutado. Estaba funcionando como se esperaba antes.
El script principal ya no lo llama y tampoco funciona, o el otro script incluido en el script principal.
Re: Ejecutar un script después de hacer un cambio. No funciona sin cerrar y volver a abrir el script, ¿por qué?Names Default to Here( 1 );
Clear Symbols();
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");
Supongo que esta es su primera sección de su código. ¿Correcto?
Su tercera línea en el código está buscando una función llamada "getDataTable4partID".Esa función no se ha definido cuando el código intenta ejecutar esa línea.Debe ejecutar la definición de la función antes de poder llamarla.
Re: Ejecutar un script después de hacer un cambio. No funciona sin cerrar y volver a abrir el script, ¿por qué?Gracias @txnelson . Bien, esto es lo que hice y ahora mis scripts y funciones no funcionan incluso después de cerrar y volver a ejecutar o después de reiniciar JMP.
Mi guion principal
Names Default to Here( 1 );
Clear Symbols();
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");Mi función es (sin detalles de la base de datos)
Names Default to Here (1)
getDataTable4PartID = Function({PartID}, {dtTemp},
dtTemp = Open Database("connectionstring",
"select '" || PartID || "' as value
from dual",
PartID
);
return(dtTemp);
);y mi guion
plotallcharts.jsl;
también tiene su línea de puño como
Names Default to Here (1)
sigo recibiendo el error
Name Unresolved: getDataTable4partID in access or evaluation of 'getDataTable4partID' , getDataTable4partID( "partID", "partIDname" ) /*###*/
pero a veces el registro no muestra nada al ejecutar el script principal.
Re: Ejecutar un script después de hacer un cambio. No funciona sin cerrar y volver a abrir el script, ¿por qué?Deberías comenzar todo tu script con:
Names Default to Here( 1 );
Clear Symbols();
Esto estabilizará el entorno del espacio de nombres y borrará todos los valores anteriores, por lo que comenzará de nuevo cada vez que ejecute el código desde arriba.
Re: Ejecutar un script después de hacer un cambio. No funciona sin cerrar y volver a abrir el script, ¿por qué?Gracias @txnelson .
Aquí está la función
getDataTable4partID
¿Estás sugiriendo que use
clear symbols();
// clear globals();
en la parte superior de mi guión principal?
Si es así, entonces lo he cansado sin ningún cambio en el comportamiento.
Además, olvidé mencionar anteriormente que cuando el script principal no se ejecuta (después de hacer un cambio en él) y necesito reiniciar JMP para que el script vuelva a ejecutarse como se esperaba, también necesito ejecutar la función a la que llama mi script principal. , una vez, sin la cual mi script principal no se ejecuta. Este es claramente un comportamiento indeseable y me preocupa no estar haciendo las cosas correctamente.
Re: Ejecutar un script después de hacer un cambio. No funciona sin cerrar y volver a abrir el script, ¿por qué?En tu ejemplo, no veo donde defines la función.
getDataTable4partID
JSL es un lenguaje interpretado y requiere la creación de cualquier elemento al que se haga referencia en el código, antes de llamarlo.No es un lenguaje compilado, que primero pasa por todo el código e identifica funciones, etc. Ahora, lo que puede ser confuso es que una vez que se define la función, permanecerá en la memoria y estará disponible hasta que se borre con un
clear symbols();<BR />// or<BR />clear globals();
Si sigue su código con esto en mente, puede ver por qué su JSL no puede encontrar la función.