Esecuzione di uno script dopo aver apportato una modifica. Non funziona senza chiudere e riaprire lo script, perché?Sto imparando JSL e sto ottenendo un comportamento che non credo di aver avuto quando ho iniziato. Vorrei sapere se questo comportamento è previsto o se si verifica a causa di una modifica delle impostazioni che potrei aver apportato inavvertitamente.
Ho un semplice script "principale" che chiama una funzione e un altro script. Quando apro JMP ed eseguo lo script principale o l'altra funzione/script che chiama, tutti funzionano correttamente e producono i risultati previsti. Tuttavia, non funzionano quando apporto una modifica a qualcuno di essi (ad esempio se commento lo script che è incluso nello script principale, ad esempio l'ultima riga in basso). Se chiudo tutti gli script aperti e poi li riaccendo, funzionano di nuovo. Provenendo da altri linguaggi di programmazione non mi aspetto un comportamento del genere. Qualsiasi direzione è molto apprezzata
Esempi del mio mainscript di seguito (sono su JMP13).
//clear log ();<BR />getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");Commentando l'ultima riga sopra (o se decommento clear log ()) ie
//clear log ();
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
//include ("generateJournal.jsl");mi dà il seguente errore nello script sopra
Name Unresolved: getDataTable4partID in access or evaluation of 'getDataTable4partID' , getDataTable4partID( "partID", "partIDname" ) /*###*/
Qualsiasi direzione è molto apprezzata.
ScriptingRe: Eseguire uno script dopo aver apportato una modifica. Non funziona senza chiudere e riaprire lo script, perché?Nel tuo esempio, non vedo dove definisci la funzione
getDataTable4partID
JSL è un linguaggio interpretato e richiede la creazione di qualsiasi elemento a cui si fa riferimento nel codice, prima di chiamarlo.Non è un linguaggio compilato, che prima passa attraverso tutto il codice e le funzioni di identificazione ecc. Ora ciò che può creare confusione è che una volta definita la funzione, rimarrà in memoria e disponibile fino a quando non verrà cancellata con un
clear symbols();<BR />// or<BR />clear globals();
Se segui il tuo codice con questo in mente, potresti capire perché il tuo JSL non riesce a trovare la funzione.
Re: Eseguire uno script dopo aver apportato una modifica. Non funziona senza chiudere e riaprire lo script, perché?Grazie @txnelson .
Ecco la funzione
getDataTable4partID
Mi stai suggerendo di usare?
clear symbols();
// clear globals();
nella parte superiore del mio script principale?
Se sì, allora l'ho stancato senza alcun cambiamento di comportamento.
Inoltre, ho dimenticato di menzionare sopra che quando lo script principale non viene eseguito (dopo aver apportato una modifica) e devo riavviare JMP per eseguire nuovamente lo script come previsto, devo anche eseguire la funzione che il mio script principale sta chiamando , una volta, senza il quale il mio script principale non viene eseguito. Questo è chiaramente un comportamento indesiderabile e temo di non fare le cose correttamente.
Re: Eseguire uno script dopo aver apportato una modifica. Non funziona senza chiudere e riaprire lo script, perché?Dovresti iniziare l'intero script con:
Names Default to Here( 1 );
Clear Symbols();
Ciò stabilizzerà l'ambiente Namespace e cancellerà tutti i valori precedenti, ricominciando così ogni volta che si esegue il codice dall'alto.
Re: Eseguire uno script dopo aver apportato una modifica. Non funziona senza chiudere e riaprire lo script, perché?Grazie @txnelson . OK, questo è quello che ho fatto e ora i miei script e le mie funzioni non funzionano nemmeno dopo aver chiuso e rieseguito o dopo aver riavviato JMP.
La mia sceneggiatura principale
Names Default to Here( 1 );
Clear Symbols();
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");La mia funzione è (senza dettagli del database)
Names Default to Here (1)
getDataTable4PartID = Function({PartID}, {dtTemp},
dtTemp = Open Database("connectionstring",
"select '" || PartID || "' as value
from dual",
PartID
);
return(dtTemp);
);e la mia sceneggiatura
plotallcharts.jsl;
ha anche la sua prima linea come
Names Default to Here (1)
Continuo a ricevere l'errore
Name Unresolved: getDataTable4partID in access or evaluation of 'getDataTable4partID' , getDataTable4partID( "partID", "partIDname" ) /*###*/
ma a volte il registro non mostra nulla durante l'esecuzione dello script principale.
Re: Eseguire uno script dopo aver apportato una modifica. Non funziona senza chiudere e riaprire lo script, perché?Names Default to Here( 1 );
Clear Symbols();
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");
Presumo che questa sia la tua prima sezione del tuo codice. Corretta?
La tua terza riga nel codice sta cercando una funzione chiamata "getDataTable4partID".Quella funzione non è stata definita quando il codice tenta di eseguire quella riga.È necessario eseguire la definizione della funzione prima che possa essere chiamata.