Was ist an meinem Funktionsaufruf falsch?Ich lerne, wie man Funktionen in JMP (von Matlab) schreibt und aufruft.
Es wird versucht, Daten für ein getestetes Teil über eine SQL-Abfrage aus der Datenbank abzurufen.
Habe zwei separate Skripte geschrieben. Eine davon ist eine Funktion mit PartID als Eingabevariable und der Testdatentabelle als Ausgabe.
Ein anderes Skript ist der Funktionsaufruf, aber ich kann die PartID anscheinend nicht an die Funktion übergeben. Wo mache ich einen Fehler?
Mein Funktionsaufruf
partDataTable = getDataTable4partID("PART16.0009")Meine Funktion
getDataTable4PartID = Function( {PartID},{partDataTable},
Open Database(
"Driver=SQL Server;
Server=XAB-SQL02;
DATABASE=TBSDF;
Trusted_Connection=Yes;",
"SELECT * FROM dbo.View_BBX a WHERE a.Part like 'PartID' AND a.TestDateTime > '2021-02-01'",
"partDataTable" // name of the output data table
);
);Die SQL-Abfrage selbst funktioniert, wenn PartID durch die tatsächliche Teilenummer PART16.0009 ersetzt wird und separat ausgeführt wird, wobei die gewünschte Datentabelle ausgespuckt wird. Wenn ich jedoch den Funktionsaufruf verwende, hat die Datentabelle immer noch „PartID“ in den Quell-/Update-aus-DB-Skripten in der leeren Datentabelle.
DatenzugriffWindowsBetreff: Was ist an meinem Funktionsaufruf falsch?Hinzufügen
include ("getDataTable4partID.jsl");Vor dem Funktionsaufruf scheinen alle Probleme gelöst zu sein, die ich hatte.
Betreff: Was ist an meinem Funktionsaufruf falsch?Danke @jthi . Alle meine Skripte und Funktionen haben die erste Zeile als
Names Default To Here(1);
Es passiert einfach (wie in meinem vorherigen Beitrag erwähnt), dass diese bestimmte Funktion nicht ausgeführt wurde, ohne die obige Zeile zu kommentieren.
Auf jeden Fall, wenn ich Ihre vorgeschlagene Funktion verwende, werde ich Holen Sie sich eine Datentabelle mit erwarteten/korrekten Daten, aber die Datentabelle heißt UntitledXX (XX ist in meinem Fall zufällig 24). Jede Hilfe zur Behebung dieses Problems wäre sehr hilfreich. Danke.
Betreff: Was ist an meinem Funktionsaufruf falsch?Wenn Namen standardmäßig hier sind(1); Wenn Ihr Skript kaputt geht, stimmt höchstwahrscheinlich etwas mit den Namespaces nicht. Sie sollten JSL-Skripte fast immer mit Names Default To Here(1) starten und es sollte nichts kaputt machen.
Ich vermute, dass es an der falschen Stelle definiert (oder an der falschen Stelle aufgerufen) wurde. Die Ausführungsreihenfolge spielt bei JSL eine Rolle.
Betreff: Was ist an meinem Funktionsaufruf falsch?Danke @jthi .Ich habe zwei Probleme mit dem, was Sie vorgeschlagen haben.
Wenn ich die Funktion aufrufe
//Names Default To Here(1);
getDataTable4PartID = Function({PartID}, {dtTemp},
dtTemp = Open Database("connectionstring",
"select '" || PartID || "' as value
from dual",
PartID
);
return(dtTemp);
);als
</CODE></PRE><P>Ich erhalte eine Datentabelle mit erwarteten/korrekten Daten, aber die Datentabelle heißt UntitledXX (in meinem Fall ist XX zufällig 24).</P><P>Beachten Sie auch, dass ich einen Kommentar abgeben musste</P><PRE class="language-jsl"><CODE>Names Default To Here(1);DataTable4PartID = getDataTable4PartID("PART16.0009");
ohne die der Funktionsaufruf nicht funktionierte. Ich bin mir nicht sicher, was los ist. Jede Hilfe wäre sehr nützlich.
Betreff: Was ist an meinem Funktionsaufruf falsch?Ja, Sie müssen die Funktion einmal ausführen, um sie zu „aktualisieren“.
Wenn Sie möchten, dass die Datentabelle denselben Namen wie die PartID erhält, können Sie in der Funktion nur ein Argument verwenden. Hier ist ein etwas vollständigeres Beispiel mit Anführungszeichen und ohne Anführungszeichen:
Names Default To Here(1);
getDataTable4PartID_withQuotes = Function({PartID},
Open Database("connectionstring",
"
select '" || PartID || "' as value
from dual
",
"PartID"
);
);
partDataTable_withQuotes = getDataTable4PartID_withQuotes("PART16.0009");
Show(partDataTable_withQuotes);
getDataTable4PartID = Function({PartID},
Open Database("connectionstring",
"
select '" || PartID || "' as value
from dual
",
PartID
);
);
partDataTable = getDataTable4PartID("PART16.0009");
Show(partDataTable);Bei mir werden diese im Protokoll abgedruckt:
partDataTable_withQuotes = DataTable("PartID");
partDataTable = DataTable("PART16.0009");
JMP gibt die Datentabelle von der Funktion zurück (da es die „letzte“ Zeile ist), aber ich fühle mich nicht wohl dabei, ihr zu vertrauen, also würde ich eine lokale Referenz in der Funktion verwenden und dann die Referenz zurückgeben und die endgültige Funktion wäre etwa so:
getDataTable4PartID = Function({PartID}, {dtTemp},
dtTemp = Open Database("connectionstring",
"select '" || PartID || "' as value
from dual",
PartID
);
return(dtTemp);
);
Betreff: Was ist an meinem Funktionsaufruf falsch?Ja (wenn ich die Frage verstehe), muss die Funktion „function(...)“ ausgeführt werden, um die kompilierte Funktion in der Variablen zu ersetzen, der sie zugewiesen ist, in Ihrem Beispiel getDataTable4PartID.
Wenn das so unklar war, wie es aussieht, fragen Sie noch einmal ...
Schreiben Sie Ihre eigenen Funktionen könnte auch interessant sein.
Betreff: Was ist an meinem Funktionsaufruf falsch?Mir ist gerade etwas aufgefallen und ich muss bestätigen, ob dies tatsächlich der Fall ist. Nachdem ich eine Änderung an der Funktion vorgenommen habe, scheint es, dass ich die Funktion einmal ausführen muss, damit die Änderungen übernommen werden. Nur sparen scheint nicht auszureichen. Ist das richtig?
Ich hatte die Zitate auf angewendet partDataTable und habe meine Funktion gespeichert. Der Funktionsaufruf funktionierte wie erwartet mit dem gewünschten Datentabellennamen. Aber nachdem ich die Funktion einmal ausgeführt habe, erhalte ich, wenn ich den Funktionsaufruf erneut ausführe, das, was Sie versprochen haben, nämlich partDataTable als Namen der generierten Datentabellendatei.
Betreff: Was ist an meinem Funktionsaufruf falsch?@jthi . Hmm, aber ich erhalte den Namen, den die Ausgabedatentabelle heißen soll (dh derselbe wie meine Teile-ID).Das ist mein Funktionsaufruf.
partDataTable = getDataTable4partID("PART16.0009","PART16.0009")
Betreff: Was ist an meinem Funktionsaufruf falsch?Wenn Sie es in Anführungszeichen setzen, wird Ihre Datentabelle höchstwahrscheinlich partDataTable benannt und nicht mit dem gewünschten Namen (wenn Sie ihn als Argument haben wollten).
Betreff: Was ist an meinem Funktionsaufruf falsch?Danke. Das funktioniert. Ich habe jedoch festgestellt, dass partDataTable mit Anführungszeichen auch gut funktioniert. Soll das so sein?
Betreff: Was ist an meinem Funktionsaufruf falsch?Überprüfen Sie die Funktion anhand des Scripting-Index und von Programmierfunktionen - Funktion . Überprüfen Sie auch Skript-Anleitung
Derzeit haben Sie PartID als einziges Argument und partDataTable als lokale Variable für getDataTable4PartID, die Sie nicht verwenden. Höchstwahrscheinlich möchten Sie die Funktion so definieren, dass sie zwei Argumente hat:
getDataTable4PartID = Function( {PartID, partDataTable},
Nachdem Sie das geklärt haben, müssen Sie herausfinden, wie Sie die Argumente im Ausdruck innerhalb der Funktion verwenden. Für PartID möchten Sie es mit der SQL-Abfrage und partDataTable verketten, die Sie direkt in der Open Database verwenden möchten:
Open Database(
"Driver=SQL Server;
Server=XAB-SQL02;
DATABASE=TBSDF;
Trusted_Connection=Yes;",
"SELECT * FROM dbo.View_BBX a WHERE a.Part like '"||PartID||"' AND a.TestDateTime > '2021-02-01'",
partDataTable // no need for quotes here
);