Exemples d’expressions de script des règles attributaires

Voici quelques exemples d’expressions de script pour les règles attributaires de calcul, de contrainte et de validation.

Reportez-vous au référentiel EsriGitHub pour obtenir davantage d’exemples d’expressions de script Arcade pour les règles attributaires.

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

Générez un ID en incrémentant une séquence.

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 en utilisant inputSequenceName de assetid_seq.

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_seq")

Renvoyez un message d’erreur personnalisé pour une règle de calcul.

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 s’exécute lors des opérations d’insertion et de mise à jour. Si vous tentez de créer un transformateur dans une sous-station, l’expression Arcade récupère 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é avec le 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;

Marquez une autre entité comme nécessitant une évaluation.

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. Au moment d’effectuer un calcul, vous pouvez utiliser le mot-clé calculationRequired ou validationRequired dans un dictionnaire pour réinitialiser l’attribut Validation Status (Statut de validation) pour une ou 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
           }
       ]
   }

Mettez à jour une autre classe d’entités avec une règle de calcul.

Vous pouvez utiliser des règles attributaires pour effectuer des insertions, des mises à jour et des suppressions dans une autre classe d’entités en utilisant le mot-clé de 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.'
}

Mettez à jour la géométrie d’une entité avec une règle de calcul.

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

Renvoyez une valeur booléenne pour une règle 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)

Renvoyez un message d’erreur personnalisé pour une règle de contrainte.

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;

Empêchez la suppression d’une entité avec une règle de contrainte.

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

Renvoyez une valeur booléenne pour une règle 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

Identifiez si une valeur attributaire spécifique a été modifiée.

Utilisez la variable globale $originalfeature pour faire référence aux attributs d’une entité avant une mise à jour. Comparez $originalfeature et $feature via 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é de 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 edit type 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 et 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
}