在 WORK ORDER 中填充自定义 X 和 Y 字段
Populate custom X & Y fields in WORKORDER
更新:
在 Maximo 7.6.1.1 中,我在这些表中有自定义字段:
- 工单:
X
& Y
- 资产:
X
& Y
- 地点:
X
& Y
我想使用以下逻辑填充 WORKORDER
中的 X
和 Y
字段。
(逻辑与 auto-create spatial search 中的逻辑相似但略有不同。)
At a high level:
- If exists, use WOSERVICEADDRESS.LATITUDEY & LONGITUDEX
- Else, use ASSET.X & Y
- Else, use LOCATIONS.X & Y
提议的伪代码:
Scenario: A user is creating a new work order or editing an existing work order.
When the WO is saved:
01 1. In the related WOSERVICEADDRESS table:
02
03 if WOSERVICEADDRESS.LATITUDEY gets edited:
04
05 if WOSERVICEADDRESS.LATITUDEY is not null:
06 then update WORKORDER.X & Y with WOSERVICEADDRESS.LATITUDEY & LONGITUDEX
07
08 #Handle the scenario where the WOSERVICEADDRESS.LATITUDEY is changed to null:
09
10 elseif WORKORDER.ASSETNUM is not null:
11 then update WORKORDER.X & Y with the related values in ASSET.X & Y
12
13 elseif WORKORDER.LOCATION is not null:
14 then update WORKORDER.X & Y with the related values in LOCATIONS.X & Y
15
16 2. In the WORKORDER table:
17
18 (if WORKORDER.ASSETNUM gets edited or if WORKORDER.LOCATION gets edited) and if WOSERVICEADDRESS.LATITUDEY is null
19
20 then:
21 if WORKORDER.ASSETNUM is not null:
22 then update WORKORDER.X & Y with the related values in ASSET.X & Y
23
24 elseif WORKORDER.LOCATION is not null:
25 then update WORKORDER.X & Y with the related values in LOCATIONS.X & Y.
有没有办法执行此 Jython 自动化脚本(不会减慢工单应用程序的速度)?
(关键字:Maximo Spatial)
对于#2 和#3,你可以使用这样的东西:
- 在工单对象上创建自动脚本 - 保存事件
- 创建两个变量:assetnum 和 location 并将它们绑定到 assetnum 和 location 字段
- 使用 "var_modified" 标志来确定变量是否更新:
x = ""
y = ""
if assetnum_modified or location_modified:
if location:
x = mbo.getString("ASSET.LONGITUDEX")
y = mbo.getString("ASSET.LATITUDEY")
elif assetnum:
x = mbo.getString("ASSET.LONGITUDEX")
y = mbo.getString("ASSET.LATITUDEY")
woaddr = mbo.getMboSet("SERVICEADDRESS").getMbo(0)
if woaddr.getString("LONGITUDEX"):
x = woaddr.getString("LONGITUDEX")
y = woaddr.getString("LATITUDEY")
mbo.setValue("LONGITUDEX", x)
mbo.setValue("LATITUDEY", y)
对于 WO 服务地址,它有点棘手,因为它是不同的 table。如果性能是您系统的一个大问题,解决方案可能是在 WOSERVICEADDRESS 对象上创建一个单独的脚本,并根据您的规则
处理 "Add/Update" 和 "Delete" 事件的逻辑
根据您希望解决方案更明确地从另一个问题的答案、此处的另一个答案、此处另一个答案的评论以及更新的要求拼凑而成的想法,我创建了一个合并所有这些。我根本没有对此进行测试,某些关系、事件条件或通过 API 的确切跃点可能不正确。这还假设如果 X 或 Y 在一个优先的位置填充但另一个不是,您仍然希望使用该位置的填充值和空白值。
因为它们在两个不同的对象上,所以处理服务地址更新的效率会稍低,因为这需要自己处理。
首先,在 SERVICEADDRESS 对象上创建一个自动化脚本启动点。在 "add" 和 "update" 上将其设置为 运行 并执行那些 "before save"。添加:longitudex != :$old_longitudex or :latitudey != :$old_latitudey
的对象事件条件。使该脚本如下:
# Assume this change is being made from the UI, so the work order will be the owner of the
# SERVICEADDRESS object. This way your modifications can be reflected on screen and not cause a
# refetch error if the user also modified work order in this same transaction.
wo = mbo.getOwner()
if wo is not None:
wo.setValue("X", mbo.getString("LONGITUDEX"))
wo.setValue("Y", mbo.getString("LATITUDEY"))
如果服务地址字段发生变化,这会负责更新工单的字段。他们将始终覆盖工作订单上的内容,以便按照您的要求采取先例。如果有人清除这些值然后保存,这也会尝试清除工作订单上的值,如果实际上有资产或位置 x 和 y,则可能不需要这样做。如果不删除下一个脚本的事件条件,您将无法真正处理它,如果您想像您说的那样经常避免 运行ning,您真的不想这样做。
其次,在 WORKORDER 对象上创建一个自动化脚本启动点。在 "add" 和 "update" 上将其设置为 运行 并执行那些 "before save"。添加:asset != :$old_asset or :location != :$old_location
的对象事件条件。使该脚本如下:
saddr = mbo.getMboSet("SERVICEADDRESS").getMbo(0)
if saddr is None or (saddr.getString("LONGITUDEX") == "" and saddr.getString("LATITUDEY") == ""):
asset = mbo.getMboSet("ASSET")
location = mbo.getMboSet("LOCATION")
if asset is not None and (asset.getString("X") != "" or asset.getString("Y") != ""):
mbo.setValue("X", asset.getString("X"))
mbo.setValue("Y", asset.getString("Y"))
else if location is not None and (location.getString("X") != "" or location.getString("Y") != ""):
mbo.setValue("X", location.getString("X"))
mbo.setValue("Y", location.getString("Y"))
只要服务地址上没有 x 或 y,此脚本负责在资产或位置中的任何一个被修改时更新工作单。如果事实证明资产或位置上都没有 x 或 y,它将跳过设置工作订单的值,从而保留任何已经存在的值(虽然应该什么都没有,因为服务地址不会有值要么,如果它走到这一步)。
自动化脚本的替代方法是使用属性 formulas:
NVL(SERVICEADDRESS$LatitudeY,NVL(ASSET$Y,NVL(LOCATION$Y,"")))
NVL(SERVICEADDRESS$LongitudeX,NVL(ASSET$X,NVL(LOCATION$X,"")))
我猜测是每次保存WO时的公式运行,也就是说这个选项不符合题中的要求。
但公式非常简单,可能不会影响性能,因此它们可能是一个可行的选择。
此处提供有关 Maximo 公式的更多信息:Formulas 1 (PDF) and Formulas 2 (PDF)。
注意:我无法弄清楚 how to return null(如果所有搜索字段均为空)。
更新:
在 Maximo 7.6.1.1 中,我在这些表中有自定义字段:
- 工单:
X
&Y
- 资产:
X
&Y
- 地点:
X
&Y
我想使用以下逻辑填充 WORKORDER
中的 X
和 Y
字段。
(逻辑与 auto-create spatial search 中的逻辑相似但略有不同。)
At a high level:
- If exists, use WOSERVICEADDRESS.LATITUDEY & LONGITUDEX
- Else, use ASSET.X & Y
- Else, use LOCATIONS.X & Y
提议的伪代码:
Scenario: A user is creating a new work order or editing an existing work order.
When the WO is saved:
01 1. In the related WOSERVICEADDRESS table:
02
03 if WOSERVICEADDRESS.LATITUDEY gets edited:
04
05 if WOSERVICEADDRESS.LATITUDEY is not null:
06 then update WORKORDER.X & Y with WOSERVICEADDRESS.LATITUDEY & LONGITUDEX
07
08 #Handle the scenario where the WOSERVICEADDRESS.LATITUDEY is changed to null:
09
10 elseif WORKORDER.ASSETNUM is not null:
11 then update WORKORDER.X & Y with the related values in ASSET.X & Y
12
13 elseif WORKORDER.LOCATION is not null:
14 then update WORKORDER.X & Y with the related values in LOCATIONS.X & Y
15
16 2. In the WORKORDER table:
17
18 (if WORKORDER.ASSETNUM gets edited or if WORKORDER.LOCATION gets edited) and if WOSERVICEADDRESS.LATITUDEY is null
19
20 then:
21 if WORKORDER.ASSETNUM is not null:
22 then update WORKORDER.X & Y with the related values in ASSET.X & Y
23
24 elseif WORKORDER.LOCATION is not null:
25 then update WORKORDER.X & Y with the related values in LOCATIONS.X & Y.
有没有办法执行此 Jython 自动化脚本(不会减慢工单应用程序的速度)?
(关键字:Maximo Spatial)
对于#2 和#3,你可以使用这样的东西: - 在工单对象上创建自动脚本 - 保存事件 - 创建两个变量:assetnum 和 location 并将它们绑定到 assetnum 和 location 字段 - 使用 "var_modified" 标志来确定变量是否更新:
x = ""
y = ""
if assetnum_modified or location_modified:
if location:
x = mbo.getString("ASSET.LONGITUDEX")
y = mbo.getString("ASSET.LATITUDEY")
elif assetnum:
x = mbo.getString("ASSET.LONGITUDEX")
y = mbo.getString("ASSET.LATITUDEY")
woaddr = mbo.getMboSet("SERVICEADDRESS").getMbo(0)
if woaddr.getString("LONGITUDEX"):
x = woaddr.getString("LONGITUDEX")
y = woaddr.getString("LATITUDEY")
mbo.setValue("LONGITUDEX", x)
mbo.setValue("LATITUDEY", y)
对于 WO 服务地址,它有点棘手,因为它是不同的 table。如果性能是您系统的一个大问题,解决方案可能是在 WOSERVICEADDRESS 对象上创建一个单独的脚本,并根据您的规则
处理 "Add/Update" 和 "Delete" 事件的逻辑根据您希望解决方案更明确地从另一个问题的答案、此处的另一个答案、此处另一个答案的评论以及更新的要求拼凑而成的想法,我创建了一个合并所有这些。我根本没有对此进行测试,某些关系、事件条件或通过 API 的确切跃点可能不正确。这还假设如果 X 或 Y 在一个优先的位置填充但另一个不是,您仍然希望使用该位置的填充值和空白值。
因为它们在两个不同的对象上,所以处理服务地址更新的效率会稍低,因为这需要自己处理。
首先,在 SERVICEADDRESS 对象上创建一个自动化脚本启动点。在 "add" 和 "update" 上将其设置为 运行 并执行那些 "before save"。添加:longitudex != :$old_longitudex or :latitudey != :$old_latitudey
的对象事件条件。使该脚本如下:
# Assume this change is being made from the UI, so the work order will be the owner of the
# SERVICEADDRESS object. This way your modifications can be reflected on screen and not cause a
# refetch error if the user also modified work order in this same transaction.
wo = mbo.getOwner()
if wo is not None:
wo.setValue("X", mbo.getString("LONGITUDEX"))
wo.setValue("Y", mbo.getString("LATITUDEY"))
如果服务地址字段发生变化,这会负责更新工单的字段。他们将始终覆盖工作订单上的内容,以便按照您的要求采取先例。如果有人清除这些值然后保存,这也会尝试清除工作订单上的值,如果实际上有资产或位置 x 和 y,则可能不需要这样做。如果不删除下一个脚本的事件条件,您将无法真正处理它,如果您想像您说的那样经常避免 运行ning,您真的不想这样做。
其次,在 WORKORDER 对象上创建一个自动化脚本启动点。在 "add" 和 "update" 上将其设置为 运行 并执行那些 "before save"。添加:asset != :$old_asset or :location != :$old_location
的对象事件条件。使该脚本如下:
saddr = mbo.getMboSet("SERVICEADDRESS").getMbo(0)
if saddr is None or (saddr.getString("LONGITUDEX") == "" and saddr.getString("LATITUDEY") == ""):
asset = mbo.getMboSet("ASSET")
location = mbo.getMboSet("LOCATION")
if asset is not None and (asset.getString("X") != "" or asset.getString("Y") != ""):
mbo.setValue("X", asset.getString("X"))
mbo.setValue("Y", asset.getString("Y"))
else if location is not None and (location.getString("X") != "" or location.getString("Y") != ""):
mbo.setValue("X", location.getString("X"))
mbo.setValue("Y", location.getString("Y"))
只要服务地址上没有 x 或 y,此脚本负责在资产或位置中的任何一个被修改时更新工作单。如果事实证明资产或位置上都没有 x 或 y,它将跳过设置工作订单的值,从而保留任何已经存在的值(虽然应该什么都没有,因为服务地址不会有值要么,如果它走到这一步)。
自动化脚本的替代方法是使用属性 formulas:
NVL(SERVICEADDRESS$LatitudeY,NVL(ASSET$Y,NVL(LOCATION$Y,"")))
NVL(SERVICEADDRESS$LongitudeX,NVL(ASSET$X,NVL(LOCATION$X,"")))
我猜测是每次保存WO时的公式运行,也就是说这个选项不符合题中的要求。
但公式非常简单,可能不会影响性能,因此它们可能是一个可行的选择。
此处提供有关 Maximo 公式的更多信息:Formulas 1 (PDF) and Formulas 2 (PDF)。
注意:我无法弄清楚 how to return null(如果所有搜索字段均为空)。