属性规则可用于读取和编辑地理数据库中参与关系类的数据集的相关记录。 规则可以应用于参与关系类的要素类和表,这些关系类可包含附件和关联要素的注记。 属性规则还可用于从对关系中的源类与目标类的更新中截取编辑事件,即添加、移除或删除相关记录。 例如,当要素被添加到相关要素类时,实时计算属性规则可以更新一个属性字段。
通过关系类触发事件
实时属性规则在编辑事件(例如插入、更新和删除操作)发生时触发。 通过 ArcGIS AllSource 使用将新项添加到关系或将所选项添加到关系快捷菜单选项添加相关记录时,会触发多个编辑事件。
使用将新项添加到关系快捷菜单操作时,会发生以下情况:
- 在关系类目标表中,将创建一个空行。
- 在目标行上插入触发器。
- 在目标行上设置外键。
- 更新目标行上的触发器。
您也可以使用将所选项添加到关系和从关系中移除快捷菜单操作。
下表列出了通过比较 $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 AllSource 和 ArcGIS 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;
验证并评估关系类规则
例如,在电线杆(起点)要素类和检查(目的地)表之间设置了关系类。 每个电线杆必须至少记录一次或多次检查。
可以在此相关数据之间创建一对一 (1:1) 或一对多 (1:M) 关系类规则来完成此操作。 创建关系类规则后,可以使用以下脚本编写验证属性规则,该规则将应用于电线杆(原点)要素类,强制每个电线杆必须通过一项或多项检查://A validation rule that ensures each pole passes one or more inspections.
var fsInspections = FeatureSetByRelationshipClass($feature, "poles");
if (count(fsInspections) == 0) return false;
return true;
将此验证属性规则添加到数据后,评估过程会审查数据上的规则以确保遵循规则。 所使用的评估方法取决于规则类型和属性。
在用户指定的时间通过错误检查器视图或评估规则工具对验证规则进行评估。 在评估过程中,验证规则会创建错误要素,突出显示违反规则的要素。 可通过错误检查器来检查这些规则的错误要素。
注:
可以使用 FeatureSetByRelationshipName 或FeatureSetByRelationshipClass Arcade 函数来创作这些规则。 FeatureSetByRelationshipClass 允许您通过客户端的服务评估规则,需要 ArcGIS Pro 3.2 或更高版本,相关说明请参见读取相关记录部分。
要修改此属性规则以强制电线杆必须只有一次检查或没有检查,可以按如下方式重写脚本://A validation rule that ensures each pole has one or fewer inspections.
var fsInspections = FeatureSetByRelationshipClass($feature, "poles");
if (count(fsInspections) > 1 ) return false;
return true;
对数据创建并应用约束属性规则。 约束规则用于指定要素上允许的属性配置和一般关系。 与计算规则不同,约束规则不用于填充属性,而是用于确保要素满足特定条件,并在条件不符合时阻止编辑。
约束规则在编辑操作期间进行评估,触发插入、更新和删除等事件,并返回 true 或 false 结果,表示是否满足规则,如下所示:
- True - 满足所提供的脚本表达式,随即将创建要素。
- False - 不满足所提供的脚本表达式,因此不会创建要素。
创建和应用约束属性规则时,请密切注意编辑触发器的顺序。
例如,创建约束属性规则并将其应用于电线杆要素类,强制电线杆要素类中的每个杆必须至少存在一个检查事件。 如果约束属性规则设置为在插入时触发,例如添加新电线杆时,则无法创建电线杆。 在这种情况下,建议创建约束属性规则以在更新而不是插入时触发。
注:
可通过即用型规则 按钮访问可配置检查库,来支持创建约束和验证规则。 这适用于 ArcGIS Data Reviewer 许可。