Skriptausdrücke für Attributregeln – Beispiele

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

Im jeweiligen Arcade-Profil für Attributregeln erfahren Sie mehr über die Verwendung, Profilregeln, Rückgabetypen usw.

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. Das Feld assetID für eingefügte Features wird mit dem Präfix "Tx-" und dem zurückgegebenen Sequenzwert gefüllt.

Verwenden Sie das Werkzeug Datenbanksequenz erstellen, um eine Sequenz zu erstellen, die Sie in einer Attributregel referenzieren können.

Skriptausdruck zum Verwenden einer Sequenz namens "assetid_seq" in einer File-Geodatabase:

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

Skriptausdruck zum Verwenden einer Sequenz des Kartenbenutzers "assetid_seq" in einer Enterprise-Geodatabase:

 return "Tx-" + NextSequenceValue ('map.assetid_seq')

Stellen Sie bei der Verwendung von Sequenzen in Skriptausdrücken sicher, dass die Option Von Anwendungsauswertung ausschließen auf "True" festgelegt ist. Verwenden Sie bei Enterprise-Geodatabases den vollständig qualifizierten Namen der Sequenz im Skriptausdruck, z. B. "owner.sequencename".

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 Füllen des Feldes (FacilityID) basierend auf dem schneidenden Umspannwerk erstellt. Die Regel wird durch die Operationen "Einfügen" und "Aktualisieren" ausgelöst. Wenn Sie versuchen, einen Transformator in einem Umspannwerk zu erstellen, ruft der Arcade-Ausdruck den Namen des Umspannwerks ab und verwendet den Wert "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 Transformatoren markiert. Es gibt eine Regel für Batch-Berechnungen für die Transformer-Klasse, die den Wert "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 metrische 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

Lesen zugehöriger Datensätze für eine Beziehungsklasse mit der Arcade-Funktion "FeatureSetByName".

Eine Berechnungsregel wird für das Feld "InspectionCount" in der Feature-Class für Masten erstellt, die Teil einer Klasse von Eins-zu-Viele-Beziehungen mit der Inspektionstabelle ist. Die Funktion FeatureSetByName kann verwendet werden, um die Inspektionsklasse direkt zu lesen und die zugehörigen Datensätze bei einer Aktualisierung abzurufen. Zur Verwendung dieser Arcade-Funktion sind Kenntnisse zum Feld "Beziehungsklasse" erforderlich. Für diese Beziehungsklasse ist der Quell-Primärschlüssel das Feld "globalID" der Feature-Class für Masten und der Quell-Fremdschlüssel das Feld "poleguid" der Standalone-Inspektionstabelle.

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

Lesen eines zugehörigen Datensatzes für eine Beziehungsklasse mit der Arcade-Funktion "FeatureSetByRelationShipName".

Dieses Skript zum Lesen zugehöriger Datensätze für eine Beziehungsklasse kann mit der Funktion FeatureSetRelationshipName umgeschrieben werden. Bei Verwendung dieser Funktion muss der Fremdschlüssel nicht bekannt sein, sondern lediglich der Beziehungsname "pole_inspection".

Vorsicht:

Stellen Sie bei der Verwendung dieser Funktion zum Erstellen einer Attributregel sicher, dass die Option "Von Anwendungsauswertung ausschließen" auf "True" festgelegt ist.

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

Lesen eines zugehörigen Datensatzes für eine Beziehungsklasse mit der Arcade-Funktion "FeatureSetByRelationshipClass".

Dieses Skript zum Lesen zugehöriger Datensätze aus einer Beziehungsklasse kann mit der Funktion FeatureSetByRelationshipClass umgeschrieben werden. Bei Verwendung dieser Funktion muss der Fremdschlüssel nicht bekannt sein, sondern lediglich der Beziehungsname "pole_inspection". Diese Funktion unterstützt die server- und clientseitige Ausführung. Daher können Attributregeln, die diese Funktion verwenden, lokal in der Anwendung ausgeführt werden.

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

Hinzufügen eines neuen zugehörigen Datensatzes für eine Beziehungsklasse bei einer Aktualisierung.

Eine Berechnungsregel wird zum Erstellen eines neuen zugehörigen Datensatzes verwendet, wenn ein Feld für Kommentare zu Leitungsmasten vom Benutzer aktualisiert wird. In diesem Ausdruck wird das Schlüsselwort aus dem Wörterbuch edit zum Erstellen eines neuen Inspektionsdatensatzes verwendet, wenn sich das Kommentarfeld ändert. Ähnliches gilt für das Aktualisieren oder Löschen zugehöriger Datensätze. Weitere Informationen finden Sie unter Wörterbuch-Schlüsselwörter für Attributregeln.

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

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 Wert "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 der Wert "lifecyclestatus" nicht auf "Retired" festgelegt ist, wird eine benutzerdefinierte Fehlermeldung zurückgegeben, und die Bearbeitung schlägt fehl. Die Regel wird durch die Operation "Löschen" ausgelöst.

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 einem Wert für "structureheight" 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 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 Feststellen, 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 Feststellen, 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 Feststellen, 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 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
}