我的函數呼叫出了什麼問題?我正在學習如何在 JMP 中編寫和調用函數(來自 Matlab)。
嘗試透過 SQL 查詢從資料庫中提取測試零件的資料。
寫了兩個單獨的腳本。 一種是以PartID作為輸入變量,以測試資料表作為輸出的函數。
其他腳本是函數調用,但我似乎無法將partID傳遞給函數。 我哪裡錯了?
我的函數調用
partDataTable = getDataTable4partID("PART16.0009")我的功能
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
);
);當 PartID 被實際零件號 PART16.0009 取代並單獨運行並吐出所需的資料表時,SQL 查詢本身可以工作,但是當我使用函數呼叫時,資料表在來源/更新資料庫腳本中仍然具有“PartID”在空資料表中。
資料存取視窗回覆:我的函數呼叫出了什麼問題?添加
include ("getDataTable4partID.jsl");在函數呼叫似乎已經解決了我遇到的所有問題之前。
回覆:我的函數呼叫出了什麼問題?謝謝@jthi 。 我所有的腳本和函數的第一行都是
Names Default To Here(1);
它只是發生了(正如我之前的文章中提到的),如果不註釋上面的行,這個特定的函數就不會運行。
無論如何,如果我使用你建議的功能,我取得一個包含預期/正確資料的資料表,但該資料表名為 UntitledXX(在我的例子中 XX 恰好是 24)。 任何解決此問題的幫助都會非常有幫助。 謝謝。
回覆:我的函數呼叫出了什麼問題?如果名稱預設為此處(1);破壞你的腳本很可能是命名空間有問題。 您幾乎應該始終使用“Names Default To Here(1)”來啟動 JSL 腳本,並且它不應該破壞任何內容。
我的猜測是它定義在錯誤的位置(或在錯誤的位置呼叫),執行順序對 JSL 確實很重要。
回覆:我的函數呼叫出了什麼問題?謝謝@jthi 。我對你的建議有兩個問題。
如果我呼叫該函數
//Names Default To Here(1);
getDataTable4PartID = Function({PartID}, {dtTemp},
dtTemp = Open Database("connectionstring",
"select '" || PartID || "' as value
from dual",
PartID
);
return(dtTemp);
);作為
</CODE></PRE><P>我得到一個包含預期/正確資料的資料表,但該資料表名為 UntitledXX(XX 在我的例子中恰好是 24)。</P><P>另外,請注意,我必須發表評論</P><PRE class="language-jsl"><CODE>Names Default To Here(1);DataTable4PartID = getDataTable4PartID("PART16.0009");
沒有它,函數呼叫就無法工作。 不知道發生了什麼......任何幫助都會非常有用。
回覆:我的函數呼叫出了什麼問題?是的,您必須運行該函數一次才能使其「更新」。
如果您希望資料表的名稱與 PartID 相同,那麼您可以在函數中只使用一個參數。 這是帶有引號和不帶引號版本的更完整範例:
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);對我來說,這些被印到日誌中:
partDataTable_withQuotes = DataTable("PartID");
partDataTable = DataTable("PART16.0009");
JMP 將從函數傳回資料表(因為它是「最後」行),但我不願意相信它,所以我會在函數中使用本地引用,然後返回引用,最終函數將類似於:
getDataTable4PartID = Function({PartID}, {dtTemp},
dtTemp = Open Database("connectionstring",
"select '" || PartID || "' as value
from dual",
PartID
);
return(dtTemp);
);
回覆:我的函數呼叫出了什麼問題?是的(如果我理解這個問題),必須執行函數“function(...)”來替換它分配給的變數中的編譯函數,在您的範例中為 getDataTable4PartID 。
如果這像看起來那麼不清楚,請再問一次...
編寫您自己的函數可能也很有趣。
回覆:我的函數呼叫出了什麼問題?我剛剛意識到一件事,需要確認是否確實如此。 對函數進行更改後,似乎我需要運行該函數一次才能應用更改。 僅僅節省似乎還不夠。 它是否正確?
我已將引號應用於partDataTable 並儲存了我的函數。 函數呼叫按預期工作,並使用我想要的資料表名稱。 但是運行該函數一次後,當我再次運行該函數呼叫時,我得到了你所說的,即partDataTable作為生成的資料表檔案的名稱。
回覆:我的函數呼叫出了什麼問題?@jthi 。 嗯,但我得到了我想要調用的輸出資料表的名稱(即與我的partID 相同)。這是我的函數呼叫。
partDataTable = getDataTable4partID("PART16.0009","PART16.0009")
回覆:我的函數呼叫出了什麼問題?如果您將其放在引號中,它很可能會將您的資料表命名為partDataTable,而不是您想要的名稱(如果您想將其作為參數)。
回覆:我的函數呼叫出了什麼問題?謝謝。 這有效。 不過,我注意到,使用引號的partDataTable 也可以正常運作。 應該是這樣的嗎?
回覆:我的函數呼叫出了什麼問題?從腳本索引和從檢查函數程式設計函數 - 函數。 另請檢查腳本指南
目前,您將 PartID 作為唯一參數,將 partDataTable 作為您不使用的 getDataTable4PartID 的局部變數。 您很可能希望使用類似以下內容定義的函數必須有參數:
getDataTable4PartID = Function( {PartID, partDataTable},
解決之後,您必須弄清楚如何在函數內的表達式中使用參數。 對於 PartID,您希望將其連接到 SQL 查詢和要在開放資料庫中直接使用的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 // no need for quotes here
);