Skip to content

Poly ItemType 多态建模

Poly ItemType(Polymorphic ItemType)用于把多个具体 ItemType 作为一组 poly sources 暴露给查询、 Item 属性或 Relationship 的 related type。它最有价值的场景,是“一个引用位置需要接受多种具体对象”。

适用版本

本文以 R24~R34 Programmer's Guide 的 Polymorphic ItemTypes Server Event Inheritance、 官方应用中的 poly source 用法,以及 Extended Classification 官方文档为基线。 旧版管理界面可能把关系页显示为 Morphae,新版文档或界面也常称 Poly Sources;以目标 Release 为准。


1. Poly ItemType 是统一入口,不是新实体

Poly ItemType 表达“这些来源可以在某些位置被当作一组使用”。 真实业务记录仍属于 PartDocument 等具体 ItemType。

因此:

  • 新增业务对象时,目标应是具体 poly source。
  • 生命周期、表单和业务规则主要仍在具体 ItemType 上设计。
  • 查询 Poly ItemType 可以返回不同来源的 Item。
  • 指向 Poly ItemType 的关系或 Item 属性可以选择不同来源对象。

不要把 Poly ItemType 描述成可直接保存公共业务数据的“抽象父表”。


2. 什么时候使用

需求是否适合 Poly ItemType
一个 Change Item 关系要关联 Part、Document、CAD适合
对多个来源执行统一搜索或选择适合
两个 ItemType 只是字段相似,但不会被共同引用通常不需要
希望把名称完全不同的字段自动映射成一列不适合,Poly 不提供任意字段映射
希望所有来源共享同一张数据库表不应以底层表结构推导方案

如果引用位置永远只允许一个具体类型,应直接指向该 ItemType,减少选择界面和包依赖复杂度。


3. 公共属性契约

Poly ItemType 上出现的属性必须能由每个 poly source 提供。 实践中应确保所有来源存在同名、兼容数据类型的 Property。

例如,统一搜索需要以下列:

Poly PropertyPartDocument
namenamename
item_numberitem_numberitem_number
statestatestate

如果 Document 只有 title、Part 只有 name,不要假设可以在 Morphae 关系上声明 title → name 映射。 应重新设计公共属性,或在各来源维护一个语义一致的公共字段。

修改顺序很重要

先让每个 poly source 具备公共 Property,再修改 Poly ItemType。 否则保存或包导入可能出现“property must be common to all sources”一类错误。


4. 建模步骤

4.1 定义公共契约

  1. 列出真正需要统一显示或查询的 Property。
  2. 核对每个来源的内部名称、数据类型、长度和数据源。
  3. 对不一致项决定统一字段、同步规则或放弃公共列。
  4. 先把公共 Property 部署到所有来源。

4.2 创建 Polymorphic ItemType

  1. 新建 ItemType,例如 z_Deliverable
  2. 将 Implementation Type 设为 Polymorphic。
  3. 保存后,在 Poly Sources / Morphae 关系中添加来源。
  4. 只添加已经满足公共属性契约的 ItemType。
  5. 保存并检查搜索界面可选择的来源。

4.3 作为关系目标

  1. 创建 RelationshipType,例如 z_Project Deliverable
  2. Source 指向业务容器 z_Project
  3. Related 指向 z_Deliverable Poly ItemType。
  4. 在测试 Project 中分别选择两个具体来源。

Poly ItemType 让一个关系接受多种 related Item;关系本身仍可以保存数量、角色、顺序等自己的属性。


5. AML 查询边界

可以使用 Poly ItemType 做统一 get

xml
<AML>
  <Item type="z_Deliverable"
        action="get"
        select="id,item_number,name" />
</AML>

返回项可能来自不同具体 ItemType。消费端必须读取结果 Item 的实际 type,不能假设全部是同一种来源。

当需要新增、编辑、删除或执行来源专属 action 时,先确定具体 ItemType,再对该来源发起操作。 不要把对 Poly 的 get 能工作,外推为所有 action 都能透明分派。

只选择公共字段

