2

用包括后端数据库进程在内的所有细节描述 maximo 7.5 中的关系。

假设我在 maximo 7.5 资产管理中创建 owner_group 和 person_group "owner_group=:person_group" 之间的关系,那么这个查询的实际含义是什么。我对此感到很困惑。

你能解释一下数据库中的过程是什么吗?

4

2 回答 2

4

Maximo“关系”只是 SQL 语句的“where 子句”片段。您定义的“子对象”是将运行“where 子句”的表。

Maximo 的后端总是以“select * from”开头。然后它将附加您的子对象的表名(几乎总是对象名本身)。然后它附加“ where ”和您的关系文本。最后,Maximo 最终对数据库运行查询“select * from <object> where <relationship>”。然后它将结果加载到 <object> 的 MBOSet 中。

它与其说是连接,不如说是跳转/切换到另一个表。因为它不是连接,所以查询没有您开始的对象数据的上下文。为了能够使用来自您的原始对象的数据来过滤您的目标对象集,您可以使用字段绑定,即 where 子句片段的那些“冒号字段名”片段。Maximo 将对它找到的所有绑定进行查找和替换,将它们替换为来自起始对象的适当字段名的数据。这就是关系的“父对象”设置发挥作用的地方。这意味着 Maximo 只会在您从类型等于“父对象”的记录开始时运行此查询,以便它知道这些字段绑定的来源。

可能值得一提的是,关系必须从单个对象 (MBO) 开始,而不是一组对象 (MBOSet) 才能允许这项工作。但是,由于查询在其结果中返回一个或多个记录,因此您将始终从关系中返回一组对象 (MBOSet)。此外,因为这是在运行查询之前进行的查找和替换,Maximo 没有利用任何数据库查询计划缓存功能;每个查询看起来与数据库不同,并在执行之前重新解析。

例如,如果您想创建从资产到工作订单的关系以获取资产的所有未结工作订单,您将执行以下操作: 与 WORKORDER 的子对象创建关系,因为这是您想要获取的记录类型背部。您想要所有打开的工单,因此您的关系文本以“status = 'OPEN'”开头。您还只需要当前正在查看的资产的工作订单,这意味着您想使用当前对象中的数据,因此您需要使用字段绑定。在这种情况下,您要过滤其资产编号与您当前记录的资产编号相同的工作订单记录,这意味着您将“和资产编号=:资产编号”添加到您的关系文本/位置子句(给您“状态='OPEN'和资产编号= :assetnum" 为您的总关系字符串)。第一个不带冒号的assetnum 表示它是正常的查询文本,将按原样运行。带有冒号的第二个assetnum 告诉Maximo 这是一个需要替换的绑定。顺序无关紧要,只有冒号很重要。Maximo 将找到您当前对象 (ASSET) 的assetnum 字段,并将该字段的内容(比如assetnum“Blower0082”)放入查询中以代替“:assetnum”。在此特定资产上运行此定义关系的最终结果是 Maximo 对数据库运行以下查询并将任何结果加载到 WORKORDER MBOSet 中: select * from WORKORDER where status = 'OPEN' and assetsnum = 'Blower0082'; 带有冒号的第二个assetnum 告诉Maximo 这是一个需要替换的绑定。顺序无关紧要,只有冒号很重要。Maximo 将找到您当前对象 (ASSET) 的assetnum 字段,并将该字段的内容(比如assetnum“Blower0082”)放入查询中以代替“:assetnum”。在此特定资产上运行此定义关系的最终结果是 Maximo 对数据库运行以下查询并将任何结果加载到 WORKORDER MBOSet 中: select * from WORKORDER where status = 'OPEN' and assetsnum = 'Blower0082'; 带有冒号的第二个assetnum 告诉Maximo 这是一个需要替换的绑定。顺序无关紧要,只有冒号很重要。Maximo 将找到您当前对象 (ASSET) 的assetnum 字段,并将该字段的内容(比如assetnum“Blower0082”)放入查询中以代替“:assetnum”。在此特定资产上运行此定义关系的最终结果是 Maximo 对数据库运行以下查询并将任何结果加载到 WORKORDER MBOSet 中: select * from WORKORDER where status = 'OPEN' and assetsnum = 'Blower0082'; ) 到查询中代替 ":assetnum"。在此特定资产上运行此定义关系的最终结果是 Maximo 对数据库运行以下查询并将任何结果加载到 WORKORDER MBOSet 中: select * from WORKORDER where status = 'OPEN' and assetsnum = 'Blower0082'; ) 到查询中代替 ":assetnum"。在此特定资产上运行此定义关系的最终结果是 Maximo 对数据库运行以下查询并将任何结果加载到 WORKORDER MBOSet 中: select * from WORKORDER where status = 'OPEN' and assetsnum = 'Blower0082';

您的 owner_group = :person_group 的特定示例本身没有意义;还需要一个父对象(因此 Maximo 知道从哪里提取绑定数据以及何时允许执行此查询)和一个子对象(以便它知道从哪个表中选择)。我将假设它有一个 PERSONGROUP 的父对象和一个 WORKORDER 的子对象。由于“person_group”以冒号开头,Maximo 将用父对象的 person_group 字段的内容替换该字符串,因此 person_group 字段必须存在于父对象上。由于 owner_group 前面没有冒号,因此它是正常的 SQL 语法,因此该字段必须存在于您的子/目标对象上。这种关系将为您提供当前已加载的人员组记录所拥有的所有工作订单。假设 persongroup 是“管道工”,它将运行以下查询并返回管道工当前拥有的所有工单: select * from WORKORDER where owner_group = 'plumbers';

于 2015-03-19T14:43:33.860 回答
0

您可以将 Maximo 关系视为与 SQL 联接相同的术语。

在系统配置 > 平台配置 > 数据库配置中——每个对象都可以与子对象相关联。

例如,如果您的父对象是工单,我将创建一个名为 OWNERPERSON 的关系,其中子对象是 PERSON。

Where 子句personid = :owner意味着当子对象(PERSON)从 where 子句中带来结果时,personid = :owner可以显示相关数据。:owner是 WORKORDER 中的变量。

如果:ownerWORKORDER 中的值是,Chip_Drapeau那么您可以显示任何来自 PERSON 子对象的位置personid = Chip_Drepeau

希望这可以帮助。

在此处输入图像描述

于 2015-03-18T16:19:22.717 回答