Il s'agit d'un processus en deux étapes et, par conséquent, la calculatrice de champ ne lui convient pas. Il est préférable de l'exécuter dans un script autonome. Cependant, cela peut être fait dans la calculatrice de terrain, à condition d'utiliser une astuce. Vous devez utiliser un curseur pour charger toutes les valeurs dans un dictionnaire global à partir d'une liste triée, mais uniquement lors du calcul du premier enregistrement. Pour tous les autres enregistrements, vous devez ignorer la création du dictionnaire pour éviter de relire constamment la table entière pour chaque ligne.
Les trois valeurs de champ doivent être placées dans un tuple pour agir comme une clé qui triera correctement. Je suppose que toutes les valeurs de combinaison à 3 champs sont uniques dans la table SamplePoint, mais j'ai ajouté l'ObjectID pour m'assurer qu'il est unique. Vous devez fournir le chemin et le nom du fichier de formes à la ligne 8 (ou je pourrais utiliser la technique que FelixIP utilise là où la première couche de la carte actuelle est utilisée). Si vous souhaitez utiliser différents champs pour une clé, vous devez modifier la liste des champs à la ligne 10 et les faire correspondre avec les champs d'entrée à la ligne 3 et à la ligne 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!)
Je ne recommanderais pas non plus d'utiliser les noms de champs Année, Mois et Jour, car ceux-ci ne fonctionnent que dans les fichiers de formes et ne sont pas autorisés dans les géodatabases. Une géodatabase changera les noms en Year_1, Month_1, Day_1 si vous essayez de les ajouter à la liste des champs dans les propriétés de la table.
Si le but de ce tableau est de le relier à une autre table / classe d'entités sur une clé multi-champs, envisagez d'utiliser l'outil que j'ai créé dans mon blog nommé Clé de champ multiple à l'outil de clé de champ unique - Relier deux couches basées sur plusieurs. Champ