Примеры выражений скриптов атрибутивных правил

Ниже приведены примеры выражений скриптов для правил атрибутов вычисления, ограничения и проверки.

См. соответствующий профиль Arcade для правил атрибутов, чтобы получить дополнительную информацию об использовании, переменных профиля, типах возвращаемых данных и другие сведения.

Изучите репозиторий Esri GitHub, чтобы ознакомиться с другими примерами выражений скриптов Arcade для правил атрибутов.

Примеры правил атрибутов вычисления

Примеры правил атрибутов ограничений

Примеры правил атрибутов ограничений

Примеры для всех типов правил

Примеры правил атрибутов вычисления

Создать ID путем увеличения последовательности.

Правило немедленного вычисления создается в поле assetID в классе объектов трансформаторов и запускается при операциях вставка, редактирование. Когда вы создаете трансформатор, функция NextSequenceValue Arcade направляет запрос к базе данных о следующем значении последовательности, используя при этом inputSequenceName из assetid_seq. Поле assetID для вставленных объектов будет заполнено префиксом "Tx-" и возвращаемым значением последовательности.

Чтобы создать последовательность для ссылки на правила атрибутов, используйте инструмент Создать последовательность баз данных.

Выражение скрипта для использования последовательности с именем assetid_seq в файловой базе геоданных:

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

Выражение скрипта для использования последовательности, принадлежащей пользователю карты под именем assetid_seq в многопользовательской базе геоданных:

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

При использовании последовательностей в выражении скрипта убедитесь, что опция Исключить из оценки приложения задана как true. Для многопользовательских баз геоданных используйте в выражении скрипта полное имя последовательности, например, owner.sequencename.

Возвратить заданное пользователем сообщение об ошибке для правила вычисления.

Бывает необходимо, чтобы правило вычисления возвращало заданное пользователем сообщение об ошибке в виде сбоя, если условие не выполняется. В этом примере создается правило немедленного вычисления для заполнения поля (FacilityID) на основе пересекающей подстанции. Это правило срабатывает при выполнении операций вставки и обновления. Если вы попытаетесь создать трансформатор в подстанции, выражение Arcade извлечет имя этой подстанции и использует значение assetID трансформатора для создания полного поля FacilityID (SubstationName-AssetID). Если трансформатор будет создан вне подстанции или перенесен за ее пределы, скрипт вернет сообщение о пользовательской ошибке, используя ключевое слово 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;

Отметить объект как требующий оценки.

Можно создать правило вычисления, согласно которому другие объекты будут отмечены как требующие вычисления или проверки. При выполнении вычисления в словаре могут использоваться ключевые слова calculationRequired или validationRequired, которые будут служить для сброса Статуса проверки атрибута одного или нескольких объектов. Это используется, когда один класс объектов зависит от другого. В данном примере поле assetID в классе объектов Трансформатор зависит от класса объектов пересекающая Подстанция. В поле yearName класса объектов Подстанция будет создано правило вычисления. Когда имя этой подстанции будет обновлено, новое имя и текущий год будут сохранены в поле yearName. Как часть этой логики, все трансформаторы, пересекающие подстанцию в классе объектов Трансформатор, будут помечены как требующие вычисления. Для класса Трансформатор существует правило пакетного вычисления, которое вычислит значение Трансформатора assetID при последующей обработке правила и покажет новое имя и год этой подстанции.

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

Редактировать другой класс объектов с помощью правила вычисления.

Вы можете использовать правила атрибутов для выполнения операций вставки, обновления и удаления в другой класс объектов с помощью ключевого слова словаря edit. Ниже приведен пример правила вычисления для текстового поля класса объектов границ районов. При редактировании полигона класса объектов границ районов это правило атрибута обновит все пересекаемые точки адресов с именем района.

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

Редактировать геометрию объекта с помощью правила вычисления.

Создать правило вычисления в поле shape набора данных для внесения изменений в геометрию объекта. В этом примере скрипта геометрия точечного объекта изменена таким образом, чтобы он находился в 5 метрических единицах от первого объекта в pointClass1.

Внимание:

Пространственная привязка возвращаемой геометрии должна соответствовать пространственной привязке набора данных, содержащего правило атрибута.

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

Прочитайте соответствующие записи для класса отношений с помощью функции FeatureSetByName Arcade.

