Was ist an meinem Funktionsaufruf falsch?Ich lerne, wie man in JMP (von Matlab kommt) eine Funktion 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 ist eine Funktion mit PartID als Eingangsvariable und der Testdatentabelle als Ausgabe.
Anderes Skript ist der Funktionsaufruf, aber ich scheine die partID nicht an die Funktion übergeben zu können. Wo liege ich falsch?
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 ausgegeben wird, aber wenn ich den Funktionsaufruf verwende, hat die Datentabelle immer noch 'PartID' in den Source/Update From DB-Skripten in der leeren Datentabelle.
DatentabelleSkriptingFensterRe: Was ist an meinem Funktionsaufruf falsch?Überprüfen Sie die Funktion aus dem Scripting-Index und von Programmierfunktionen - Funktion . Überprüfen Sie auch Skripting-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 definiert haben, dass sie 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 in die 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
);
Re: Was ist an meinem Funktionsaufruf falsch?Vielen Dank. Das funktioniert. Ich habe jedoch festgestellt, dass partDataTable mit Anführungszeichen auch gut funktioniert. Soll so sein?
Re: Was ist an meinem Funktionsaufruf falsch?Wenn Sie es in Anführungszeichen setzen, wird Ihre Datentabelle höchstwahrscheinlich in partDataTable benannt und nicht mit dem gewünschten Namen (wenn Sie es als Argument haben wollten).
Re: Was ist an meinem Funktionsaufruf falsch?@jthi . Hmm, aber ich erhalte den Namen, mit dem die Ausgabedatentabelle aufgerufen werden soll (dh der gleiche wie meine partID).Das ist mein Funktionsaufruf.
partDataTable = getDataTable4partID("PART16.0009","PART16.0009")
Re: Was ist an meinem Funktionsaufruf falsch?Mir ist gerade etwas aufgefallen und muss bestätigen, ob dies tatsächlich der Fall ist. Nachdem ich eine Änderung an der Funktion vorgenommen habe, muss ich die Funktion anscheinend einmal ausführen, damit die Änderungen übernommen werden. Nur sparen scheint nicht zu reichen. Ist das richtig?
Ich hatte die Zitate angewendet auf partDataTable und meine Funktion gespeichert. Der Funktionsaufruf funktionierte wie erwartet mit dem von mir gewünschten Datentabellennamen. Aber nachdem ich die Funktion einmal ausgeführt habe, wenn ich den Funktionsaufruf erneut ausführe, erhalte ich das, was Sie gesagt haben, dh partDataTable als Name der generierten Datentabellendatei.
Re: 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 ihr zugewiesenen Variablen zu ersetzen, 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.
Re: Was ist an meinem Funktionsaufruf falsch?Ja, Sie müssen die Funktion einmal ausführen, damit sie "aktualisiert" wird.
Wenn Sie möchten, dass die Datentabelle den gleichen Namen wie die PartID hat, können Sie nur ein Argument in der Funktion 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);Für mich werden diese in das Protokoll gedruckt:
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 die 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);
);