属性规则和关系类

属性规则可用于读取和编辑地理数据库中参与关系类的数据集的相关记录。 规则可以应用于参与关系类的要素类和表,这些关系类可包含附件和关联要素的注记。 属性规则还可用于从对关系中的源类与目标类的更新中截取编辑事件,即添加、移除或删除相关记录。 例如,当要素被添加到相关要素类时,实时计算属性规则可以更新一个属性字段。

通过关系类触发事件

实时属性规则在编辑事件(例如插入、更新和删除操作)发生时触发。 通过 ArcGIS Pro 使用将新项添加到关系将所选项添加到关系快捷菜单选项添加相关记录时,会触发多个编辑事件。

使用将新项添加到关系快捷菜单操作时,会发生以下情况:

  • 在关系类目标表中,将创建一个空行。
    • 在目标行上插入触发器。
  • 在目标行上设置外键。
    • 更新目标行上的触发器。
当您在包含更新触发事件的目标表上添加属性规则时,规则将捕获外键并查询源表中相关联的行。

您也可以使用将所选项添加到关系从关系中移除快捷菜单操作。

下表列出了通过比较 $originalFeature.key 和 $feature.key 可针对更新事件区分的特定函数。

函数事件ArcGIS Arcade 表达式

将要素添加到关系

更新

Isempty($originalfeature.key) == true And isempty($feature.key) == false

将所选要素添加到关系

更新

Isempty($originalfeature.key) == true And isempty($feature.key) == false

从关系中移除要素

更新

Isempty($originalfeature.key) == false And isempty($feature.key) == true

删除对相关记录执行的操作

删除

读取相关记录

使用关系类时,您可以使用 Arcade 函数读取相关记录,这些函数可获取输入要素并返回相关记录。

  • FeatureSetByRelationshipName - 运行仅限于服务器上下文。 将此函数用于属性规则时,请确保从应用程序评估中排除选项已设置为真。
  • FeatureSetByRelationshipClass - 支持在服务器和客户端侧运行。 在编辑内容发送到数据源之前,使用此函数的规则在应用程序中以本地方式运行(例如 ArcGIS ProArcGIS Maps SDKs for Native Apps)。

您也可以通过 FeatureSetByName Arcade 函数和对外键应用过滤器来读取相关记录。

使用 FeatureSetByName Arcade 函数读取关系类的相关记录。

在参与与检查表的一对多关系类的电线杆要素类中的 InspectionCount 字段上创建计算规则FeatureSetByName 函数可用于直接读取检查等级并检索更新时的相关记录。 使用此 Arcade 函数需要了解关系类字段。 对于此关系类,原始主键是电线杆要素类的 globalID 字段,原始外键是检查独立表的 poleguid 字段。

//A calculation rule that returns the count of a pole inspection records.
//When a pole feature is updated, the calculation rule reads all its related inspections records from the comments field and returns the total inspection count for that feature. 

Var fs = FeatureSetByName($datastore, “Inspection”, [“comments”], false)
Var poleGuid = $feature.poleguid 
Var fsinspected = Filter(fs, “POLEGUID= @poleguid”);
Return count(fsinspected)

使用 FeatureSetByRelationShipName Arcade 函数读取关系类的相关记录。

可以使用 FeatureSetRelationshipName 函数重写用于读取关系类的相关记录的相同脚本。 使用此函数,您不必知道外键,只需要知道关系名称,pole_inspection。

警告:

使用此函数创建属性规则时,请确保从应用程序评估中排除选项已设置为真。

//A calculation rule that returns the count of a pole inspection records.
//When a pole feature is updated, the calculation rule reads all its related inspections records from the comments field and returns the total inspection count for that feature.

Var fsinspected = FeatureSetByRelationshipName($feature, “pole_inspection”, [“comments”], false)
Return count(fsinspected)

使用 FeatureSetByRelationshipClass Arcade 函数读取关系类的相关记录。

可以使用 FeatureSetByRelationshipClass 函数重写用于从关系类读取相关记录的相同脚本。 使用此函数,您不必知道外键,只需要知道关系名称,pole_inspection。 该函数支持服务器端和客户端执行,因此使用该函数的属性规则可以在应用程序本地执行。

//A calculation rule that returns the count of a pole inspection records.
//When a pole feature is updated, the calculation rule reads all its related inspections records from the comments field and returns the total inspection count for that feature.

Var fsinspected = FeatureSetByRelationshipClass ($feature, “pole_inspection”, [“comments”], false)
Return count(fsinspected)

创建、更新和删除相关记录

还可以基于字典返回内容使用计算规则编辑关系类中的相关记录。

此处是一个创建计算规则的示例,该计算规则可创建一个相关记录。 当用户更新电线杆注释字段时,编辑字典关键字用于创建检查记录。 同样,您可以更新或删除相关记录。 有关详细信息,请参阅属性规则字典关键字

在更新编辑时为关系类添加新的相关记录。

当用户更新电线杆注释字段时,使用计算规则来创建新的相关记录。 在此表达式中,如果注释字段发生更改,则使用编辑字典关键字创建新的检查记录。 同样,您可以更新或删除相关记录。 有关详细信息,请参阅属性规则字典关键字

//A calculation rule that triggers on an update event when the pole comment field is edited. 
//The expression first checks if the comment field changed and creates a new related record.

If ($originalfeature.comment != $feature.comment)
{ 
    Return {
                 “edit”: [{
   “className”: “inspection”,
   “adds”: [{ “attributes”: { “comments”: $feature.comment } }] 
}] 

}
Return;