单一字段,多重行为:从一个 Maximo 字段实现动态查找和自由文本


在 Maximo实施中,会遇到这样一种情况:您有一系列问题,可能用于供应商报价,每个问题都需要不同类型的答案。有些需要是/否下拉菜单。有些需要自定义值列表。有些只是自由文本。
本能的反应通常是为每种类型创建一个单独的字段:一个带有YORN域的字段,另一个带有自定义域的字段,还有一个纯文本字段。这虽然可行,但意味着您的数据模型会随着每种新问题类型的增加而膨胀,并且您的屏幕布局每次都需要更新。
在这篇博客中,我们将介绍一种不同的方法:一个单个的VALUE字段,它会根据所回答的问题动态改变其行为——自由文本、是/否查找、是/否/不适用查找,或自定义域。无需更改屏幕布局。无需新增字段。只需两个小型自动化脚本。
本例的背景是一个基于自定义 Maximo 对象构建的问卷,包含三个关键字段:
核心思想: VALUE字段在应用程序设计器中配置为不带静态域的纯文本框。它是否成为自由文本字段或特定查找字段,由DATATYPE字段在运行时决定,并由两个自动化脚本驱动。
问题在 ALN 域中维护。每个条目使用两个字段:
在特定状态更改时,ALN 域条目的 VALUE 字段被复制到自定义对象的 QUESTION 字段中,DESCRIPTION 字段被复制到自定义对象的 DATATYPE 字段中。具体的触发器将取决于您的需求。
以下是数据类型代码以及每个代码对 VALUE 答案字段的含义:

强大之处在于: 添加新的自由文本问题或使用现有查找类型(FNSYN、FNSYNNA、FNSDESKTOP)的问题,只需在 ALN 域中添加新行即可。无需更改代码,无需更改屏幕。

在 Application Designer 中,VALUE 字段作为标准文本框添加到屏幕上。关键在于, 没有静态查找分配给它。
这至关重要。如果静态分配了查找,它将覆盖脚本。该字段必须留作空白画布,以便两个自动化脚本在运行时拥有完全控制权。
两个 Maximo 自动化脚本附加到自定义对象上的 VALUE 属性。它们共同处理完整的查找生命周期。
脚本名称:IBM.CUSTOMOBJECT.VALUE.INI
此脚本在记录加载时触发。它的作用很简单:如果 DATATYPE 是已识别的查找类型之一,它会将 lookupname 设置为 "valuelist",以激活 VALUE 字段上的查找图标。如果数据类型为 null 或无法识别,则不进行任何设置,该字段将保持为纯自由文本。
# Script : IBM.CUSTOMOBJECT.VALUE.INI
# Trigger : Attribute Initialization — VALUE attribute
# Purpose : If this question requires a lookup, activate the valuelist control.
if mbo.getString("DATATYPE") in ["FNSYN", "FNSDESKTOP", "FNSYNNA"]:
lookupname = "valuelist"
# If DATATYPE is null or unrecognised, no lookupname is set —
# VALUE renders as a plain free-text box. 脚本名称:IBM.CUSTOMOBJECT.VALUE.RL
当用户点击 VALUE 字段上的查找图标时,此脚本会触发。它读取 DATATYPE 并将其映射到正确的 ALN 域,告知 Maximo 要查询哪个对象、要应用哪个 WHERE 子句以及要映射回哪些键。
# Script : IBM.CUSTOMOBJECT.VALUE.RL
# Trigger : Retrieve lookup — VALUE attribute
# Purpose : Map the DATATYPE to the correct ALN domain.
if mbo.getString("DATATYPE") == "FNSYN":
relationObject = "ALNDOMAIN"
relationWhere = "domainid = 'YORN' and value=:value"
listWhere = "domainid = 'YORN'"
srcKeys = ["value"]
targetKeys = ["value"]
elif mbo.getString("DATATYPE") == "FNSYNNA":
relationObject = "ALNDOMAIN"
relationWhere = "domainid = 'YNNA' and value=:value"
listWhere = "domainid = 'YNNA'"
srcKeys = ["value"]
targetKeys = ["value"]
elif mbo.getString("DATATYPE") == "FNSDESKTOP":
relationObject = "ALNDOMAIN"
relationWhere = "domainid = 'FNSDESKTOP' and value=:value"
listWhere = "domainid = 'FNSDESKTOP'"
srcKeys = ["value"]
targetKeys = ["value"]
模式说明: 此示例对所有查找都使用 ALNDOMAIN。对于非 ALN 域查找(数字域、表域),relationObject 和键映射将有所不同。总体模式保持不变——只有目标会改变。

大多数新问题无需任何代码更改——只需在 ALN 域中添加一行即可。唯一的例外是当您需要一个脚本从未见过的新查找域时。在这种情况下:
完成后,任何将来使用该数据类型的问题都将自动选择正确的查找,无需进一步更改。
让一个字段服务于多种用途是一种整洁、易于维护的设计模式。通过将 DATATYPE 作为运行时控制信号,并将所有逻辑集中在两个脚本中,该解决方案保持易于理解且易于扩展。
关键要点是: 你不需要为每种新的问题类型都创建一个新字段。 你需要一个结构良好的 ALN 域、一个控制字段,以及两个知道如何处理它的脚本。
Discover everything you need to know to modernize your asset management strategy.
Inside, you’ll learn:

ActiveG, BPD Zenith, EAM Swiss, InterPro Solutions, Lexco, Peacock Engineering, Projetech, Sharptree, and ZNAPZ have united under one brand: Naviam.
You’ll be redirected to the most relevant page at Naviam.io in a few seconds — or you can
go now.