我的函数调用出了什么问题?我正在学习如何在 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
);