次に、計算、制約、および整合チェックの各属性ルールのスクリプト式の例を示します。
使用法、プロファイル変数、戻り値のタイプなどの詳細については、属性ルール固有の Arcade プロファイルをご参照ください。
属性ルールの Arcade スクリプト式の例をさらに見るには、Esri GitHub リポジトリをご覧ください。
計算属性ルールの例
- 1 ずつ増える ID シーケンスを生成します。
- 計算ルールに対するカスタム エラー メッセージが返されます。
- 別のフィーチャを要評価としてマーク付けします。
- 計算ルールを持つ別のフィーチャクラスを編集します。
- 計算ルールを持つフィーチャのジオメトリを編集します。
- FeatureSetByName Arcade 関数を使用して、リレーションシップ クラスの関連レコードを読み取ります。
- FeatureSetByRelationShipName Arcade 関数を使用して、リレーションシップ クラスの関連レコードを読み取ります。
- FeatureSetByRelationshipClass Arcade 関数を使用して、リレーションシップ クラスの関連レコードを読み取ります。
- 更新編集時に、リレーションシップ クラスの新しい関連レコードを追加します。
制約属性ルールの例
検証属性ルールの例
すべてのルール タイプの例
計算属性ルールの例
変圧器フィーチャクラスの assetID フィールドに即時計算ルールが作成され、編集内容の挿入操作によってトリガーされます。 変圧器を作成すると、NextSequenceValue Arcade 関数が assetid_seq の inputSequenceName を使用し、データベースにクエリを送信して次のシーケンス値を取得します。 挿入されたフィーチャの assetID フィールドには、接頭辞 "Tx-" と、返されたシーケンス値が入力されます。
属性ルールで参照するシーケンスを作成するには、[データベース シーケンスの作成 (Create Database Sequence)] ツールを使用します。
ファイル ジオデータベース内で assetid_seq という名前のシーケンスを使用するためのスクリプト式:
return "Tx-" + NextSequenceValue ('assetid_seq')
エンタープライズ ジオデータベース内で assetid_seq という名前のマップ ユーザーに所有されているシーケンスを使用するためのスクリプト式:
return "Tx-" + NextSequenceValue ('map.assetid_seq')
スクリプト式で順序を使用する場合は、[アプリケーション評価から除外] オプションが true に設定されていることを確認してください。 エンタープライズ ジオデータベースでは、スクリプト式でシーケンスの完全修飾名、たとえば owner.sequencename を使用します。
条件が満たされたなかった場合に、失敗したとしてカスタム エラー メッセージを返す計算ルールが必要となるケースもあります。 この例では、交差する変電所に基づいて (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
検査テーブルとの一対多のリレーションシップ クラスに属する 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)
リレーションシップ クラスの関連レコードを読み取るための同じスクリプトを、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 関数で書き換えることができます。 この関数を使用するときは、外部キーを知らなくても、リレーションシップ名の 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)
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;
制約属性ルールの例
この制約属性ルールは変電所クラスに作成され、挿入および更新操作でトリガーするよう設定されます。 変電所名が空白である場合、式は false を返し、失敗に終わります。 変電所名が空白でない場合、式は true を返し、編集を続行できます。
if ($feature.name == null)
return false;
else
return true;
//another way of writing it
return !($feature.name == null)
状況に応じて、制約属性ルールが異なるエラー メッセージを返すことが望ましい場合があります。 変電所の name または 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
次の例は、structureheight の値が 65 フィート以上のとき、材料が鋼鉄であることを保証するため、poles フィーチャクラスについて作成される検証ルールです。 これが 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 をご参照ください。 これにより、トリガーされるすべてのイベントが有効な 1 つの属性ルールを作成し、編集タイプに基づいて条件を追加できます。
$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
}