Skriptausdrücke für Attributregeln – Beispiele

Im Folgenden finden Sie Beispiel-Skriptausdrücke für Berechnungsattributregeln, Beschränkungsattributregeln und Validierungsattributregeln.

Im Esri GitHub-Repository finden Sie weitere Beispiele für Arcade-Skriptausdrücke für Attributregeln.

Beispiele für Berechnungsattributregeln

Beispiele für Beschränkungsattributregeln

Beispiele für Validierungsattributregeln

Beispiele für alle Regeltypen

Beispiele für Berechnungsattributregeln

Generieren einer ID durch Inkrementieren einer Sequenz.

Eine Regel für sofortige Berechnung wird für das Feld assetID in der Transformer-Feature-Class erstellt und für die Bearbeitungsoperationen "Einfügen" ausgelöst. Wenn Sie einen Transformator erstellen, fragt die Arcade-Funktion NextSequenceValue die Datenbank nach dem nächsten Sequenzwert ab, wozu sie den Wert "assetid_seq" aus "inputSequenceName" nutzt.

Verwenden Sie das Werkzeug Datenbanksequenz erstellen, um eine Sequenz zu erstellen, die Sie in einer Attributregel referenzieren können. Stellen Sie bei der Verwendung von Sequenzen in Skriptausdrücken sicher, dass die Option Von Anwendungsauswertung ausschließen auf "True" festgelegt ist.

 return "Tx-" + NextSequenceValue ("assetid_seq")

Zurückgeben einer benutzerdefinierten Fehlermeldung für eine Berechnungsregel.

Es gibt einige Fälle, in denen eine Berechnungsregel eine benutzerdefinierte Fehlermeldung als Fehler zurückgeben soll, wenn eine Bedingung nicht erfüllt wird. In diesem Beispiel wird eine sofortige Berechnungsregel zum Auffüllen des Feldes (FacilityID) basierend auf dem schneidenden Umspannwerk erstellt. Die Regel wird für Operationen wie "Einfügen" und "Aktualisieren" ausgeführt. Wenn Sie versuchen, einen Transformator in einem Umspannwerk zu erstellen, ruft der Arcade-Ausdruck den Namen des Umspannwerks ab und verwendet die assetID des Transformators, um das vollständige Feld "FacilityID" (SubstationName-AssetID) zu erstellen. Wird der Transformator außerhalb eines Umspannwerks erstellt oder verschoben, gibt das Skript eine benutzerdefinierte Fehlermeldung mit dem Schlüsselwort errorMessage zurück.

//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;

Markieren eines anderen Features als Feature, bei dem eine Auswertung erforderlich ist.

Sie können eine Berechnungsregel erstellen, die andere Features als zu berechnende oder auszuwertende Features markiert. Bei der Durchführung einer Berechnung kann das Schlüsselwort calculationRequired oder validationRequired in einem Wörterbuch verwendet werden, um das Attribut Validierungsstatus für ein oder mehrere Features zurückzusetzen. Dies ist nützlich, wenn eine Feature-Class von einer anderen Feature-Class abhängig ist. In diesem Beispiel ist das Feld "assetID" in der Transformer-Feature-Class von der schneidenden Substation-Feature-Class abhängig. Eine Berechnungsregel wird für das Feld "yearName" der Substation-Feature-Class erstellt. Wenn der Name des Umspannwerks aktualisiert wird, werden der neue Name und das aktuelle Jahr im Feld "yearName" gespeichert. Als Teil dieser Logik werden alle Transformatoren, die das Umspannwerk in der Feature-Class "Transformator" schneiden, als zu berechnende Tranformatoren markiert. Es gibt eine Regel für Batch-Berechnungen für die Transformer-Klasse, die die assetID für "Transformer" berechnet, wenn die Regel das nächste Mal ausgewertet wird. So wird der neue Name und das Jahr des Umspannwerks wiedergegeben.

//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
           }
       ]
   }

Bearbeiten einer anderen Feature-Class mit einer Berechnungsregel.

Sie können Attributregeln verwenden, um Einfügungen, Aktualisierungen und Löschungen an einer anderen Feature-Class vorzunehmen, indem Sie das Wörterbuch-Schlüsselwort edit verwenden. Das nachstehende Beispiel ist eine Berechnungsregel für ein Textfeld einer Wahlbezirksgrenzen-Feature-Class. Beim Bearbeiten eines Polygons in der Wahlbezirksgrenzen-Feature-Class werden über diese Attributregel alle schneidenden Adresspunkte mit dem Bezirksnamen aktualisiert.

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.'
}

Bearbeiten der Geometrie eines Features mit einer Berechnungsregel.

Erstellen Sie eine Berechnungsregel für das Shape-Feld eines Datasets, um Änderungen an der Geometrie eines Features vorzunehmen. In diesem Skript-Beispiel wird die Geometrie des Punkt-Features so geändert, dass es sich 5 Einheiten vom ersten Feature in pointClass1 entfernt befindet.

