用于集成的 Maximo 自动化脚本

Maximo Automation Script for Integration

我真的需要帮助,我似乎找不到这个问题的答案。我想要发生的是在数据从 xml 入站到系统期间,PRNUM 将被查询到 PRLINE 对象(它是 PR 的子对象),这样我就可以获得 CONTRACTNUM 字段,但我似乎无法从中获得价值。我总是收到 Nonetype 的错误,因为它是空的。

from psdi.server import MXServer
def beforeMboData(ctx):
    mbo = ctx.getMbo()
    struc = ctx.getData()
    prlineSet = MXServer.getMXServer().getMboSet('PRLINE', ctx.getUserInfo())
    prlineSet.setWhere("PRNUM = '"+struc.getCurrentData('PRNUM')+"'")
    prLine = prlineSet.moveFirst()
    contractSet = MXServer.getMXServer().getMboSet('CONTRACT', ctx.getUserInfo())
    contractSet.setWhere("CONTRACTNUM = '"+prLine.getString('CONTRACTNUM')+"'")
    contractRec = contractSet.moveFirst()
    struc.setCurrentData('CONTRACTID',contractRec.getInt('CONTRACTID'))

xml 看起来像这样:

<max:PR action='AddChange'>
    <max:PRNUM>SMPL</max:PRNUM>
    <max:SITEID>BEDFORD</max:SITEID>
    <max:VENDOR>JOHNS</max:VENDOR>
    <max:PRLINE action='AddChange'>
        <max:PRLINENUM>1</max:PRLINENUM>
        <max:ITEMNUM>01231</max:ITEMNUM>
        <!-- I forgot the other fields here -->
        <max:CONTRACTNUM>X1C1</max:CONTRACTNUM>
        <max:CONTRACTID></max:CONTRACTID>
    </max:PRLINE>
</max:PR>

CONTRACTID 字段仅用于测试,因为我想看看我是否会检索一些数据,我会尽快将其删除。我是新手,我也不知道如何使用自动化脚本从 xml 获取 ChildObject 数据以使其更容易。我在 Google 上找不到任何关于这样的东西。

你的PR已经在系统中了吗?这看起来像是一个传入的 PR added 到系统。如果是这样,那么数据还不在数据库中。由于您是从 MXServer 获取一组数据(这通常不是所需的方式),这意味着您正在将数据从数据库(它尚不存在)和新事务中提取出来,而不是收到消息。

此外,我忘记了哪些 hooks/methods 可用于集成 类,但 beforeMboData 似乎不符合您的需要。 听起来 就像(虽然我不记得这是不是真的,现在无法查找)挂钩在将数据加载到 MBO 对象之前运行。

所以经过大量的试验和错误后,这是有效的方法

from psdi.server import MXServer
def beforeCreateMboSet(ctx):
    mbo = ctx.getMbo()
    struc = ctx.getData()
    try:
        contractSet = MXServer.getMXServer().getMboSet('CONTRACT', ctx.getUserInfo())
        prLine = struc.getChildrenData('PRLINE')
        prCount = len(prLine)
        count = 0
        while count < prCount:
            struc.setAsCurrent(prLine,count)
            contractNum = struc.getCurrentData('CONTRACTNUM')
            contractSet.setWhere("CONTRACTNUM = '"+contractNum+"'")
            contractRec = contractSet.moveFirst()
            struc.setCurrentData('CONTRACTID',contractRec.getString('CONTRACTID'))
            count += 1
    finally:
        contractSet.close()