【问题标题】:Maximo scripting cannot load second MboSetMaximo 脚本无法加载第二个 MboSet
【发布时间】:2015-02-08 11:48:56
【问题描述】:

我在 INVOICELINE 上有一个带有对象启动点的脚本。 对于 mbo,我想获得与当前 MBO 具有相同 PONUM 的所有 INVOICELINES(因为它们可能在当前 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 之后的所有 invoicelines 记录(如预期的那样),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 in script at line...(该行是指带有 ilSet.setWhere(ilSetWhere) 表达式的行。我不知道如何解决这个问题并且不知道如何解决它。

【问题讨论】:

    标签: jython maximo


    【解决方案1】:

    现在我们遇到了一个错误!

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

    与其在自己的事务中从服务器获取新的集合(没有其他关联或可能的数据缓存),不如从当前 MBO 中获取 invoiceline 集合。我不知道你的确切用例,但通常你想做这样的事情而不是像你一样得到一个新的集合。至少,它会给你的新套装一个“主人”。您甚至可能想让 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 子句的效果发生变化。

    【讨论】:

    • 我刚刚在 setWhere 行收到 NullPointerException 错误。 (BMXAA7837E)。这对我来说毫无意义,因为集合是正确的,where 子句也是如此。
    • 现在问题中包含更多信息,更清楚地知道出了什么问题。这个答案不再相关。
    • 但是,我还不能对问题本身发表评论,所以我会在这里发表评论。根据您发布的内容,在该行上获取空指针的唯一方法是让“ilSet”为空。你没有在这里显示它,但你说你记录了集合。根据您记录的内容,您应该在该代码处获得一个空指针。我在想错误行的内容比我们看到的要多,或者报告的行号不完全正确(例如,它可能包括 Maximo 在脚本运行之前添加到脚本中的开销线;我可以如果这是一个真正的问题,不记得了)。
    • 我仍然对这一切感到困惑。我非常肯定我的 ilSetWhere 是正确的(它相似并且基于用于其他对象的相同参数)空指针异常堆栈跟踪指向 psdi.app.invoice.InvoiceLine.init(InvoiceLine.java:270) 这是在初始化函数中:MboRemote invoice = getOwner(); 270: if ((invoice.isBasedOn("INVOICE")) && (!invoice.toBeAdded())) { if (((InvoiceRemote)invoice).isConsignmentInvoice()) { setReadOnlyForConsInvoice(); } } 代码是否有可能无法以这种方式检索所有者?
    • 啊啊。那是关键信息。正确的。根据该代码(看起来很熟悉;我想我以前遇到过),Maximo 有效地坚持 INVOICELINE 集有一个所有者,而您没有。我正在修改我的答案。
    猜你喜欢
    • 2021-01-15
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 2012-05-23
    相关资源
    最近更新 更多