Ausführen eines Skripts nach einer Änderung. Funktioniert nicht ohne das Skript zu schließen und erneut zu öffnen - warum?Ich lerne JSL und bekomme ein Verhalten, von dem ich glaube, dass ich es nicht hatte, als ich anfing. Ich würde gerne wissen, ob dieses Verhalten zu erwarten ist oder ob es aufgrund einer Einstellungsänderung auftritt, die ich möglicherweise versehentlich vorgenommen habe.
Ich habe ein einfaches "Haupt"-Skript, das eine Funktion und ein weiteres Skript aufruft. Wenn ich JMP frisch öffne und das Hauptskript oder die anderen Funktionen/Skripte, die es aufruft, neu ausführe, laufen alle einwandfrei und liefern die erwarteten Ergebnisse. Sie funktionieren jedoch nicht, wenn ich eine davon ändere (zB wenn ich das Skript, das im Hauptskript enthalten ist, kommentiere, zB die letzte Zeile unten). Wenn ich alle geöffneten Skripte schließe und sie dann erneut starte, funktionieren sie wieder. Von anderen Programmiersprachen kommend erwarte ich ein solches Verhalten nicht. Jede Richtung wird sehr geschätzt
Beispiele für mein Mainscript unten (ich bin auf JMP13).
//clear log ();<BR />getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");Die letzte Zeile oben kommentieren (oder wenn ich clear log () auskommentiere) ie
//clear log ();
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
//include ("generateJournal.jsl");gibt mir den folgenden Fehler im obigen Skript
Name Unresolved: getDataTable4partID in access or evaluation of 'getDataTable4partID' , getDataTable4partID( "partID", "partIDname" ) /*###*/
Jede Richtung wird sehr geschätzt.
SkriptingRe: Ausführen eines Skripts nach einer Änderung. Funktioniert nicht ohne das Skript zu schließen und erneut zu öffnen - warum?In deinem Beispiel sehe ich nicht, wo du die Funktion definierst
getDataTable4partID
JSL ist eine interpretierte Sprache und erfordert die Erstellung aller Elemente, auf die im Code verwiesen wird, bevor sie aufgerufen werden.Es ist keine kompilierte Sprache, die zuerst den gesamten Code und die identifizierenden Funktionen usw. durchläuft. Was jetzt zu Verwirrung führen kann, ist, dass die Funktion, sobald sie definiert ist, im Speicher verbleibt und verfügbar ist, bis sie mit a gelöscht wird
clear symbols();<BR />// or<BR />clear globals();
Wenn Sie Ihren Code in diesem Sinne durchgehen, werden Sie möglicherweise erkennen, warum Ihre JSL die Funktion nicht finden kann.
Re: Ausführen eines Skripts nach einer Änderung. Funktioniert nicht ohne das Skript zu schließen und erneut zu öffnen - warum?Vielen Dank @txnelson .
Hier ist die Funktion
getDataTable4partID
Schlagen Sie vor, dass ich
clear symbols();
// clear globals();
oben in meinem Hauptskript?
Wenn ja, dann habe ich es ohne Verhaltensänderung ermüdet.
Außerdem habe ich oben vergessen zu erwähnen, dass, wenn das Hauptskript nicht ausgeführt wird (nachdem eine Änderung vorgenommen wurde) und ich JMP neu starten muss, damit das Skript wieder wie erwartet ausgeführt wird, ich auch die Funktion ausführen muss, die mein Hauptskript aufruft , einmal, ohne die mein Hauptskript nicht läuft. Dies ist eindeutig ein unerwünschtes Verhalten und ich mache mir Sorgen, dass ich die Dinge nicht richtig mache.
Re: Ausführen eines Skripts nach einer Änderung. Funktioniert nicht ohne das Skript zu schließen und erneut zu öffnen - warum?Sie sollten Ihr gesamtes Skript beginnen mit:
Names Default to Here( 1 );
Clear Symbols();
Dadurch wird die Namespace-Umgebung stabilisiert und alle vorherigen Werte gelöscht, sodass Sie jedes Mal neu starten, wenn Sie den Code von oben ausführen.
Re: Ausführen eines Skripts nach einer Änderung. Funktioniert nicht ohne das Skript zu schließen und erneut zu öffnen - warum?Vielen Dank @txnelson . OK, das habe ich getan und jetzt funktionieren meine Skripte und Funktionen nicht, selbst nach dem Schließen und erneuten Ausführen oder nach dem Neustart von JMP.
Mein Hauptskript
Names Default to Here( 1 );
Clear Symbols();
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");Meine Funktion ist (ohne Datenbankdetails)
Names Default to Here (1)
getDataTable4PartID = Function({PartID}, {dtTemp},
dtTemp = Open Database("connectionstring",
"select '" || PartID || "' as value
from dual",
PartID
);
return(dtTemp);
);und mein Skript
plotallcharts.jsl;
hat auch seine faustlinie als
Names Default to Here (1)
Ich bekomme immer noch den Fehler
Name Unresolved: getDataTable4partID in access or evaluation of 'getDataTable4partID' , getDataTable4partID( "partID", "partIDname" ) /*###*/
aber manchmal zeigt das Protokoll beim Ausführen des Hauptskripts nichts an.
Re: Ausführen eines Skripts nach einer Änderung. Funktioniert nicht ohne das Skript zu schließen und erneut zu öffnen - warum?Names Default to Here( 1 );
Clear Symbols();
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");
Ich gehe davon aus, dass dies Ihr erster Abschnitt Ihres Codes ist. Richtig?
Ihre dritte Zeile im Code sucht nach einer Funktion namens "getDataTable4partID".Diese Funktion wurde nicht definiert, wenn der Code versucht, diese Zeile auszuführen.Die Funktionsdefinition muss ausgeführt werden, bevor sie aufgerufen werden kann.