Jest to proces dwuetapowy, w wyniku czego Kalkulator polowy nie jest do niego dobrze dostosowany. Lepiej jest uruchomić to w samodzielnym skrypcie. Można to jednak zrobić w kalkulatorze polowym, pod warunkiem, że użyjesz podstępu. Musisz użyć kursora, aby załadować wszystkie wartości do słownika globalnego z posortowanej listy, ale tylko podczas obliczania pierwszego rekordu. W przypadku wszystkich innych rekordów musisz pominąć tworzenie słownika, aby uniknąć ciągłego ponownego czytania całej tabeli dla każdego wiersza.
Trzy wartości pól muszą być umieszczone w krotce, aby działały jak klucz, który będzie poprawnie sortowany. Zakładam, że wszystkie wartości kombinacji 3 pól są unikalne w tabeli SamplePoint, ale dodałem ObjectID, aby upewnić się, że jest unikalny. Musisz podać ścieżkę i nazwę pliku kształtu w wierszu 8 (lub mógłbym użyć techniki, której używa FelixIP, gdy używana jest pierwsza warstwa na bieżącej mapie). Jeśli chcesz użyć różnych pól dla klucza, musisz zmienić listę pól w linii 10 i dopasować je do pól wejściowych w linii 3 i 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!)
Nie polecałbym także używania nazw pól Rok, Miesiąc i Dzień, ponieważ działają one tylko w plikach kształtów i nie są dozwolone w geobazach. Geobaza danych zmieni nazwy na Rok_1, Miesiąc_1, Dzień_1, jeśli spróbujesz dodać je do listy pól we właściwościach tabeli.
Jeśli celem tej tabeli jest powiązanie jej z inną tabelą / klasą funkcji na kluczu z wieloma polami, rozważ użycie narzędzia, które utworzyłem na swoim blogu o nazwie Klucz z wieloma polami do klucza z jednym polem - Powiązanie dwóch warstw na podstawie więcej niż jednej Pole