统一查询优先 select 明确的公共 Property。 来源专属字段应在识别实际 type 后再查询,避免空值与难以解释的网格列。


6. Server Event 继承

官方 Programmer's Guide 允许在 Polymorphic ItemType 上定义 Server Event。 其 poly sources 会继承该事件处理器;每个来源发生对应事件时,处理器会执行。

这适合真正跨来源一致的规则,例如统一审计前置校验。

实施前必须确认:

  • Method 只读取所有来源都具备的公共 Property。
  • 不与来源自身事件重复执行相同逻辑。
  • serverEvents="0" 的行为与 Required Server Event 设置已验证。
  • 批量请求下 Server Event Version 行为符合目标 Release。
  • 失败与回滚场景已测试。

在 ItemType 的 Inherited Server Events 区域可以检查来源继承到的事件。


7. Poly 与 Extended Classification

Poly ItemType 也可能参与 xProperty 查询,但要注意来源一致性。 官方 Extended Classification 文档明确指出:如果某个 xProperty 存在于 Poly ItemType、却不存在于某个 poly source, 对该来源请求该 xProperty 会返回 Null。

因此不要用 Poly 绕过分类模型:

  1. 明确 xProperty 应定义在 Poly、来源还是分类树。
  2. 对每个来源分别测试有值、无值和无定义三种情况。
  3. 查询结果同时记录实际 ItemType。
  4. 升级或重命名 poly source 后重新验证 xClassification Tree。

8. 可复现实验:两个来源、一个关系

8.1 准备

  1. 创建 z_Test_Partz_Test_Document
  2. 两者都添加 item_numbername,类型保持一致。
  3. 各创建一条测试数据。
  4. 创建 z_Test_Deliverable Poly ItemType并添加两个来源。

8.2 验证查询

  1. z_Test_Deliverable 执行上节 AML。
  2. 断言结果包含两条数据。
  3. 记录每条 Item 的实际 type
  4. item_number 条件分别命中两个来源。

8.3 验证关系

  1. 创建 z_Test_Project 和指向 Poly 的 RelationshipType。
  2. 在同一个 Project 中分别关联两个来源 Item。
  3. 保存、重新打开并确认两条关系仍指向正确具体类型。
  4. 用两个不同权限账号验证来源 Item 的可见性。

8.4 验证失败路径

  1. 在 Poly 上尝试增加一个只存在于其中一个来源的测试 Property。
  2. 记录平台给出的验证错误。
  3. 撤销修改,先向另一来源添加同名兼容 Property。
  4. 再次保存并导出包,验证部署顺序。

测试完成后删除整个 z_Test_* 测试包,不直接清理内部数据库表。


9. 打包与升级

Package Definition 至少应包含:

  • Poly ItemType。
  • 新增的 poly source ItemType(若非目标环境已有)。
  • 所有来源新增的公共 Properties。
  • Morphae / Poly Sources 关系。
  • 指向 Poly 的 Property 或 RelationshipType。
  • Poly 上的 Server Event 及 Method。

imports.mf 中先导入来源与公共属性,再导入 Poly 及其引用。 使用 Thorough 模式在干净数据库演练,避免目标环境因旧版公共属性不一致而失败。


10. 常见错误

宣称 Poly 一定对应 SQL View 或 UNION ALL

这是实现层推断,不是稳定的建模契约。不要直接修改数据库对象,也不要用其名称编写业务 SQL。

宣称公共属性可以任意映射

来源需要提供共同属性。名称或类型不一致时应重新建模,而不是虚构映射步骤。

在 Poly 上直接新增业务记录

新增应指向具体 poly source;Poly 主要作为统一引用和查询入口。

认为 Poly 权限覆盖所有来源

权限组合必须用不同来源和业务 Identity 实测,不能以 Poly 搜索页的显示结果推断服务器授权。

忘记继承 Server Event

Poly 上的事件会影响所有来源。新增 poly source 前要检查 Inherited Server Events。


11. 官方依据

文档最后核验:2026-08-13。

本站内容仅供学习与参考