Это двухэтапный процесс, и, как следствие, Калькулятор поля не очень подходит для него. Лучше запустить это в автономном скрипте. Однако это можно сделать в полевом калькуляторе, если вы используете хитрость. Вам нужно использовать курсор для загрузки всех значений в глобальный словарь из отсортированного списка, но только во время вычисления первой записи. Для всех остальных записей вы должны пропустить создание словаря, чтобы избежать постоянного перечитывания всей таблицы для каждой строки.
Три значения поля должны быть помещены в кортеж, чтобы они действовали как ключ, который будет правильно сортироваться. Я предполагаю, что все значения комбинации из 3 полей уникальны в таблице SamplePoint, но я добавил ObjectID, чтобы убедиться, что он уникален. Вы должны указать путь и имя шейп-файла в строке 8 (или я мог бы использовать технику, которую использует FelixIP, когда используется первый слой на текущей карте). Если вы хотите использовать разные поля для ключа, вы должны изменить список полей в строке 10 и сопоставить их с полями ввода в строке 3 и строке 15.
#Pre-logic Script Code:
relateDict = {}
def autoIncrement(myYear, myMonth, myDay, OID):
global relateDict
# only populate the dictionary if it has no keys
if len(relateDict) == 0:
# Provide the path to the relate feature class/table
relateFC = r"C:\Users\OWNER\Documents\ArcGIS\SamplePoints.shp"
# create a field list with the relate fields in sort order
relateFieldsList = ["Year", "Month", "Day", "OID@"]
# process a da search cursor to transfer the data to the dictionary
relateList = sorted([(r[0:]) for r in arcpy.da.SearchCursor(relateFC, relateFieldsList)])
for relateSort in range(0, len(relateList)):
relateDict[relateList[relateSort]] = relateSort + 1
return relateDict[(myYear,myMonth,myDay,OID)]
#Expression:
autoIncrement(!Year!, !Month!, !Day!, !OBJECTID!)
Я также не рекомендовал бы использовать имена полей Год, Месяц и День, поскольку они работают только в шейп-файлах и не допускаются в базах геоданных. База геоданных изменит имена на Year_1, Month_1, Day_1, если вы попытаетесь добавить их в список полей в свойствах таблицы.
Если цель этой таблицы состоит в том, чтобы связать ее с другим классом таблиц / пространственных объектов по многопольному ключу, рассмотрите возможность использования инструмента, созданного в моем блоге, под названием « Ключ от нескольких полей к ключу одного поля» - связать два слоя на основе более чем одного поле