Ejemplos de expresiones de script de reglas de atributos

A continuación se incluyen ejemplos de expresiones de script para reglas de atributos de cálculo, restricción y validación.

Consulte el perfil de Arcade específico de las reglas de atributos para obtener más información sobre el uso, las variables de perfil, los tipos de retorno, etc.

Consulte el repositorio Esri GitHub para obtener más ejemplos de expresiones de script de Arcade para las reglas de atributos.

Ejemplos de reglas de atributos de cálculo

Ejemplos de reglas de atributos de restricción

Ejemplos de reglas de atributos de validación

Ejemplos para todos los tipos de reglas

Ejemplos de reglas de atributos de cálculo

Genere un Id. incrementando una secuencia.

Se crea una regla de cálculo inmediato en el campo assetID de la clase de entidad del transformador y se desencadena en operaciones de edición de inserción. Cuando se crea un transformador, la función NextSequenceValue de Arcade consulta el siguiente valor de la secuencia de la base de datos utilizando el inputSequenceName de assetid_seq. El campo assetID correspondiente a las entidades insertadas se rellena con el prefijo "Tx-" y el valor de secuencia devuelto.

Para crear una secuencia a la que hacer referencia en una regla de atributos, utilice la herramienta Crear secuencia de base de datos.

Expresión de secuencia de comandos para el uso de una secuencia denominada assetid_seq en una geodatabase de archivos:

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

Expresión de secuencia de comandos para el uso de una secuencia propiedad del usuario del mapa denominado assetid_seq en una geodatabase corporativa:

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

Al utilizar secuencias en la expresión de script, asegúrese de que la opción Excluir de la evaluación de la aplicación esté configurada como true. En las geodatabases corporativas, utilice el nombre plenamente cualificado de la secuencia en la expresión de secuencia de comandos, por ejemplo, owner.sequencename.

Devuelva un mensaje de error personalizado para una regla de cálculo.

Hay algunos casos en los que se desea que una regla de cálculo devuelva un mensaje de error personalizado cuando no se cumple una condición. En este ejemplo, se crea una regla de cálculo inmediato para rellenar el campo (FacilityID) en función de la subestación de intersección. La regla se desencadena al insertar y actualizar operaciones. Si intenta crear un transformador en una subestación, la expresión de Arcade busca el nombre de la subestación y utiliza el valor assetID del transformador para crear todo el campo FacilityID (SubstationName-AssetID). Si el transformador se crea o se mueve fuera de una subestación, el script devuelve un mensaje de error personalizado utilizando la palabra clave 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;

Marque otra entidad que requiere evaluación.

Puede crear una regla de cálculo que marque otras entidades para indicar que requieren cálculo o validación. Al realizar un cálculo, puede utilizar la palabra clave calculationRequired o validationRequired en un diccionario para restablecer el atributo Estado de validación de una o varias entidades. Resulta útil si la clase de entidad depende de otra clase de entidad. En este ejemplo, el campo assetID de la clase de entidad Transformador depende de la clase de entidad Subestación intersecante. Se crea una regla de cálculo en el campo yearName de la clase de entidad Subestación. Cuando se actualiza el nombre de la subestación, el nombre nuevo y el año actual se almacenan en el campo yearName. Como parte de esta lógica, todos los transformadores que intersecan la subestación de la clase de entidad Transformador se marcan para indicar que requieren cálculo. La clase Transformador cuenta con una regla de cálculo por lotes que calcula el valor assetID del Transformador la próxima vez que se evalúe la regla para reflejar el nuevo nombre y año de la subestación.

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

Edite otra clase de entidad con una regla de cálculo.

Puede utilizar reglas de atributos para realizar inserciones, actualizaciones y eliminaciones en otra clase de entidad mediante la palabra clave de diccionario edit. El ejemplo que aparece a continuación representa una regla de cálculo en un campo de texto de una clase de entidad de límites de distritos. Al editar un polígono en la clase de entidad de límites de distritos, esta regla de atributo actualiza cualquier punto de dirección que se interseque con el nombre de distrito.

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

Edite la geometría de una entidad con una regla de cálculo.

Cree una regla de cálculo en el campo forma de un dataset para realizar modificaciones en la geometría de una entidad. En este ejemplo de script, la geometría de la entidad de punto se modifica para que esté a 5 unidades métricas de distancia de la primera entidad en pointClass1.

Precaución:

La referencia espacial de la geometría devuelta debe coincidir con la referencia espacial del dataset que contiene la regla de atributo.

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

Lea los registros relacionados de una clase de relación utilizando la función FeatureSetByName de Arcade.

