A continuación se incluyen ejemplos de expresiones de script para reglas de atributos de cálculo, restricción y validación.
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
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 crea un transformador, la función de Arcade NextSequenceValue consulta a la base de datos para obtener el siguiente valor de secuencia y lo preserva en el campo assetID.
Para crear una secuencia a la que hacer referencia en una regla de atributos, utilice la herramienta Crear secuencia de base de datos. 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.
return "Tx-" + NextSequenceValue ("assetid")
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 ejecutará en operaciones de inserción y actualización. Si intenta crear un transformador en una subestación, la expresión de Arcade buscará el nombre de la subestación y utilizará el 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;
Puede crear una regla de cálculo que marque otras entidades para indicar que requieren cálculo o validación. Tras realizar un cálculo, la palabra clave calculationRequired o validationRequired se puede utilizar 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 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 }
] }
Puede utilizar reglas de atributos para realizar insertos, 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.'
}
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 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
Ejemplos de reglas de atributos 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)
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 nombre o la 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;
Esta regla de atributo de restricción evita que se elimine una entidad a menos que se establezca el campo lifecyclestatus en "retirada". Si lifecyclestatus no es igual a "retirada", se devuelve un mensaje de error personalizado y la edición falla. La regla se crea para desencadenarse 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
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 la cantidad máxima 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 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
Utilice la variable global $originalfeature para hacer referencia a los atributos de una entidad antes de realizar una edición. Compare $originalfeature y $feature a través de lógica de Arcade para determinar si se ha cambiado el atributo de una entidad.
Ejemplo de sintaxis de Arcade usando $originalfeature para comprobar 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 usando $originalfeature para comprobar si ha cambiado una 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 usando $originalfeature para comprobar si ha cambiado un atributo el 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 al tipo de edición en lógica de Arcade. Esto permite crear una regla de atributo con todos los eventos desencadenadores habilitados, aunque agregue condiciones basadas en el tipo de edición.
Ejemplo de sintaxis de Arcade usando $editcontext para comprobar 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
}