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

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

計算属性ルールの例

制約属性ルールの例

整合チェック属性ルールの例

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

計算属性ルールの例

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

変圧器フィーチャクラスの 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 の論理編集タイプを参照します。これにより、イベントをトリガーするすべてのイベントが有効な属性ルールを作成することができますが、条件は編集タイプに基づいて追加できます。

$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
}