Se crea una regla de cálculo en el campo InspectionCount en la clase de entidad de poste que participa en una clase de relación de uno a muchos con la tabla de inspección. La función FeatureSetByName puede utilizarse para leer la clase de inspección directamente y recuperar los registros relacionados al actualizar. El uso de la función Arcade exige conocer el campo de clase de relación. Para esta clase de relación, la clave principal de origen es el campo globalID de la clase de entidad de poste y la clave externa de origen es el poleguid de la tabla independiente de inspección.

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

Lea un registro relacionado de una clase de relación utilizando la función FeatureSetByRelationShipName de Arcade.

Con la función FeatureSetRelationshipName se puede reescribir la misma secuencia de comandos para leer registros relacionados correspondientes a una clase de relación. Con esta función no necesita conocer la clave externa, solo el nombre de relación: pole_inspection.

Precaución:

Al utilizar esta función para crear una regla de atributo, asegúrese de que la opción Excluir de la evaluación de la aplicación esté configurada como 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)

Lea un registro relacionado de una clase de relación utilizando la función FeatureSetByRelationshipClass de Arcade.

Con la función FeatureSetByRelationshipClass se puede reescribir la misma secuencia de comandos para leer registros relacionados de una clase de relación. Con esta función no necesita conocer la clave externa, solo el nombre de relación: pole_inspection. Esta función es compatible con la ejecución tanto del lado cliente como del lado servidor, por lo que las reglas de atributo que utilizan esta función pueden ejecutarse localmente en la aplicación.

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

Agregue un registro relacionado nuevo correspondiente a una clase de relación en una edición de actualización.

Se utiliza una regla de cálculo para crear un nuevo registro relacionado cuando el usuario actualiza un campo de comentario de poste. En esta expresión, la palabra clave del diccionario editar se utiliza para crear un nuevo registro de inspección si el campo de comentarios cambia. De manera similar, puede actualizar o eliminar registros relacionados. Consulte Palabras clave de diccionario de reglas de atributos para obtener más información.

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

Ejemplos de reglas de atributos de restricción

Devuelva un valor booleano para una regla de restricción.

Esta regla de atributo de restricción se crea en la clase de subestación y se establece para desencadenarse con operaciones de inserción y actualización. Si el nombre de subestación está vacío, la expresión devolverá 'false' y fallará. Si el nombre de la subestación no está vacío, la expresión devuelve 'true' y permite que se realice la edición.

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

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

Devuelva un mensaje de error personalizado para una regla de restricción.

Existen algunos casos en los que se desea que la regla de atributo de restricción devuelva un mensaje de error diferente en función de la condición. A continuación, se muestra un ejemplo de un error personalizado que se devuelve si el name o el valor de installationDate de la subestación son nulos.

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;

Evite la eliminación de una entidad con una regla de restricción.

Esta regla de atributo de restricción evita que se elimine una entidad a menos que se establezca el campo lifecyclestatus en "retirada". Si el valor de lifecyclestatus no es igual a "retirada", se devuelve un mensaje de error personalizado y la edición falla. La regla se activa con la operación de eliminación.

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

Ejemplos de reglas de atributos de validación

Devuelva un valor booleano para una regla de validación.

Las reglas de validación son mejores para los casos en los que desea detectar datos dañados, aunque no desea impedir que los editores completen su trabajo usando una regla de restricción. Puede evaluar reglas y crear errores para las entidades que vulneren la regla. Este es un ejemplo de subestaciones que exceden el valor máximo de Kva y se marcan como errores (se crean errores de polígono).

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

El siguiente ejemplo es una regla de validación creada en una clase de entidad de postes para garantizar que cuando el valor de structureheight sea 65 pies o más, el material se fabrique con acero. Se genera una entidad de error si esto no se cumple.

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

Ejemplos para todos los tipos de reglas

Identifique si se ha cambiado un valor de atributo específico.

Utilice la variable $originalfeature para hacer referencia a los atributos de una entidad antes de editar. Compare $originalfeature y $feature mediante el uso de Arcade para determinar si ha cambiado algún atributo de la entidad.

Ejemplo de sintaxis de Arcade utilizando $originalfeature para determinar si ha cambiado un atributo.

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

Ejemplo de sintaxis de Arcade utilizando $originalfeature para determinar si ha cambiado la geometría.

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

Ejemplo de sintaxis de Arcade utilizando $originalfeature para determinar si un atributo ha cambiado un 50 por ciento.

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

Identifique el desencadenador de eventos de edición como por ejemplo insertar, actualizar o eliminar.

Utilice la variable global $editcontext para hacer referencia a edit type en lógica de Arcade. Permite crear una regla de atributo con todos los eventos desencadenadores habilitados y agregar condiciones basadas en el tipo de edición.

Ejemplo de sintaxis de Arcade utilizando $editcontext para determinar el tipo de edición.

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
}