属性ルールは、ジオデータベースのリレーションシップ クラスに参加するデータセットの関連レコードを読み取り、編集するために使用されます。 ルールは、リレーションシップ クラスに参加するフィーチャクラスとテーブルに適用できます。これには、添付ファイルとフィーチャリンク アノテーションが含まれます。 属性ルールは、リレーションシップの関連元クラスと関連先クラスに対する更新から編集イベント (関連レコードの追加、除去、削除) をインターセプトするために使用することもできます。 たとえば、即時計算属性ルールでは、フィーチャを関連フィーチャクラスに追加するときに、属性フィールドを更新できます。
リレーションシップ クラスでのイベントのトリガー
即時属性ルールは、挿入、更新、削除などの編集イベントでトリガーされます。 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;
リレーションシップ クラス ルールの検証と評価
検証属性ルールまたは制約属性ルールを作成して適用し、リレーションシップ クラス ルールを設定することができます。
たとえば、電柱 (関連元) フィーチャクラスと調査 (関連先) テーブルの間には、リレーションシップ クラス設定があります。 各電柱には、少なくとも 1 つ以上の調査が記録されている必要があります。
これを実現するために、この関連するデータ間に 1 対 1 (1:1) または 1 対多 (1:M) のリレーションシップ クラス ルールを作成することができます。 リレーションシップ クラス ルールが作成された後に、次のスクリプトを使用して、各電柱が 1 つ以上の調査を渡す必要があることを設定するために電柱 (関連元) フィーチャクラスに適用される検証属性ルールを記述することができます。//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;
データにこの検証属性ルールを追加すると、評価プロセスでデータに関するルールが検証され、ルールに従っているかどうかの確認が行われます。 使用される評価方法は、ルールのタイプとプロパティによって異なります。
エラー インスペクター ビューまたは [ルールの評価 (Evaluate Rules)] ツールを使用して、ユーザーが指定した日時に検証ルールを評価します。 評価中に、検証ルールは、ルールに違反しているフィーチャをハイライト表示するエラー フィーチャを作成します。 これらのルールのエラー フィーチャを検証するには、[エラー インスペクター] を使用します。
注意:
FeatureSetByRelationshipName 関数または FeatureSetByRelationshipClass Arcade 関数のいずれかを使用して、これらのルールを作成することができます。 FeatureSetByRelationshipClass を使用して、クライアント側でサービスを通じてルールを評価することができます。これは、ArcGIS Pro 3.2 以降を必要とし、上の「関連レコードの読み取り」セクションで説明されています。
この属性ルールを変更して、電柱に 1 つのみの調査が存在するか、調査が存在しない必要があることを設定するには、スクリプトを次のように書き換えることができます。//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 - 指定したスクリプト式が満たされていないため、フィーチャは作成されません。
制約属性ルールを作成して適用する場合、編集トリガーの順序に細心の注意を払ってください。
たとえば、電柱フィーチャクラス内の電柱ごとに少なくとも 1 つの調査イベントが存在する必要があることを設定するために制約属性ルールが作成され、電柱フィーチャクラスに適用されます。 新しい電柱が追加されるときなどの挿入時にトリガーするように、この制約属性ルールが設定された場合、電柱を作成することができなくなります。 このシナリオでは、挿入時の代わりに更新時にトリガーするように制約属性ルールを作成することが推奨されます。
注意:
[すぐに使用できるルール] ボタン により、制約ルールと検証ルールの作成をサポートする構成可能なチェックのギャラリーにアクセスできます。 これは、ArcGIS Data Reviewer ライセンスにより使用できます。