Maximo 脚本无法加载第二个 MboSet

问题描述 投票:0回答:2

我有一个在 INVOICELINE 上带有对象启动点的脚本。 对于 mbo,我希望获得与当前 MBO 具有相同 PONUM 的所有发票行(因为它们可能位于当前 mbo 发票之外的其他发票中)

在脚本中我找到如下 PO:(测试状态)

from psdi.server import MXServer
from psdi.mbo import Mbo
from psdi.mbo import MboConstants
from psdi.security import UserInfo
from psdi.server import MXServer

myMXServer = MXServer.getMXServer()
userInfo = mbo.getThisMboSet().getUserInfo()

# find the PO
poSet = myMXServer.getMboSet("PO", userInfo)
poSetWhere = "ponum='" + mbo.getString("PONUM") + "' and siteid='" + mbo.getString("POSITEID") + "' and status not in " + poNoUpdate
poSet.setWhere(poSetWhere)

poMbo = poSet.getMbo(0)

效果很好。

然后我对发票行集执行相同的操作:

ilSet = myMXServer.getMboSet("INVOICELINE", userInfo)
ilSetWhere = "ponum='" + mbo.getString("PONUM") + "' and positeid='" + mbo.getString("POSITEID") + "'"
ilSet.setWhere(ilSetWhere)
ilMbo = ilSet.moveFirst()

while ilMbo is not None:
    ...

这会导致 setWhere 行出现错误。奇怪的是,日志记录(为了便于阅读而将其删除)表明 ilSet 包含 getMboSet 之后的所有发票行记录(如预期),ilSetWhere 有一个有效的查询,您可以在 SQL Developer 中复制粘贴该查询。

Maximo 在执行这个 setWhere 之前需要一些索引吗?

这是两个 setWhere 字符串的日志记录结果:

ponum='4140006682' and siteid='mysite' and status not in ('CLOSED','CAN','GESLTN','ANN')

ponum='4140006682' and positeid='mysite'

我得到的错误是脚本中的通用 BMXAA7837E java.lang.NullPointerException ... 行(该行指的是带有 ilSet.setWhere(ilSetWhere) 表达式的行。我不知道如何解决此问题并有不知道如何解决它。

jython maximo
2个回答
2
投票

现在我们有一个错误需要处理!

Maximo 有效地坚持 INVOICELINE 集有一个“所有者”,而您在代码示例中尚未设置。将所有者视为父集。具体来说,它是用于获取当前集合的MBOSet。它实际上不必与当前集合相关,但大多数时候它会是(并且以这种方式获取集合是最有意义的)。获取集合后可以将所有者注入到集合中(以更改它或欺骗 Maximo),但这很少是好的代码。

您最好不要从当前的 MBO 中获取发票行,而不是在自己的事务中从服务器获取新的集合(没有其他关系或可能的数据缓存)。我不知道你的确切用例,但通常你想做这样的事情,而不是像你那样获得一套新的。至少,它会给你的新套装一个“主人”。您甚至可能想让 SQL 成为一种“关系”,而不是对其进行硬编码。

ilSetWhere = "ponum='" + mbo.getString("PONUM") + "' and positeid='" + mbo.getString("POSITEID") + "'"
ilSet = mbo.getMboSet("$TempInvoiceLineRelationship", "INVOICELINE", ilSetWhere)
ilMbo = ilSet.moveFirst()

这段代码是我凭记忆写的,所以我不知道它是否完全正确。这种形式的“getMboSet”需要三个参数。第一个是关系名称。如果 Maximo 发现该关系名称已从此起始对象“注册”,它将忽略接下来的两个参数并使用该关系来获取该集合。如果它没有找到“已注册”的关系,则会将其注册到此代码的范围内(因此如果需要,您可以稍后在此代码中重新使用它)。第二个参数定义要创建临时关系的目标对象。第三个参数定义了这个临时关系的“where 子句”。


原答案:

您遇到的错误是什么?

另外,你说你在“myMXServer.getMboSet ...”行之后记录“ilSet”?这将导致 Maximo 运行查询并将对象加载到此时的集合中(它会等待运行查询,直到必须运行为止)。因此,在“reset()”集合之前,您不会看到 where 子句更改的效果。


0
投票

当我尝试使用 add() 将记录添加到 mboset 时,我遇到了同样的错误

© www.soinside.com 2019 - 2024. All rights reserved.