属性ルール スクリプト式の例

次に、計算制約、および整合チェックの各属性ルールのスクリプト式の例を示します。

使用法、プロファイル変数、戻り値のタイプなどの詳細については、属性ルール固有の Arcade プロファイルをご参照ください。

属性ルールの Arcade スクリプト式の例をさらに見るには、Esri GitHub リポジトリをご覧ください。

計算属性ルールの例

制約属性ルールの例

検証属性ルールの例

すべてのルール タイプの例

計算属性ルールの例

1 ずつ増える ID シーケンスを生成します。

変圧器フィーチャクラスの 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

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)

更新編集時に、リレーションシップ クラスの新しい関連レコードを追加します。

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
}