关联表的属性规则

2055
9
02-04-2021 07:47 am
LindseyStone
通过
临时贡献者III

我不擅长属性规则编码,需要一点帮助。我试图设置一个属性规则,它将从一个层的字段数据,并自动填充相关表中的字段与相同的数据。我已经运行了几个线程,其中您正在为表填充层,但不是这种方式。这是我的例子(我使用一个SDE SQL)

消火栓设备特征分类与消火栓维护检查表相关。我希望消防栓设备中的Utility_AssetID字段在创建检查时自动填充消防栓维护检查表中的Utility_AssetID字段。

标签(1)
0荣誉
9回复
JohannesLindner
常规赛MVP

如果Utility_AssetID不是关联这些表的字段(也就是说,你有另一个字段是由两个表共享的),你可以这样做:

// rule in Inspection table //触发器:insert, update // field:Utility_AssetID // value of shared field var key = $feature["SharedField"] // search for HydrantDevices of related features in HydrantDevicesFC var hydrant_devices = FeatureSetByName($datastore, " hydrantdevicesfc name ", ["SharedField", "Utility_AssetID"], false) var filtered_devices = Filter(hydrant_devices,"SharedField = @key") //没有找到相关的功能if(Count(filtered_devices) == 0) {return null} //找到相关的功能-> return第一个的Utility_AssetID return first (filtered_devices)["Utility_AssetID"]

如果Utility_AssetID是与FC和表相关的字段(也就是说,它是唯一告诉您检查属于哪个消防栓的字段),那么您就不能使用属性规则(至少我不知道)来做到这一点。

在这种情况下你可以做什么:

  • 在FC和表之间创建一个关系类
  • 在ArcGIS Pro中:选择消防栓
  • 打开属性窗格(地图/编辑—>选择—>属性)
  • 在你选择的消火栓功能下面,你应该看到关系类的名称
  • 右键点击,选择“添加新到关系”
  • ArcGIS在检查表中创建一个新条目,用该特性的值填充AssetID

祝你有愉快的一天!
约翰内斯
LindseyStone
通过
临时贡献者III

验证一下。我对这类事情真的很陌生。

这是我对我的关系和领域的细分。这些都在SDE数据库中。

水设备(包含消防栓)包含字段GLOBALID (GLOBALID字段)和hast_assetid(实用程序assetID文本字段)

消防栓检查表包含字段hyrantid (Guid字段)和hast_assetid (Utility assetID文本字段)

两者之间的关系是消防栓ID和全局ID之间的一对多关系。我想在水设备中的hast_assetid在创建时自动复制到消防栓检查中的hast_assetid(实用程序assetID文本字段)。

所以你上面的编码,这是正确的吗?这是在一个SDE地理数据库共享到一个功能服务的数据存储,我需要填写它还是做水。水装置或消防栓FC填写不同?

// rule in Inspection table //触发器:insert, update // field:Utility_AssetID / /共享字段值= $ var关键特性(" hydrantid "] / /搜索相关特性在消火栓设备FC var hydrant_devices = FeatureSetByName(数据存储美元,“WaterDevice”,(“GLOBALID”、“hast_assetid”),假)var filtered_devices =过滤器(hydrant_devices“GLOBALID = @key”)/ /不相关特性发现如果(Count (filtered_devices) = = 0){返回null} / /相关特性(s) - >返回Utility_AssetID第一个返回第一(filtered_devices)(“hast_assetid”)

0荣誉
JohannesLindner
常规赛MVP

@LindseyStone写道:

所以你上面的编码,这是正确的吗?这是在一个SDE地理数据库共享到一个功能服务的数据存储,我需要填写它还是做水。水装置或消防栓FC填写不同?


  • “WaterDevice”应该是“DatabaseName.DataOwner”。在Catalog视图中显示的全名。

  • $datastore是一个全局Arcade变量,它引用托管服务的服务器。你不需要改变它。


祝你有愉快的一天!
约翰内斯
0荣誉
LindseyStone
通过
临时贡献者III

我还是没办法把它修好。我想知道这是否与我正在编辑服务而不是直接编辑到SDE的事实有关。我附上了一个通过发布的服务(左)和直接针对SDE创建属性规则(右)的截图。

hydrantID.JPG

0荣誉
JimmyBowden
通过
临时贡献者II

你可以用featuresetbyrelationshipname所以你不必担心加入哪个领域。

var relationship = FeatureSetByRelationshipName($feature, 'Device_Hydrant_To_Inspection', ['hast_assetid'], false);返回第一个.hast_assetid(关系)

当我在处理属性规则时,它有助于在配置的弹出式表达式中运行代码。这将允许您查看正在返回的数据。

jimmybowden_0 - 1618510959330. - png

0荣誉
MitchJohnson
通过
新贡献者III

只有两行吗?我在第二行得到一个关于“标识符预期”或“意外空”的错误。企业地理数据库关系类。我试过一对多和一对一。起点和终点重要吗?

0荣誉
JohannesLindner
常规赛MVP

当没有相关的特性时,在一个空的特性集上调用First(),它将返回null。你只需要在调用First()之前检查功能集的大小:

var relationship = FeatureSetByRelationshipName($feature, 'Device_Hydrant_To_Inspection', ['hast_assetid'], false);//检查FeatureSet的大小,如果为空则返回null if(Count(relationship) == 0) {return null} return First(relationship).hast_assetid . value == 0)


祝你有愉快的一天!
约翰内斯
MitchJohnson
通过
新贡献者III

看来是这个干的。谢谢约翰!


最好的

米奇

0荣誉
AneteZvaigzneLV
新贡献者III

我有一个非常相似,甚至更简单的问题。

我有一个父点特征层。使用相关表创建的简单关系类。我想用一个名为“STD”的父特性字段的值“提供”相关表。我尝试了一个属性规则,使用功能设置由名称街机功能,但它忽略了我。我怀疑这是否可能。基本上,当我为GlobalID-GUID相关的地址点创建记录时,我还想填充另一个字段。

var relationship = FeatureSetByName($datastore, "Adresu_punkti2", ["STD"])

回报的关系

任何帮助/意见/指导都将不胜感激。