This issue or similar ones have been previously been reported to ESRI (Esri Case #03242592) by me. I thought it was fixed at 11.x. This was also reported to this group (with no solution) back in 2019 (arcpy.da.Editor Not Working Properly)
I am working on a project to develop best practices for migrating a series of tools that run in an ArcPro/Fabric GDB environment to an ArcPro/Fabric branched version environment (ArcProFabric 3.1+/Enterprise 11.1+). I am running into a consistently inconsistent problem with converting my Scripts/tools. Attached is a zip file the contains a toolbox with the tool (UpdateCogoArea) and associated python script (UpdateCoGoArea.py).
For selected taxlots this tool calculates two attributes (TaxlotFeet/TaxlotAcre) from the CalculatedArea field and calculates the MapAcres field from the Shape_Area field. It’s a simple calculation and the three attributes are required for our state standard.
Tool Requirements: ActiveBranchVersion, Selected Taxlots (Fabric) with the CalculatedArea field and the three required fields ('TaxlotAcre',"TaxlotFeet",'MapAcre’) all numeric/double. You can run this tool on your data if you add the fields and change the reference to your parcel fabric layer.
Options: Within the python script you can change how the tool runs. It can either use the CalculateFields tool or use “arcpy.da.Editor” with an update cursor. (Line 42/43) In the script (useCalcFields = True or False.)
Issues: The CalcFields Option works great. I do not set the edit environment etc. The UpdateCusor option causes strange results. When you run it a) the attributes are not updated (however if you open and close the session) they will be. b) if you spatially select the polygons and try to look at the attributes the table will come up with two records selected but you will NOT be able to see them (unless you open and close the project).
My Question?
To Test:
For those that do not want to to the test here the two alternative. Again CalculateFields works but UpdateCursor and edit session does not. I have included tool messages for reference after the following code.
# -------- This works ---------
if useCalcFields:
arcpy.management.CalculateFields(mapTaxlotLyr, "Python3",[["TaxlotAcre", "round(!CalculatedArea! / 43560,2)"],["TaxlotFeet", "round(!CalculatedArea!,2)"],["MapAcres", "round(!Shape__Area! / 43560,2)"]])
arcpy.AddMessage('Used CalcFields')
sys.exit('Calcone')
# ----------- This does NOT work ----------
# get workspace and version
thisProject = arcpy.mp.ArcGISProject("CURRENT")
Map= thisProject.activeMap
mapTaxlotLyr = Map.listLayers("Taxlot")[1]
# set data source and version (Not Needed for "CalcFields" but used with edit session)
MapLayerDataSource = mapTaxlotLyr.dataSource
lastslash = MapLayerDataSource.rfind("/")
WorkSpace = MapLayerDataSource[:lastslash]
arcpy.AddMessage("WorkSpace: " + WorkSpace)
AfterVEq = MapLayerDataSource.rfind("VERSION=") + 8
Version = MapLayerDataSource[AfterVEq:]
BeforeVID = Version.rfind(";")
Version = Version[:BeforeVID]
arcpy.AddMessage ("Version: " + str(Version))
# Do the edit
edit = arcpy.da.Editor(WorkSpace)
edit.startEditing(with_undo=False, multiuser_mode=True)
edit.startOperation()
with arcpy.da.UpdateCursor(mapTaxlotLyr,['CalculatedArea','shape__Area','TaxlotAcre',"TaxlotFeet",'MapAcres','Taxlot']) as cursor:
for row in cursor:
row[2] = 0
row[3] = 0
row[4] = 0
if row[0] != None:
row[2] = round(row[0] / 43560,2)
row[3] = round(row[0],2)
if row[1]!= None:
row[4] = round(row[1] / 43560,2)
arcpy.AddMessage('Taxlot: ' + row[5])
arcpy.AddMessage('TaxlotAcre: ' + str(row[2]))
arcpy.AddMessage('TaxlotFeet: ' + str(row[3]))
arcpy.AddMessage('MapAcre: ' + str(row[4]))
cursor.updateRow(row)
# End Edit Session
edit.stopOperation()
edit.stopEditing(save_changes=True)
Below are my messages referencing the version and versioned workspace...
I would VERY much appreciate ANY Help. Thanks
It has been pointed out to me that this could all be done with an attribute rule and YES it could be. BUT... this problem seems to happen whenever I use the da.editor environment with branched versioning. I selected this example because what cold be simpler then calculating three fields for a selected set of polygons.
Did someone from technical support examine the script?
Amir - thanks for checking. This is similar to the issue I reported at the meeting in Redlands (I was using append for that) and BUG-000156383 I worked for a couple of months with user support on the issue and they thought it would be fixed in 11.1. It appears to not be fixed. Tech support had a pretty hard time setting the environment up and then replicating the problem. In addition, the work around reported does not work consistently. I tried to explain that to support but they could not replicate my workaround issues. I developed by own work arounds for my append tool but having the similar issue happen with s simple calculate using update cursor is a whole lot more serious. I was hoping to validate that this is a problem with someone else before again starting the rather complicated interaction with technical support. (explaining the problem, providing them with all of our data, services setup, working with them to customize the tool work in there environment , etc). Again, thanks for checking.
I have completed a bit more testing. I created a tool/python script that allows me to select any layer from my active map. Once selected I can then select any field and value to assign to that field (see attached zip that contains tool and python). What I found is that it appears that the errors ONLY occur with ArcPro Fabric Layers and does NOT happen with other layers in the branched version feature service. Perhaps I am calling the service incorrectly for fabric layers? I will report this to technical services. But, please try out the tool. It should operate on any branched version service. If not the code I uses is:
Layer = arcpy.GetParameterAsText(0)
FieldName = arcpy.GetParameterAsText(5)
Value = arcpy.GetParameterAsText(6)
thisProject = arcpy.mp.ArcGISProject("CURRENT")
Map= thisProject.activeMap
MapLayer = Map.listLayers(Layer)[0]
MapLayerDataSource = MapLayer.dataSource
lastslash = MapLayerDataSource.rfind("/")
WorkSpace = MapLayerDataSource[:lastslash]
arcpy.AddMessage("WorkSpace: " + WorkSpace)
edit = arcpy.da.Editor(WorkSpace)
edit.startEditing(with_undo=False, multiuser_mode=True)
edit.startOperation()
with arcpy.da.UpdateCursor(MapLayer,[FieldName]) as cursor:
for row in cursor:
if row[0] != None:
arcpy.AddMessage(FieldName + ': ' + row[0])
row[0] = Value
arcpy.AddMessage('-- ' + FieldName + ': ' + row[0])
cursor.updateRow(row)
# End Edit Session
edit.stopOperation()
edit.stopEditing(save_changes=True)
Thanks I would appreciate any second opinion on this problem.