用于更改工单状态的 Maximo 自动化脚本
Maximo automatisation script to change statut of workorder
我在我的 WoActivity table 中创建了一个名为 VDS_COMPLETE 的非持久属性。它是一个布尔值,由我的一个应用程序中的复选框更改。
我正在尝试在 Python 中制作一个自动化脚本,以更改每个任务的状态,即在我保存工单时已检查的工单。
我不知道为什么它不起作用,但我很确定我已经接近答案了...
你知道为什么它不起作用吗?我知道我在评论中有代码,我做了一些实验...
from psdi.mbo import MboConstants
from psdi.server import MXServer
mxServer = MXServer.getMXServer()
userInfo = mxServer.getUserInfo(user)
mboSet = mxServer.getMboSet("WORKORDER")
#where1 = "wonum = :wonum"
#mboSet .setWhere(where1)
#mboSet.reset()
workorderSet = mboSet.getMbo(0).getMboSet("WOACTIVITY", "STATUS NOT IN ('FERME' , 'ANNULE' , 'COMPLETE' , 'ATTDOC')")
#where2 = "STATUS NOT IN ('FERME' , 'ANNULE' , 'COMPLETE' , 'ATTDOC')"
#workorderSet.setWhere(where2)
if workorderSet.count() > 0:
for x in range(0,workorderSet.count()):
if workorderSet.getString("VDS_COMPLETE") == 1:
workorder = workorderSet.getMbo(x)
workorder.changeStatus("COMPLETE",MXServer.getMXServer().getDate(), u"Script d'automatisation", MboConstants.NOACCESSCHECK)
workorderSet.save()
workorderSet.close()
看起来你最大的两个错误是 1. 试图让你的布尔字段 (VDS_COMPLETE) 脱离集合(意思是脱离记录集合,就像整个 table)而不是关闭 MBO(意味着一个实际记录,table 中的一个条目)和 2. 从数据库中获取一组新数据(通过 MXServer 调用)这意味着使用以前保存的数据而不是获取您的数据集来自实际进行了未决更改的屏幕(请记住,非持久字段不会保存到数据库中)。
这个脚本还有一些其他问题,比如你在你的 for 循环中使用 "count()"(或者甚至不止一次)这是一个昂贵的操作,以及你目前的方式(虽然这可能是你调试的结果)在获取第一个工作订单之前没有过滤工作订单集(意味着你从 table 获得一个随机工作订单)然后根据该记录建立动态关系(而不是使用正常关系或完全跳过关系并仅使用 "where" 子句),即使该关系可能已经存在。
这是一个 Stack Overflow,更详细地描述了 Maximo 中的关系和 "where" 子句:Describe relationship in maximo 7.5
这个问题还有一些关于从屏幕获取数据与从数据库获取新数据的更多信息:
我在我的 WoActivity table 中创建了一个名为 VDS_COMPLETE 的非持久属性。它是一个布尔值,由我的一个应用程序中的复选框更改。
我正在尝试在 Python 中制作一个自动化脚本,以更改每个任务的状态,即在我保存工单时已检查的工单。
我不知道为什么它不起作用,但我很确定我已经接近答案了... 你知道为什么它不起作用吗?我知道我在评论中有代码,我做了一些实验...
from psdi.mbo import MboConstants
from psdi.server import MXServer
mxServer = MXServer.getMXServer()
userInfo = mxServer.getUserInfo(user)
mboSet = mxServer.getMboSet("WORKORDER")
#where1 = "wonum = :wonum"
#mboSet .setWhere(where1)
#mboSet.reset()
workorderSet = mboSet.getMbo(0).getMboSet("WOACTIVITY", "STATUS NOT IN ('FERME' , 'ANNULE' , 'COMPLETE' , 'ATTDOC')")
#where2 = "STATUS NOT IN ('FERME' , 'ANNULE' , 'COMPLETE' , 'ATTDOC')"
#workorderSet.setWhere(where2)
if workorderSet.count() > 0:
for x in range(0,workorderSet.count()):
if workorderSet.getString("VDS_COMPLETE") == 1:
workorder = workorderSet.getMbo(x)
workorder.changeStatus("COMPLETE",MXServer.getMXServer().getDate(), u"Script d'automatisation", MboConstants.NOACCESSCHECK)
workorderSet.save()
workorderSet.close()
看起来你最大的两个错误是 1. 试图让你的布尔字段 (VDS_COMPLETE) 脱离集合(意思是脱离记录集合,就像整个 table)而不是关闭 MBO(意味着一个实际记录,table 中的一个条目)和 2. 从数据库中获取一组新数据(通过 MXServer 调用)这意味着使用以前保存的数据而不是获取您的数据集来自实际进行了未决更改的屏幕(请记住,非持久字段不会保存到数据库中)。
这个脚本还有一些其他问题,比如你在你的 for 循环中使用 "count()"(或者甚至不止一次)这是一个昂贵的操作,以及你目前的方式(虽然这可能是你调试的结果)在获取第一个工作订单之前没有过滤工作订单集(意味着你从 table 获得一个随机工作订单)然后根据该记录建立动态关系(而不是使用正常关系或完全跳过关系并仅使用 "where" 子句),即使该关系可能已经存在。
这是一个 Stack Overflow,更详细地描述了 Maximo 中的关系和 "where" 子句:Describe relationship in maximo 7.5
这个问题还有一些关于从屏幕获取数据与从数据库获取新数据的更多信息: