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 nicht glaube, dass ich es zu Beginn hatte. Ich würde gerne wissen, ob dieses Verhalten zu erwarten ist oder ob es auf eine Einstellungsänderung zurückzuführen ist, die ich möglicherweise versehentlich vorgenommen habe.
Ich habe ein einfaches „Haupt“-Skript, das eine Funktion und ein anderes Skript aufruft. Wenn ich JMP neu öffne und das Hauptskript oder die anderen aufgerufenen Funktionen/Skripte neu ausführe, laufen alle einwandfrei und liefern die erwarteten Ergebnisse. Sie funktionieren jedoch nicht, wenn ich an einem von ihnen eine Änderung vornehme (z. B. wenn ich das Skript kommentiere, das im Hauptskript enthalten ist, z. B. die letzte Zeile unten). Wenn ich alle geöffneten Skripte schließe und sie dann erneut starte, funktionieren sie wieder. Da ich aus anderen Programmiersprachen komme, erwarte ich ein solches Verhalten nicht. Jede Richtung wird sehr geschätzt
Beispiele meines Hauptskripts unten (ich bin auf JMP13).
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");Kommentieren Sie die letzte Zeile oben (oder wenn ich den Kommentar entferne, löschen Sie log ()), d. h
//clear log ();
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
//include ("generateJournal.jsl");gibt mir im obigen Skript den folgenden Fehler
Name Unresolved: getDataTable4partID in access or evaluation of 'getDataTable4partID' , getDataTable4partID( "partID", "partIDname" ) /*###*/
Das Schließen aller geöffneten Skripte und Funktionen (und manchmal auch JMP) und das erneute Starten scheint alles wieder zum Laufen zu bringen. Ich bin mir nicht sicher, was los ist....
Jede Richtung wird sehr geschätzt.
Automatisierung und SkripterstellungBetreff: Ausführen eines Skripts nach einer Änderung. Funktioniert nicht, ohne das Skript zu schließen und erneut zu öffnen – warum?Ja, die Funktion getDataTable4partID muss von JSL analysiert werden, bevor Sie sie aufrufen können.Die Include-Anweisung liest die Funktion ein und lädt sie in den Speicher.Sobald es im Speicher ist, kann es aufgerufen werden.
Betreff: Ausführen eines Skripts nach einer Änderung. Funktioniert nicht, ohne das Skript zu schließen und erneut zu öffnen – warum?Bitte entschuldigen Sie meine Unwissenheit, aber ist dies Ihre Erklärung dafür, warum ich es verwenden muss?
include ("getDataTable4partID.jsl");damit mein Funktionsaufruf funktioniert?
Betreff: Ausführen eines Skripts nach einer Änderung. Funktioniert nicht, ohne das Skript zu schließen und erneut zu öffnen – warum?Die Funktion muss analysiert werden, bevor sie aufgerufen werden kann.Der JSL-Interpreter geht Zeile für Zeile durch den Code.Wenn der Funktionscode nicht durchlaufen wurde, bevor Sie versuchen, diese Funktion aufzurufen, wird JSL angehalten.Das Gleiche gilt für alle Variablen usw. in JSL. Daher:
Names Default to Here( 1 );
Clear Symbols();
print( a );
a = 42;
Wird scheitern
Name Unresolved: a in access or evaluation of 'a' , a/*###*/
at line 3 in Script 4.jsl
Während
Names Default to Here( 1 );
Clear Symbols();
a = 42;
print( a );
läuft ohne Fehler
Betreff: Ausführen eines Skripts nach einer Änderung. Funktioniert nicht, ohne das Skript zu schließen und erneut zu öffnen – warum?Hinzufügen
include ("getDataTable4partID.jsl");vor dem Funktionsaufruf ( getDataTable4partID.jsl ist der Name des Funktionsskripts )
getDataTable = getDataTable4partID("partID","partIDname"); dh
Names Default to Here( 1 );
Clear Symbols();
include (''getDataTable4partID.jsl");
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");scheint alle Probleme gelöst zu haben. Was ist der Grund?
Betreff: Ausführen eines Skripts nach einer Änderung. Funktioniert nicht, ohne das Skript zu schließen und erneut zu öffnen – warum?@txnelson
Die Funktion getDataTable4partID wurde definiert, gespeichert und ausgeführt. Es hat wie erwartet funktioniert.
Das aufrufende Hauptskript oder das andere im Hauptskript enthaltene Skript ist nicht mehr verfügbar und funktioniert auch nicht.
Betreff: 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, als der Code versucht, diese Zeile auszuführen.Die Funktionsdefinition muss ausgeführt werden, bevor sie aufgerufen werden kann.
Betreff: Ausführen eines Skripts nach einer Änderung. Funktioniert nicht, ohne das Skript zu schließen und erneut zu öffnen – warum?Danke @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 Drehbuch
plotallcharts.jsl;
hat auch seine erste Linie als
Names Default to Here (1)
Ich erhalte 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.
Betreff: 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 mit Folgendem beginnen:
Names Default to Here( 1 );
Clear Symbols();
Dadurch wird die Namespace-Umgebung stabilisiert und alle vorherigen Werte gelöscht, sodass Sie jedes Mal von vorne beginnen, wenn Sie den Code von oben ausführen.
Betreff: Ausführen eines Skripts nach einer Änderung. Funktioniert nicht, ohne das Skript zu schließen und erneut zu öffnen – warum?Danke @txnelson .
Hier ist die Funktion
getDataTable4partID
Schlagen Sie vor, dass ich es verwende?
clear symbols();
// clear globals();
oben in meinem Hauptskript?
Wenn ja, dann habe ich es ermüdet, ohne dass sich mein Verhalten geändert hat.
Außerdem habe ich oben vergessen zu erwähnen, dass ich auch die Funktion ausführen muss, die mein Hauptskript aufruft, wenn das Hauptskript nicht ausgeführt wird (nachdem ich eine Änderung daran vorgenommen habe) und ich JMP neu starten muss, damit das Skript wieder wie erwartet ausgeführt wird , einmal, ohne das mein Hauptskript nicht läuft. Dies ist eindeutig ein unerwünschtes Verhalten und ich mache mir Sorgen, dass ich die Dinge nicht richtig mache.
Betreff: Ausführen eines Skripts nach einer Änderung. Funktioniert nicht, ohne das Skript zu schließen und erneut zu öffnen – warum?In Ihrem Beispiel sehe ich nicht, wo Sie die Funktion definieren
getDataTable4partID
JSL ist eine interpretierte Sprache und erfordert vor dem Aufruf die Erstellung aller im Code referenzierten Elemente.Es handelt sich nicht um eine kompilierte Sprache, die zunächst den gesamten Code durchläuft und Funktionen usw. identifiziert. Was nun verwirrend sein kann, ist, dass die einmal definierte Funktion im Speicher verbleibt und verfügbar bleibt, bis sie mit a gelöscht wird
clear symbols();<BR />// or<BR />clear globals();
Wenn Sie Ihren Code unter diesem Gesichtspunkt durchgehen, erkennen Sie möglicherweise, warum Ihre JSL die Funktion nicht finden kann.