0

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

4

1 回答 1

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 子句的效果发生变化。

于 2014-12-11T13:15:06.100 回答