次に、計算、制約、および整合チェックの各属性ルールのスクリプト式の例を示します。
属性ルールの Arcade スクリプト式の例をさらに見るには、Esri GitHub リポジトリをご覧ください。
計算属性ルールの例
制約属性ルールの例
整合チェック属性ルールの例
すべてのルール タイプの例
計算属性ルールの例
変圧器フィーチャクラスの assetID フィールドに即時計算ルールが作成され、編集内容の挿入操作によってトリガーされます。変圧器を作成すると、NextSequenceValue Arcade 関数がデータベースにクエリを送信して次のシーケンス値を取得し、これを assetID フィールドに保持します。
属性ルールで参照するシーケンスを作成するには、[データベース シーケンスの作成 (Create Database Sequence)] ツールを使用します。スクリプト式で順序を使用する場合は、[アプリケーション評価から除外] オプションが true に設定されていることを確認してください。
return "Tx-" + NextSequenceValue ("assetid")
条件が満たされたなかった場合に、失敗したとしてカスタム エラー メッセージを返す計算ルールが必要となるケースもあります。この例では、交差する変電所に基づいて (FacilityID) フィールドを設定するため、即時計算ルールを作成します。このルールは、挿入および更新操作を実行します。変電所に変圧器を作成しようとすると、Arcade 式が変電所の名前を取得し、変圧器の assetID を使用して完全な FacilityID フィールドを作成します (SubstationName-AssetID)。変圧器が変電所の外部に作成されたり、移動したりした場合は、スクリプトが errorMessage キーワードを使用してカスタム エラー メッセージを返します。
//On Insert or Update set FacilityID = SubstationName - AssetID use intersect to get the substation name
//If no substation (fail with error message dictionary, must create in substation.)
var fsStructureBoundary = FeatureSetByName($datastore, "Substation", ["name"], true)
var fsSubstation = Intersects(fsStructureBoundary, Geometry($feature))
var substation = First (fsSubstation)
var subname = ""
if (substation == null)
return {"errorMessage": "Transformers must be created in a substation."}
else
subname = substation.name
return subname + " - " + $feature.assetid;
他のフィーチャで計算または整合チェックが必要であることをマーク付けする計算ルールを作成できます。計算の実行時、calculationRequired または validationRequired キーワードを辞書で使用すると、1 つ以上のフィーチャの整合チェック ステータス属性をリセットできます。これは、フィーチャクラスが別のフィーチャクラスに依存する場合に便利です。この例では、Transformer フィーチャクラスの assetID フィールドが、交差する Substation フィーチャクラスに依存しています。計算ルールが Substation フィーチャクラスの yearName フィールドに作成されています。変電所名が更新されると、新しい名前と現在の年が yearName フィールドに保存されます。この論理の一部として、Transformer フィーチャクラスで変電所を交差するすべての変圧器は、計算が必要であるとしてマーク付けされます。Transformer クラスに対するバッチ計算ルールがあり、ルールが次回評価されたときに Transformer assetID が計算されて、変電所の新しい名前と年が反映されます。
//Updating the substation name marks its transformers as requiring calculation and updates the yearName to the new name and year.
//To recalculate the facility id on all transformers, mark all associated transformers as requiring calculation. var fsDevice = FeatureSetByName($datastore, "Transformer", ["globalid"], false) var fsDeviceIntersects = Intersects (fsDevice, Geometry($feature))
var transformers = [];
var count = 0;
for (var i in fsDeviceIntersects) transformers[count++] = i.globalid;
var newName = $feature.name + " " + Year(Now()) return {
'result': newName, 'calculationRequired':
[ {
'className':"Transformer", 'globalIDs': transformers }
] }
属性ルールを使用すると、別のフィーチャクラスに対しての挿入、更新、および削除の操作を、edit 辞書のキーワードを使用して実行できます。次の例は、ある地区の境界のフィーチャクラスのテキスト フィールドに対しての計算ルールです。この地区の境界のフィーチャクラス内のポリゴンを編集するときは、この属性ルールにより交差点の住所のポイントが地区名を用いて更新されます。
var fsAddress = FeatureSetByName($datastore, "Address_pnts", ["globalid"], false)
var fsListAddpnts = Intersects(fsAddress, $feature)
var AddList = []
var counter = 0
var noAddress = Count(fsListAddpnts)
if (noAddress > 0) {
for (var address in fsListAddpnts) {
AddList[counter] = {
'globalid': address.globalid,
'attributes': {
'add_district_name': $feature.DistrictName
}
}
counter++
}
return {
'result': noAddress + ' addresses found in the district.',
'edit': [{
'className': 'Address_pnts',
'updates': AddList
}]
}
} else {
return 'No address points in district.'
}
データセットの形状フィールドに計算ルールを作成し、フィーチャのジオメトリを変更します。このサンプル スクリプトでは、ポイント フィーチャが、pointClass1 の最初のフィーチャから 5 単位離れるように修正されます。
注意:
返されたジオメトリの空間参照は、属性ルールを含むデータセットの空間参照に一致している必要があります。
//This calculation attribute rule is added to the shape field of a point feature class called pointClass2 var centerFeature = First(FeatureSetByName($datastore, "pointClass1")) //Get the x and y values of the feature in the pointClass1 var x0 = Geometry(centerFeature).x var y0 = Geometry(centerFeature).y
//Get the x and y values of the current feature in the pointClass2 var x1 = Geometry($feature).x;
var y1 = Geometry($feature).y;
var x2 = 0;
var y2 = 0;
var d = 5
//Calculate the euclidean distance from feature in pointClass1 and current feature in pointClass2 var d1 = sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0))
//Calculate the new x and y to be within 5 metric units while maintaining slope x2 = (x1 - x0) * d / d1 + x0;
y2 = (y1 - y0) * d / d1 + y0;
//Create a point geometry from the new x and y values var pointA = Point({
"x": x2, "y": y2, "z": 0, "spatialReference": Geometry(centerFeature).spatialReference
});
return pointA
制約属性ルールの例
この制約属性ルールは変電所クラスに作成され、挿入および更新操作でトリガーするよう設定されます。変電所名が空白である場合、式は false を返し、失敗に終わります。変電所名が空白でない場合、式は true を返し、編集を続行できます。
if ($feature.name == null) return false;
else return true;
//another way of writing it return !($feature.name == null)
状況に応じて制約属性ルールが異なるメッセージを返すように設定したい場合があります。次に、変電所の名前または installationDate が null である場合にカスタム エラーを返す例を示します。
if ($feature.name == null) return {"errorMessage": "Substation must have a valid name."}
else if ($feature.installationDate == null) return {"errorMessage": "Substation must have a valid installation date."}
else return true;
この制約属性ルールは、lifecyclestatus フィールドが廃止に設定されない限り、フィーチャを削除されません。lifecyclestatus が廃止に設定されていない場合は、カスタム エラー メッセージが返され、編集が失敗します。ルールは、削除操作によってトリガーされるよう作成されます。
if ($feature.lifecyclestatus == 'retired') {
return true;
}
return {'errorMessage': 'You are not allowed delete a feature until it is retired'};
整合チェック属性ルールの例
整合チェックは、破損したデータを検出したいが、制約ルールによってエディターの処理を妨げたくないような場合に最適です。ルールを評価し、ルール違反となるフィーチャのエラーを作成できます。最大 kva を超過したため、エラーのフラグが付けられた変電所の例を次に示します (ポリゴン エラーが作成されます)。var fsTransformer = FeatureSetByName($datastore, "L1Electric_Distribution_Device", ["objectid"], true) var fsTransformerSubset = Intersects(fsTransformer, Geometry($feature)) var totalKva = 0;
for (var t in fsTransformerSubset) totalKva += t.kva
if (totalKva > $feature.maxKva) return false else return true
以下の例は、構造の高さが 65 フィート以上である場合に、材料が鉄でできていることを保証するために、電柱フィーチャクラスに対して作成される整合チェック ルールです。これが True でない場合、エラー フィーチャが生成されます。if ($feature.structureheight >= 65) {
If (DomainName($feature, 'Material') == 'Steel') { return true; }
else { return false; }
}
Else
{ return true; }
すべてのルール タイプの例
$originalfeature グローバル変数を使用して、編集前にフィーチャの属性を参照します。Arcade を使用して $originalfeature を $feature と比較し、フィーチャの属性が変更されたかどうかを判断します。
$originalfeature を使用して、属性が変更されたかどうかを確認する、Arcade の構文例です。
if ($feature.field == $originalfeature.field) {
//code if field attribute hasn't changed
} else {
//code if field attribute has changed.
}
$originalfeature を使用して、ジオメトリが変更されたかどうかを確認する Arcade の構文例です。
if (Equals(Geometry($feature), Geometry($originalfeature))) {
//code if geometry hasn't changed
} else {
//code if geometry has changed
}
$originalfeature を使用して、属性が 50 パーセント変更されたかどうかを確認する Arcade の構文例です。
if ($originalfeature.field == 0) {
//code to avoid calculating change if $originalfeature.field was zero
} else {
var percent_change = Abs(($feature.field - $originalfeature.field) / $originalfeature.field) * 100 if (percent_change >= 50) {
//code if percent change is by 50% or more } else {
//code if percent change is less than 50%
}
}
$editcontext グローバル変数を使用して、Arcade の論理の edit type を参照します。これにより、イベントをトリガーするすべてのイベントが有効な属性ルールを作成することができますが、条件は編集タイプに基づいて追加できます。
$editcontext を使用して、編集タイプを確認するための Arcade の構文例です。
if ($editContext.editType == "INSERT") {
//code if the edit is an insert
} else if ($editContext.editType == "UPDATE") {
//code if the edit is an update
} else if ($editContext.editType == "DELETE") {
//code if the edit is a delete
} else if ($editContext.editType == "NA") {
//code when edit type is not applicable, for example batch calculation or validation rules
}