Maximo脚本无法加载第二个MboSet

时间:2014-12-10 10:16:00

标签: jython maximo

我在INVOICELINE上有一个带有对象启动点的脚本。 对于mbo我想让所有的INVOICELINES与当前的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)

效果很好。

然后我对这组invoicelines做了同样的事情:

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 ...(该行指的是带有ilSet.setWhere(ilSetWhere)表达式的行。我不知道如何解决这个问题并且不知道如何解决它。

1 个答案:

答案 0 :(得分: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发现该关系名已经注册了#34;从这个起始对象,它将忽略接下来的两个参数,并使用该关系来获取该集合。如果它没有找到那种关系"注册"它将其注册为此代码的范围(因此,如果您愿意,可以稍后在此代码中重复使用它)。第二个参数定义要创建临时关系的目标对象。第三个参数定义" where子句"这种临时关系。


原始答案:

你得到的错误是什么?

另外,你说你登录" ilSet"在" myMXServer.getMboSet ..."之后线?这将导致Maximo运行查询并在该点将对象加载到集合中(它等待运行查询,直到它必须)。因此,您不会看到where子句发生变化的影响,直到您重置()"集合。