这是一个两步过程,因此,字段计算器不太适合它。最好在独立脚本中运行它。但是,只要您使用技巧,就可以在现场计算器中完成。您确实需要使用游标从排序列表中将所有值加载到全局字典中,但是仅在计算第一条记录时才需要。对于所有其他记录,您必须跳过字典的创建,以避免不断重读每一行的整个表。
必须将三个字段值放在一个元组中,以作为将正确排序的键。我将假定所有3字段组合值在SamplePoint表中都是唯一的,但是我添加了ObjectID以确保其唯一。您必须在第8行中提供路径和shapefile名称(否则,我可以使用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,Month和Day字段名称,因为它们仅在shapefile中起作用,而在地理数据库中则不允许。如果您尝试将地理数据库的名称添加到表属性中的字段列表中,则会将其更改为Year_1,Month_1,Day_1。
如果此表的目的是将其与多字段键上的另一个表/功能类相关联,请考虑使用我在博客中创建的名为“ 多字段键到单字段键的工具”的工具-将基于多个的两层相关领域