属性ルールは、ジオデータベースのリレーションシップ クラスに参加するデータセットの関連レコードを読み取り、編集するために使用されます。 ルールは、リレーションシップ クラスに参加するフィーチャクラスとテーブルに適用できます。これには、添付ファイルとフィーチャリンク アノテーションが含まれます。 属性ルールは、リレーションシップの関連元クラスと関連先クラスに対する更新から編集イベント (関連レコードの追加、除去、削除) をインターセプトするために使用することもできます。 たとえば、即時計算属性ルールでは、フィーチャを関連フィーチャクラスに追加するときに、属性フィールドを更新できます。
リレーションシップ クラスでのイベントのトリガー
即時属性ルールは、挿入、更新、削除などの編集イベントでトリガーされます。 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 - 実行はサーバー コンテキストに制限されます。 属性ルールにこの関数を使用する場合は、[アプリケーション評価から除外] オプションが true に設定されていることを確認してください。
- FeatureSetByRelationshipClass - サーバー側とクライアント側の両方での実行をサポートしています。 この関数を使用するルールは、編集内容がデータ ソースに送信される前に、アプリケーション (ArcGIS Pro や ArcGIS Maps SDKs for Native Apps など) でローカルで実行できます。
また、FeatureSetByName Arcade 関数と外部キーのフィルターを使用し、関連レコードを読み取ることもできます。
FeatureSetByName Arcade 関数を使用して、リレーションシップ クラスの関連レコードを読み取ります。
検査テーブルとの一対多のリレーションシップ クラスに属する pole フィーチャクラスの InspectionCount フィールドに、計算ルールが作成されます。 FeatureSetByName 関数を使用して、検査クラスを直接読み取り、更新された関連レコードを取得できます。 この Arcade 関数を使用するには、リレーションシップ クラス フィールドの知識が必要です。 このリレーションシップ クラスの場合、起点の主キーは pole フィーチャクラスの 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 だけを知っていれば十分です。
注意:
この関数を使用して属性ルールを作成するときは、アプリケーション評価の除外オプションが true に設定されていることを確認してください。
//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)
関連レコードの作成、更新、削除
リレーションシップ クラスの関連レコードは、ディクショナリ リターンに基づく計算ルールを使用して編集することもできます。
以下に、関連レコードを作成する計算ルールの作成例を示します。 ユーザーが街灯に関するコメント フィールドを更新すると、edit 辞書キーワードが検査レコードを作成するために使用されます。 同様に、関連レコードを更新または削除できます。 詳細については、「属性ルールの辞書キーワード」をご参照ください。
更新編集時に、リレーションシップ クラスの新しい関連レコードを追加します。
pole コメント フィールドがユーザーによって更新されたとき、新しい関連レコードを作成するため計算ルールが使用されます。 この式では、コメント フィールドが変更されたとき、新しい検査レコードを作成するために edit 辞書キーワードが使用されます。 同様に、関連レコードを更新または削除できます。 詳細については、「属性ルールの辞書キーワード」をご参照ください。//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;