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.

Consultez le profil Arcade propre aux règles attributaires pour en savoir plus sur l’utilisation, les variables de profil, le types de retour et bien plus encore.

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 NextSequenceValueArcade interroge la base de données pour obtenir la valeur suivante de la séquence en utilisant inputSequenceName de assetid_seq. Le champ assetID des entités insérées est rempli à l’aide du préfixe "Tx-" et de la valeur de séquence renvoyée.

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.

Expression de script pour utiliser une séquence nommée assetid_seq dans une géodatabase fichier :

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

Expression de script pour utiliser une séquence appartenant à l’utilisateur de carte nommé assetid_seq dans une géodatabase d’entreprise :

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

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. Pour les géodatabases d’entreprise, utilisez le nom qualifié complet de la séquence dans l’expression de script, par exemple, owner.sequencename.

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 est déclenchée par 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 la valeur assetID de Transformer(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 métriques 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

Lisez les enregistrements associés d’une classe de relations à l’aide de la fonction ArcadeFeatureSetByName.

Une règle de calcul est créée sur le champ InspectionCount dans la classe d’entités du poteau qui fait partie d’une classe de relations un vers plusieurs avec la table d’inspections. La fonction FeatureSetByName permet de lire directement la classe d’inspections et d’extraire les enregistrements associés lors de la mise à jour. L’utilisation de cette fonction Arcade nécessite de connaître le champ de la classe de relations. Pour cette classe de relations, la clé primaire d’origine est le champ globalID de la classe d’entités du poteau et la clé étrangère d’origine est le champ poleguid de la table autonome d’inspections.

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

Lisez un enregistrement associé d’une classe de relations à l’aide de la fonction ArcadeFeatureSetByRelationShipName.

Le même script permettant de lire les enregistrements associés d’une classe de relations peut être réécrit avec la fonction FeatureSetRelationshipName. Si vous utilisez cette fonction, vous n’avez pas besoin de connaître la clé étrangère, mais uniquement le nom de la relation, à savoir pole_inspection.

Attention :

Si vous utilisez cette fonction pour créer une règle attributaire, vérifiez que l’option Exclude from application evaluation (Exclure de l’évaluation de l’application) est activée.

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

Lisez un enregistrement associé d’une classe de relations à l’aide de la fonction ArcadeFeatureSetByRelationshipClass.

Le même script permettant de lire les enregistrements associés d’une classe de relations peut être réécrit avec la fonction FeatureSetByRelationshipClass. Si vous utilisez cette fonction, vous n’avez pas besoin de connaître la clé étrangère, mais uniquement le nom de la relation, à savoir pole_inspection. Cette fonction prenant en charge l’exécution à la fois côté serveur et client, les règles attributaires qui utilisent cette fonction peuvent être exécutées en local dans l’application.

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

Ajoutez un nouvel enregistrement associé pour une classe de relations lors d’une mise à jour.

Une règle de calcul permet de créer un nouvel enregistrement associé lorsque le champ de commentaire d’un poteau est mis à jour par l’utilisateur. Dans cette expression, le mot-clé du dictionnaire edit est utilisé pour créer un nouvel enregistrement d’inspection si le champ des commentaires est modifié. De même, vous pouvez mettre à jour ou supprimer des enregistrements associés. Pour plus d’informations, reportez-vous à la rubrique Mots-clés du dictionnaire de règles attributaires.

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

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 le champ name ou la valeur installationDate 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 la valeur lifecyclestatus n’est pas retirée, un message d’erreur personnalisé est renvoyé et la mise à jour échoue. La règle est déclenchée par l’opération de 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 la règle. Voici un exemple de sous-stations qui dépassent la valeur Kva maximale 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 valeur structureheight 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 $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 déterminer 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 déterminer 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 déterminer si un attribut a été modifié à 50 pour cent.

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 activés et d’ajouter des conditions selon le type de mise à jour.

Exemple de syntaxe Arcade utilisant $editcontext pour déterminer 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
}