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 fresco ed eseguo fresco lo script principale o le altre funzioni/script che chiama, funzionano tutti correttamente e producono i risultati previsti. Tuttavia, non funzionano quando apporto una modifica in uno di essi (ad esempio se commento lo script che è incluso nello script principale, ad esempio l'ultima riga sotto). Se chiudo tutti gli script aperti, li riaccendo, funzionano di nuovo. Venendo da altri linguaggi di programmazione non mi aspetto un simile comportamento. Qualsiasi direzione è molto apprezzata
Esempi del mio mainscript di seguito (sono su JMP13).
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");Commentando l'ultima riga sopra (o se rimuovo il commento da clear log ()), ad es
//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" ) /*###*/
Chiudere tutti gli script e le funzioni aperti (e talvolta JMP) e riavviarli di nuovo sembra far funzionare di nuovo tutto. Non sono sicuro di cosa stia succedendo....
Qualsiasi direzione è molto apprezzata.
Automazione e scriptingRi: Esecuzione di uno script dopo aver apportato una modifica. Non funziona senza chiudere e riaprire lo script - perché?Sì, la funzione getDataTable4partID deve essere analizzata da JSL prima che tu possa chiamarla.L'istruzione include legge la funzione e la carica in memoria.Una volta che è in memoria, può essere richiamato.
Ri: Esecuzione di uno script dopo aver apportato una modifica. Non funziona senza chiudere e riaprire lo script - perché?Per favore scusami per la mia ignoranza, ma questa è la tua spiegazione del motivo per cui ho bisogno di usare
include ("getDataTable4partID.jsl");affinché la mia chiamata di funzione funzioni?
Ri: Esecuzione di uno script dopo aver apportato una modifica. Non funziona senza chiudere e riaprire lo script - perché?La funzione deve essere analizzata prima di poter essere chiamata.L'interprete JSL passa attraverso il codice una riga alla volta.Se non è passato attraverso il codice della funzione prima che tu tenti di chiamare quella funzione, JSL si fermerà.Lo stesso vale per tutte le variabili ecc. In JSL. Così:
Names Default to Here( 1 );
Clear Symbols();
print( a );
a = 42;
Fallirà con
Name Unresolved: a in access or evaluation of 'a' , a/*###*/
at line 3 in Script 4.jsl
Mentre
Names Default to Here( 1 );
Clear Symbols();
a = 42;
print( a );
verrà eseguito senza errori
Ri: Esecuzione di uno script dopo aver apportato una modifica. Non funziona senza chiudere e riaprire lo script - perché?Aggiunta
include ("getDataTable4partID.jsl");prima della chiamata alla funzione ( getDataTable4partID.jsl è il nome dello script della funzione )
getDataTable = getDataTable4partID("partID","partIDname"); cioè
Names Default to Here( 1 );
Clear Symbols();
include (''getDataTable4partID.jsl");
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");sembra aver risolto tutti i problemi. Qual è il motivo?
Ri: Esecuzione di uno script dopo aver apportato una modifica. Non funziona senza chiudere e riaprire lo script - perché?@txnelson
La funzione getDataTable4partID è stato definito, salvato ed eseguito. Funzionava come previsto prima.
Lo script principale che lo chiama o l'altro script incluso nello script principale non funziona più e non funziona.
Ri: Esecuzione di 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. Corretto?
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.
Ri: Esecuzione di uno script dopo aver apportato una modifica. Non funziona senza chiudere e riaprire lo script - perché?Grazie @txnelson . OK, quindi questo è quello che ho fatto e ora i miei script e le mie funzioni non funzionano anche dopo la chiusura e la riesecuzione o dopo il riavvio di 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)
Sto ancora ricevendo 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.
Ri: Esecuzione di 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 esegui il codice dall'alto.
Ri: Esecuzione di 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();
all'inizio del mio script principale?
Se sì, allora l'ho stancato senza alcun cambiamento nel 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 la quale il mio script principale non viene eseguito. Questo è chiaramente un comportamento indesiderabile e temo di non fare le cose correttamente.
Ri: Esecuzione di 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 della sua chiamata.Non è un linguaggio compilato, che prima passa attraverso tutto il codice e identifica le funzioni 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.