Voici quelques exemples d’expressions de script pour les règles attributaires de calcul, de contrainte et de validation.
Exemples de règles attributaires de calcul
Exemples de règles attributaires de contrainte
Exemples de règles attributaires de validation
Exemples pour tous les types de règles
Exemples de règles attributaires de calcul
Une règle de calcul immédiat est créée sur le champ assetID de la classe d’entités transformateur et déclenchée à l’insertion et à la mise à jour. Lorsque vous créez un transformateur, la fonction Arcade NextSequenceValue interroge la base de données pour obtenir la valeur suivante de la séquence et la conserve dans le champ assetID.
Pour créer une séquence de référence dans une règle attributaire, utilisez l’outil Créer une séquence de base de données. Lorsque vous utilisez des séquences dans l’expression de script, vérifiez que l’option Exclude from application evaluation (Exclure de l’évaluation de l’application) est activée.
return "Tx-" + NextSequenceValue ("assetid")
Dans certains cas, il peut être souhaitable qu’une règle de calcul renvoie un message d’erreur personnalisé (échec) lorsqu’une condition n’est pas remplie. Dans cet exemple, une règle de calcul immédiat est créée pour remplir le champ (FacilityID) en fonction de la sous-station sécante. La règle est exécutée à l’insertion et à la mise à jour. Si vous tentez de créer un transformateur dans la sous-station, l’expression Arcade extrait le nom de la sous-station et utilise la valeur assetID du transformateur pour construire le champ FacilityID complet (SubstationName-AssetID). Si le transformateur est créé ou déplacé en dehors d’une sous-station, le script renvoie un message d’erreur personnalisé à l’aide du mot-clé 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;
Vous pouvez créer une règle de calcul qui signale les autres entités comme des entités nécessitant un calcul ou une validation. Pendant un calcul, le mot-clé calculationRequired ou validationRequired peut être utilisé dans un dictionnaire pour réinitialiser l’attribut Validation Status (Statut de validation) d’une ou de plusieurs entités. Cela s’avère utile lorsqu’une classe d’entités dépend d’une autre classe d’entités. Dans cet exemple, le champ AssetID de la classe d’entités Transformer (Transformateur) dépend de la classe d’entités Substation (Sous-station). Une règle de calcul est créée sur le champ yearName de la classe d’entités Substation (Sous-station). Une fois le nom de la sous-station mis à jour, le nouveau nom et l’année en cours sont stockés dans le champ yearName. Selon cette logique, tous les transformateurs coupant la sous-station de la classe d’entités transformateur sont signalés comme nécessitant un calcul. Il existe une règle de calcul par lots sur la classe Transformer (Transformateur) qui calcule l’élément Transformer AssetID (ID ressource du transformateur) lors de l’évaluation suivante pour refléter le nouveau nom et l’année de la sous-station.
//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 }
] }
Vous pouvez utiliser des règles attributaires pour procéder à des insertions, des mises à jour et des suppressions dans une autre classe d’entités en utilisant le mot-clé du dictionnaire edit. L’exemple ci-dessous est une règle de calcul portant sur un champ de texte d’une classe d’entités de limites d’un secteur. Lors de la mise à jour d’un polygone dans la classe d’entités comportant les limites des secteurs, cette règle attributaire met à jour les points d’adresse formant une intersection avec le nom du secteur.
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.'
}
Créez une règle de calcul sur le champ de forme d’un jeu de données pour apporter des modifications à la géométrie d’une entité. Dans cet exemple de script, la géométrie d’une entité ponctuelle est modifiée pour se trouver à 5 unités de la première entité dans pointClass1.
Attention :
La référence spatiale de la géométrie renvoyée doit correspondre à la référence spatiale du jeu de données contenant la règle attributaire.
//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
Exemples de règles attributaires de contrainte
Cette règle attributaire de contrainte est créée sur la classe sous-station et définie pour se déclencher à l’insertion et à la mise à jour. Si le nom de la sous-station est vide, l’expression renvoie la valeur false (faux) et échoue. Si le nom de la sous-station n’est pas vide, l’expression renvoie la valeur true (vrai) et autorise le traitement de la mise à jour.
if ($feature.name == null) return false;
else return true;
//another way of writing it return !($feature.name == null)
Dans certains cas, vous pouvez souhaiter que la règle attributaire de contrainte renvoie un autre message d’erreur en fonction de la condition. Voici l’exemple d’une erreur personnalisée renvoyée si l’attribut name (nom) ou installationDate (date d’installation) de la sous-station a la valeur null (nul/nulle).
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;
Cette règle attributaire de contrainte empêche la suppression d’une entité, sauf si le champ lifecyclestatus est défini comme étant retiré. Si lifecyclestatus n’est pas retiré, un message d’erreur personnalisé est renvoyé et la mise à jour échoue. La règle est créée pour être déclenchée lors de la suppression.
if ($feature.lifecyclestatus == 'retired') {
return true;
}
return {'errorMessage': 'You are not allowed delete a feature until it is retired'};
Exemples de règles attributaires de validation
Les règles de validation sont un choix judicieux pour détecter des données altérées sans pour autant empêcher les éditeurs d’effectuer leur travail via une règle de contrainte. Vous pouvez ainsi évaluer des règles et créer des erreurs pour les entités qui ne respectent pas une règle. Voici un exemple de sous-stations qui dépassent la puissance maximale en kva et qui sont signalées comme des erreurs (des erreurs de polygone sont créées).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
L’exemple suivant représente une règle de validation créée sur une classe d’entités pylônes pour garantir l’utilisation de l’acier lorsque la hauteur de la structure est supérieure ou égale à 65 pieds (environ 20 mètres). Si ce n’est pas le cas, une entité d’erreur est générée.if ($feature.structureheight >= 65) {
If (DomainName($feature, 'Material') == 'Steel') { return true; }
else { return false; }
}
Else
{ return true; }
Exemples pour tous les types de règles
Utilisez la variable globale $originalfeature pour référencer les attributs d’une entité avant une mise à jour. Comparez $originalfeature à $feature via la logique Arcade pour déterminer si l’attribut d’une entité a été modifié.
Exemple de syntaxe Arcade utilisant $originalfeature pour vérifier si un attribut a été modifié.
if ($feature.field == $originalfeature.field) {
//code if field attribute hasn't changed
} else {
//code if field attribute has changed.
}
Exemple de syntaxe Arcade utilisant $originalfeature pour vérifier si la géométrie a été modifiée.
if (Equals(Geometry($feature), Geometry($originalfeature))) {
//code if geometry hasn't changed
} else {
//code if geometry has changed
}
Exemple de syntaxe Arcade utilisant $originalfeature pour vérifier si un attribut a été modifié à 50 %.
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%
}
}
Identifiez le déclencheur d’événement de mise à jour, comme une insertion, une mise à jour ou une suppression.
Utilisez la variable globale $editcontext pour référencer le type de mise à jour dans la logique Arcade. Cela vous permet de créer une règle attributaire avec tous les événements déclencheurs d’événement activés, mais d’ajouter des conditions selon le type de mise à jour.
Exemple de syntaxe Arcade utilisant $editcontext pour vérifier le type de mise à jour.
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
}
Vous avez un commentaire à formuler concernant cette rubrique ?