Skip to content

RelationshipType 建模与验证

RelationshipType 不只是“父表与子表的一条线”。一条 Aras 关系同时涉及三个对象:Source Item、承载关系属性的 Relationship Item,以及可选的 Related Item。分清三者,才能正确设计 BOM、文档清单、人员分配和评论明细。

本章为 acme_equipment 增加文档关系。每一行可以指向一份 Document,并在关系本身保存用途说明。

适用范围

  • 配置步骤以 R31 原厂培训的 Relationship 单元为基线。
  • AML 的 Relationships 结构在 11 SP9 到 R35 均有官方资料支持。
  • 网格按钮、页签对象和客户端 DOM 会随 Release 变化,不属于本章的数据模型契约。

三个对象

text
acme_equipment             Source Item
└─ acme_equipment_document Relationship Item
   ├─ acme_usage           关系自己的 Property
   └─ related_id ─────────> Document (Related Item)
对象回答的问题常见属性
Source Item这组明细属于谁?设备编号、名称
Relationship Item两者如何关联?数量、顺序、用途、备注
Related Item被关联的对象是谁?文档编号、名称、版本

先判断是否真的需要 RelationshipType

需求建议模型
每个设备最多引用一个制造商Item 类型 Property
每个设备可关联多份文档RelationshipType
关联行还要保存“用途”RelationshipType
只需要多行备注,不指向独立 ItemNull Relationship
父子都是同一个 ItemType,例如 BOMCircular Relationship

若目标对象只会有一个,Relationship Grid 往往比 Item Property 更复杂。先从业务基数和关系行是否需要属性出发,而不是从界面想放一个页签出发。

第 1 步:创建关系定义

acme_equipment 的 RelationshipTypes 配置页签中创建关系:

  1. Related ItemType 选择 Document
  2. 关系内部名称使用 acme_equipment_document
  3. 页签 Label 使用“相关文档”。
  4. 保存并把新建的 RelationshipType、Relationship ItemType 及依赖加入 Package Definition。

不同版本的操作按钮可能叫 Add ItemType、Create RelationshipType 或通过选择对话框完成。以生成结果为验证标准:关系定义的 Source 为 acme_equipment,Related 为 Document

第 2 步:给关系行增加属性

打开生成的 Relationship ItemType,新增:

NameType用途
acme_usageString例如“操作手册”“校准报告”

这个值属于“设备—文档”这一连接,而不属于 Document 本身。同一份 Document 被不同设备引用时,可以有不同用途。

第 3 步:配置关系页签

确认 Source Item 的 Form 能显示关系页签,并选择适合业务的新增方式:

  • 只允许选择已有 Related Item;
  • 允许创建新的 Related Item;
  • 两者都允许。

选项名称随版本可能不同。若创建 Related Item 涉及独立权限或审批,优先限制为选择已有对象,避免在父 Item 取消保存时留下没有业务归属的记录。

第 4 步:用界面验证

  1. 打开 EQ-0001 并进入编辑状态。
  2. 在“相关文档”页签选择一份测试 Document。
  3. acme_usage 设为“操作手册”。
  4. 保存父 Item,关闭后重新打开。
  5. 确认关系行、用途和文档链接都仍存在。

如果关系网格可见但按钮不可用,分别检查父 Item 锁、Relationship ItemType 的 Can Add/Permission、Related Item 的 Discover/Get,而不是只改客户端按钮。

用 AML 查询关系

查询设备及其文档关系:

xml
<AML>
  <Item type="acme_equipment" action="get"
        select="id,item_number,name">
    <item_number>EQ-0001</item_number>
    <Relationships>
      <Item type="acme_equipment_document" action="get"
            select="id,acme_usage,related_id">
        <related_id>
          <Item type="Document" action="get"
                select="id,item_number,name" />
        </related_id>
      </Item>
    </Relationships>
  </Item>
</AML>