Vorsicht:

Der Raumbezug der zurückgegebenen Geometrie muss mit dem Raumbezug des Datasets, in dem die Attributregel enthalten ist, übereinstimmen.

//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

Beispiele für Beschränkungsattributregeln

Zurückgeben eines booleschen Wertes für eine Beschränkungsregel.

Diese Beschränkungsattributregel wurde für die Umspannwerk-Klasse erstellt und soll bei den Operationen "Einfügen" und "Aktualisieren" ausgelöst werden. Wenn der Name des Umspannwerks leer ist, gibt der Ausdruck "false" zurück und schlägt fehl. Wenn der Name des Umspannwerks nicht leer ist, gibt der Ausdruck "true" zurück und ermöglicht die Fortsetzung der Bearbeitung.

if ($feature.name == null)
    return false;
else
    return true;

//another way of writing it
return !($feature.name == null)

Zurückgeben einer benutzerdefinierten Fehlermeldung für eine Beschränkungsregel.

Es gibt einige Fälle, in denen die Beschränkungsattributregel je nach Bedingung eine andere Fehlermeldung zurückgeben soll. Nachfolgend finden Sie ein Beispiel für die Rückgabe eines benutzerdefinierten Fehlers, wenn der Name oder installationDate für das Umspannwerk NULL ist.

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;

Verhindern der Löschung eines Features mit einer Beschränkungsregel.

Diese Beschränkungsattributregel verhindert, dass ein Feature gelöscht wird, wenn das Feld "lifecyclestatus" nicht auf "Retired" festgelegt ist. Wenn das Feld "lifecyclestatus" nicht auf "Retired" festgelegt ist, wird eine benutzerdefinierte Fehlermeldung zurückgegeben, und die Bearbeitung schlägt fehl. Die erstellte Regel soll bei der Operation "Löschen" ausgelöst werden.

if ($feature.lifecyclestatus == 'retired')
{
  return true;
}
return {'errorMessage': 'You are not allowed delete a feature until it is retired'};

Beispiele für Validierungsattributregeln

Zurückgeben eines booleschen Wertes für eine Validierungsregel.

Validierungsregeln sind optimal in Fällen geeignet, in denen beschädigte Daten erkannt werden sollen, aber mit einer Beschränkungsregel die Bearbeiter nicht daran gehindert werden sollen, ihre Arbeit abzuschließen. Sie können Regeln auswerten und Fehler für die Features erstellen, die gegen die Regel verstoßen. Dies ist ein Beispiel für Umspannwerke, die den maximalen kVA-Wert überschreiten und als Fehler gekennzeichnet sind (es werden Polygonfehler erstellt).

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

Das folgende Beispiel ist eine Validierungsregel, die für eine Feature-Class für Masten erstellt wurde, um zu gewährleisten, dass bei einer Höhe der Struktur von mindestens 65 Fuß das Material aus Stahl bestehen muss. Wenn dies nicht gegeben ist, wird ein Fehler-Feature generiert.

if ($feature.structureheight >= 65)
{
    If (DomainName($feature, 'Material') == 'Steel')
    { return true; }
    else
    { return false; }
}
Else
{  return true; }

Beispiele für alle Regeltypen

Identifizieren, ob sich ein bestimmter Attributwert geändert hat.

Verwenden Sie die globale Variable $originalfeature, um die Attribute eines Features zu referenzieren, bevor eine Bearbeitung vorgenommen wird. Verwenden Sie Arcade zum Vergleich von $originalfeature und $feature, um so zu bestimmen, ob sich das Attribut eines Features geändert hat.

Beispiel für Arcade-Syntax mit "$originalfeature" zum Überprüfen, ob sich ein Attribut geändert hat:

if ($feature.field == $originalfeature.field) {
    //code if field attribute hasn't changed
} else {
    //code if field attribute has changed.
}

Beispiel für Arcade-Syntax mit "$originalfeature" zum Überprüfen, ob sich die Geometrie geändert hat:

if (Equals(Geometry($feature), Geometry($originalfeature))) {
    //code if geometry hasn't changed
} else {
    //code if geometry has changed
}

Beispiel für Arcade-Syntax mit "$originalfeature" zum Überprüfen, ob sich ein Attribut um 50 Prozent geändert hat:

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

Identifizieren des Bearbeitungsereignis-Triggers, wie zum Beispiel Einfügen, Aktualisieren oder Löschen.

Verwenden Sie die globale Variable "$editcontext", um den edit type in der Arcade-Logik zu referenzieren. Damit können Sie genau eine Attributregel erstellen, in der alle ein Ereignis auslösenden Ereignisse aktiviert sind, und Bedingungen basierend auf dem Bearbeitungstyp hinzufügen.

Beispiel für Arcade-Syntax mit $editcontext zum Überprüfen des Bearbeitungstyps:

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
}