Правило вычисления создается для поля InspectionCount в классе объектов опор, который участвует в классе отношений один ко многим с таблицей проверки. Для непосредственного считывания класса проверки и извлечения связанных записей при обновлении можно использовать функцию FeatureSetByName. Для использования этой функции Arcade необходимо знать поле класса отношений. Для этого класса отношений исходным первичным ключом является опора globalID класса объектов опор, а исходным внешним ключом является poleguid автономной таблицы проверки.

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

Читайте соответствующую запись для класса отношений с помощью функции FeatureSetByRelationShipName Arcade.

Тот же скрипт для чтения связанных записей для класса отношений можно переписать с помощью функции FeatureSetRelationshipName. Используя эту функцию, вам необязательно знать внешний ключ, только имя отношения, pole_inspection.

Внимание:

При использовании этой функции для создания правила атрибута убедитесь, что для параметра Исключить из оценки приложения установлено значение 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)

Читайте соответствующую запись для класса отношений с помощью функции FeatureSetByRelationshipClass Arcade.

Тот же скрипт для чтения связанных записей из класса отношений можно переписать с помощью функции FeatureSetByRelationshipClass. Используя эту функцию, вам необязательно знать внешний ключ, только имя отношения, pole_inspection. Эта функция поддерживает выполнение как на стороне сервера, так и на стороне клиента, поэтому правила атрибутов, использующие эту функцию, могут выполняться локально в приложении.

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

Добавьте новую связанную запись для класса отношений при обновлении редактирования.

Правило вычисления используется для создания новой связанной записи, когда поле комментария столба обновляется пользователем. В этом выражении для создания новой записи проверки используется ключевое словарное слово edit, если поле с комментариями изменится. Аналогично можно обновлять или удалять связанные записи. Дополнительную информацию см. в разделе Ключевые слова словаря правил атрибутов.

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

Примеры правил атрибутов ограничений

Возвратить логическое значение для правила ограничения.

Это правило атрибута ограничения создается в классе подстанции и запускается с операциями вставки и обновления. Если имя подстанции пустое, то выражение вернет false и завершится ошибкой. Если имя подстанции не будет пустым, то выражение вернет значение true и позволит продолжить редактирование.

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

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

Возвратить заданное пользователем сообщение об ошибке для правила ограничения.

В некоторых случаях вам нужно, чтобы правило атрибута ограничения возвращало другое сообщение об ошибке, в зависимости от условия. Ниже приведен пример, когда возвращается пользовательская ошибка, если для подстанции значения name или installationDate равны нулю.

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;

Предотвратите удаление объекта с помощью правила ограничения.

Это правило ограничения атрибутов предотвращает удаление объекта, если для поля lifecyclestatus не установлено значение Устарело. Если значение lifecyclestatus отлично от Устарело, появится сообщение об ошибке, и операция редактирования не удастся. Это правило запускается операцией удаления.

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

Примеры правил атрибутов ограничений

Возвратить логическое значение для правила проверки.

Правила проверки лучше всего подходят для случаев, когда требуется обнаружить поврежденные данные, но вы не хотите мешать редакторам выполнять свою работу с помощью правила ограничения. Вы можете анализировать правила и создавать ошибки для объектов, которые нарушают это правило. Это - пример подстанций, у которых превышено максимальное значение кВА и которые помечены как ошибки (создаются полигональные ошибки).

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

Следующий пример представляет собой правило проверки, созданное для класса объектов опор, которое позволяет гарантировать, что при значении structureheight 65 футов или выше в качестве материала изготовления должна использоваться сталь. Если это правило не выполняется, создается объект-ошибка.

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

Примеры для всех типов правил

Определите, изменилось ли определенное значение атрибута.

Используйте переменную $originalfeature, ссылающуюся на атрибуты объекта перед редактированием. Сравните $originalfeature и $feature с помощью Arcade, чтобы определить, изменился ли атрибут пространственного объекта.

Пример синтаксиса Arcade, в котором для того, чтобы определить, изменился ли атрибут, используется $originalfeature.

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

Пример синтаксиса Arcade, в котором для того, чтобы определить, изменилась ли геометрия, используется $originalfeature.

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

Пример синтаксиса Arcade, в котором для того, чтобы определить, изменился ли атрибут на 50 процентов, используется $originalfeature.

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

Определите триггер события редактирования, например вставка, обновление или удаление.

Используйте глобальную переменную $editcontext global variable, ссылающуюся на edit type в логике Arcade. Это позволит создать одно правило атрибута, в котором активированы все триггерные события, и добавлять условия в зависимости от типа редактирования.

Пример синтаксиса Arcade, в котором для определения типа редактирования используется $editcontext.

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
}