related_id 的嵌套 Item 控制返回的 Related Item 属性。不要为了方便使用无限制的 select="*";关系树一深,响应会快速膨胀。

用 AML 新增关系

已知 Source 与 Related ID 时,可以把关系放在 Source 的 Relationships 中:

xml
<AML>
  <Item type="acme_equipment" action="edit" id="EQUIPMENT_ID">
    <Relationships>
      <Item type="acme_equipment_document" action="add">
        <related_id>DOCUMENT_ID</related_id>
        <acme_usage>操作手册</acme_usage>
      </Item>
    </Relationships>
  </Item>
</AML>

提交前必须替换两个占位 ID,并让当前用户拥有对应权限。调用端还要检查 isError();HTTP 成功不代表 AML 业务操作成功。

IOM 构建同一关系的写法
csharp
Item equipment = inn.newItem("acme_equipment", "edit");
equipment.setID(equipmentId);

Item rel = inn.newItem("acme_equipment_document", "add");
rel.setProperty("related_id", documentId);
rel.setProperty("acme_usage", "操作手册");
equipment.addRelationship(rel);

Item result = equipment.apply();
if (result.isError())
{
    return result;
}

return result;

三类常见关系

Direct Relationship

Source 与 Related 是不同 ItemType,如设备关联文档。这是本章实验使用的模式。

Null Relationship

没有 Related Item,关系行只保存自身属性。例如设备的检查记录明细。此时仍要设计可识别的行属性、权限和排序,不要创建一张完全不可读的空网格。

Circular Relationship

Source 与 Related 是同一个 ItemType,例如 Part BOM。循环模型不代表可以无界递归查询;应设置业务层循环校验和查询深度限制。参见 AML 递归查询

Fixed、Float 与版本行为

当 Related ItemType 使用版本控制时,关系究竟固定在某一代,还是跟随到当前代,是业务语义而不是 UI 偏好。配置字段和最终解析行为可能受 RelationshipType、ItemType 及 Release 影响,因此:

  1. 先写出业务例子,例如“已发布 BOM 必须固定到当时子件版本”。
  2. 在目标 Release 建立两代测试 Related Item。
  3. 升版后重新查询 related_id 和显示结果。
  4. 将验证结果记录到项目版本矩阵,再决定配置。

不要只凭 behavior 文本值推断所有上下文。

关系上下文不等于数据库真值

Server Event 中的 this.getRelationships() 只表示当前请求携带的 Relationship 内容。如果一次 edit 只改了表头,请求可能没有带任何关系行。需要校验数据库完整集合时,应按 Source ID 单独查询。

这也是旧代码中“明细明明存在,服务端却判断为空”的常见根因。

客户端网格代码的边界

用户样例中的 relTabbar、固定 iframe ID、grid.items_Experimental 和轮询 DOM 属于 Classic Client 或私有实现。它们最多用于有明确版本锁定的兼容层,不能代替:

  • Relationship ItemType 的 Permission 与 Server Event;
  • apply() 错误的处理;
  • 父 Item 取消时的事务/孤儿数据设计;
  • 升级后的回归测试。

参见 关系页签与表单代码审查

验证清单

  • [ ] Source、Relationship、Related 的职责清楚
  • [ ] 关系自身属性放在 Relationship ItemType
  • [ ] Related Item 的 Discover/Get 已用普通账号验证
  • [ ] 新增关系、重复关系和删除关系都有明确规则
  • [ ] 版本行为已用两代数据实测
  • [ ] AML 使用有限 select 和有限递归深度
  • [ ] 服务端校验没有把请求上下文误当完整数据库集合
  • [ ] 客户端显隐/禁用没有被当作安全控制

下一步

依据

  • Aras Training, Configuring Solutions Student Guide Innovator R31, Relationship 单元
  • Aras Innovator 35 Programmer's Guide
  • Aras 11 SP9《基本开发详解》,AML 与 Relationship Grid 单元(仅用于历史语义对照)

本站内容仅供学习与参考