<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Update Cursor not deleting all necessary features in AGOL Feature Layer in ArcGIS Online Questions</title>
    <link>https://community.esri.com/t5/arcgis-online-questions/update-cursor-not-deleting-all-necessary-features/m-p/1229558#M48768</link>
    <description>&lt;P&gt;Hi All,&lt;/P&gt;&lt;P&gt;I have taxlot data stored in AGOL with related tables, and I have a piece of code that finds and deletes records in the related tables that are not related to a record in the taxlot data. This is ultimately achieved using an update cursor. The code works perfectly on locally stored data, but the issue arises when I try to enact the script on hosted feature layers/tables in AGOL. It will get to 8000 records and then move on to the next table, regardless of how many records there actually are to process. Can anyone determine if I am missing something?&lt;/P&gt;&lt;PRE&gt;&lt;SPAN&gt;def &lt;/SPAN&gt;main(taxlots: object&lt;SPAN&gt;, &lt;/SPAN&gt;tables: list[object]&lt;SPAN&gt;, &lt;/SPAN&gt;taxlotJoinField: str&lt;SPAN&gt;, &lt;/SPAN&gt;tableJoinField: str&lt;SPAN&gt;, &lt;/SPAN&gt;actuallyDelete: bool) -&amp;gt; &lt;SPAN&gt;None&lt;/SPAN&gt;:&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;# Used for debugging progress bars if the script runs too fast to see them&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;def &lt;/SPAN&gt;insertDelay() -&amp;gt; &lt;SPAN&gt;None&lt;/SPAN&gt;:&lt;BR /&gt;        &lt;SPAN&gt;#time.sleep(0.0005)&lt;BR /&gt;&lt;/SPAN&gt;        &lt;SPAN&gt;pass&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;    arcpy.AddMessage(&lt;SPAN&gt;f"Actually delete: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;actuallyDelete&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;    arcpy.AddMessage(&lt;SPAN&gt;f"Analyzing Taxlots Feature Class: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;taxlots&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;    arcpy.SetProgressor(&lt;SPAN&gt;"default"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;"Counting rows..."&lt;/SPAN&gt;)&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;# Find the expected counts, for showing a progress bar&lt;BR /&gt;&lt;/SPAN&gt;    expectedTaxlotCount: int = int(arcpy.GetCount_management(taxlots)[&lt;SPAN&gt;0&lt;/SPAN&gt;])&lt;BR /&gt;&lt;BR /&gt;    arcpy.AddMessage(&lt;SPAN&gt;f"Taxlot Count (in table): &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;expectedTaxlotCount&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;BR /&gt;    taxlotCount = &lt;SPAN&gt;0&lt;BR /&gt;&lt;/SPAN&gt;    mapTaxlotNumbers: set[str] = set()&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;# Find the taxlot keys&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;with &lt;/SPAN&gt;arcpy.da.SearchCursor(taxlots&lt;SPAN&gt;, &lt;/SPAN&gt;[taxlotJoinField]) &lt;SPAN&gt;as &lt;/SPAN&gt;cursor:&lt;BR /&gt;        &lt;SPAN&gt;for &lt;/SPAN&gt;row &lt;SPAN&gt;in &lt;/SPAN&gt;cursor:&lt;BR /&gt;&lt;BR /&gt;            arcpy.SetProgressor(&lt;SPAN&gt;"step"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;f"Collecting taxlots: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;taxlotCount + &lt;SPAN&gt;1&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt; / &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;expectedTaxlotCount&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;min_range=&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;max_range=expectedTaxlotCount)&lt;BR /&gt;            arcpy.SetProgressorPosition(taxlotCount)&lt;BR /&gt;&lt;BR /&gt;            insertDelay()&lt;BR /&gt;&lt;BR /&gt;            taxlotCount += &lt;SPAN&gt;1&lt;BR /&gt;&lt;/SPAN&gt;            mapTaxlotNumbers.add(row[&lt;SPAN&gt;0&lt;/SPAN&gt;])&lt;BR /&gt;    &lt;BR /&gt;    arcpy.AddMessage(&lt;SPAN&gt;f"Collected Taxlots: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;taxlotCount&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;    &lt;BR /&gt;    &lt;SPAN&gt;# For each table, delete rows that aren't in the taxlot keys above&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;for &lt;/SPAN&gt;tableIndex&lt;SPAN&gt;, &lt;/SPAN&gt;table &lt;SPAN&gt;in &lt;/SPAN&gt;enumerate(tables):&lt;BR /&gt;        arcpy.AddMessage(&lt;SPAN&gt;f"Processing table: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;table&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;BR /&gt;        expectedCount = int(arcpy.GetCount_management(table)[&lt;SPAN&gt;0&lt;/SPAN&gt;])&lt;BR /&gt;&lt;BR /&gt;        includedCount = &lt;SPAN&gt;0&lt;BR /&gt;&lt;/SPAN&gt;        excludedCount = &lt;SPAN&gt;0&lt;BR /&gt;&lt;/SPAN&gt;        totalCount = &lt;SPAN&gt;0&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;        &lt;SPAN&gt;with &lt;/SPAN&gt;arcpy.da.UpdateCursor(table&lt;SPAN&gt;, &lt;/SPAN&gt;[tableJoinField]) &lt;SPAN&gt;as &lt;/SPAN&gt;cursor:&lt;BR /&gt;            &lt;SPAN&gt;for &lt;/SPAN&gt;row &lt;SPAN&gt;in &lt;/SPAN&gt;cursor:&lt;BR /&gt;&lt;BR /&gt;                arcpy.SetProgressor(&lt;SPAN&gt;"step"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;f"Processing table &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;tableIndex + &lt;SPAN&gt;1&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt; / &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;len(tables)&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;totalCount + &lt;SPAN&gt;1&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt; / &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;expectedCount&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;min_range=&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;max_range=expectedCount)&lt;BR /&gt;                arcpy.SetProgressorPosition(totalCount)&lt;BR /&gt;&lt;BR /&gt;                totalCount += &lt;SPAN&gt;1&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;                insertDelay()&lt;BR /&gt;&lt;BR /&gt;                &lt;SPAN&gt;if &lt;/SPAN&gt;row[&lt;SPAN&gt;0&lt;/SPAN&gt;] &lt;SPAN&gt;in &lt;/SPAN&gt;mapTaxlotNumbers:&lt;BR /&gt;                    includedCount += &lt;SPAN&gt;1&lt;BR /&gt;&lt;/SPAN&gt;                &lt;SPAN&gt;else&lt;/SPAN&gt;:&lt;BR /&gt;                    excludedCount += &lt;SPAN&gt;1&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;                    &lt;SPAN&gt;if &lt;/SPAN&gt;actuallyDelete:&lt;BR /&gt;                        cursor.deleteRow()&lt;BR /&gt;        &lt;BR /&gt;        arcpy.AddMessage(&lt;SPAN&gt;f"&lt;/SPAN&gt;&lt;SPAN&gt;\t&lt;/SPAN&gt;&lt;SPAN&gt;Rows in taxlots layer: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;includedCount&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}\n\t&lt;/SPAN&gt;&lt;SPAN&gt;Not in layer: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;excludedCount&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}\n\t&lt;/SPAN&gt;&lt;SPAN&gt;Total: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;totalCount&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}\n\t&lt;/SPAN&gt;&lt;SPAN&gt;Excess deleted: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;actuallyDelete&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;    &lt;BR /&gt;    arcpy.AddMessage(&lt;SPAN&gt;"Processing complete!"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;class &lt;/SPAN&gt;DeleteNonAssociatedTaxlotRows(object):&lt;BR /&gt;    &lt;SPAN&gt;"""A script tool class for ArcGIS"""&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;def &lt;/SPAN&gt;__init__(self) -&amp;gt; &lt;SPAN&gt;None&lt;/SPAN&gt;:&lt;BR /&gt;        self.label = &lt;SPAN&gt;"Delete Non Associated Taxlot Rows"&lt;BR /&gt;&lt;/SPAN&gt;        self.description = &lt;SPAN&gt;"Deletes related table rows that are not associated with a taxlots layer."&lt;BR /&gt;&lt;/SPAN&gt;        self.canRunInBackground = &lt;SPAN&gt;False&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;    &lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;    def &lt;/SPAN&gt;getParameterInfo(self) -&amp;gt; list[arcpy.Parameter]:&lt;BR /&gt;&lt;BR /&gt;        taxlotsParam = arcpy.Parameter(&lt;BR /&gt;            name=&lt;SPAN&gt;"Taxlots"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            displayName=&lt;SPAN&gt;"Taxlots"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            direction=&lt;SPAN&gt;"Input"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            datatype=&lt;SPAN&gt;"DEFeatureClass"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            parameterType=&lt;SPAN&gt;"Required"&lt;/SPAN&gt;)&lt;BR /&gt;        &lt;BR /&gt;        tablesParam = arcpy.Parameter(&lt;BR /&gt;            name=&lt;SPAN&gt;"Tables"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            displayName=&lt;SPAN&gt;"Tables"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            direction=&lt;SPAN&gt;"Input"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            datatype=&lt;SPAN&gt;"Table"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            parameterType=&lt;SPAN&gt;"Required"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            multiValue=&lt;SPAN&gt;True&lt;/SPAN&gt;)&lt;BR /&gt;        &lt;BR /&gt;        taxlotJoinFieldParam = arcpy.Parameter(&lt;BR /&gt;            name=&lt;SPAN&gt;"TaxlotJoinField"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            displayName=&lt;SPAN&gt;"Taxlot Join Field"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            direction=&lt;SPAN&gt;"Input"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            datatype=&lt;SPAN&gt;"GPString"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            parameterType=&lt;SPAN&gt;"Required"&lt;/SPAN&gt;)&lt;BR /&gt;        &lt;BR /&gt;        tableJoinFieldParam = arcpy.Parameter(&lt;BR /&gt;            name=&lt;SPAN&gt;"TableJoinField"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            displayName=&lt;SPAN&gt;"Table Join Field"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            direction=&lt;SPAN&gt;"Input"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            datatype=&lt;SPAN&gt;"GPString"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            parameterType=&lt;SPAN&gt;"Required"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;BR /&gt;        actuallyDeleteParam = arcpy.Parameter(&lt;BR /&gt;            name=&lt;SPAN&gt;"ActuallyDelete"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            displayName=&lt;SPAN&gt;"Actually Delete"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            direction=&lt;SPAN&gt;"Input"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            datatype=&lt;SPAN&gt;"GPBoolean"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            parameterType=&lt;SPAN&gt;"Required"&lt;/SPAN&gt;)&lt;BR /&gt;        &lt;BR /&gt;        taxlotJoinFieldParam.value = &lt;SPAN&gt;"MapTaxlot"&lt;BR /&gt;&lt;/SPAN&gt;        tableJoinFieldParam.value = &lt;SPAN&gt;"MapTaxlot"&lt;BR /&gt;&lt;/SPAN&gt;        actuallyDeleteParam.value = &lt;SPAN&gt;False&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;        return &lt;/SPAN&gt;[taxlotsParam&lt;SPAN&gt;, &lt;/SPAN&gt;tablesParam&lt;SPAN&gt;, &lt;/SPAN&gt;taxlotJoinFieldParam&lt;SPAN&gt;, &lt;/SPAN&gt;tableJoinFieldParam&lt;SPAN&gt;, &lt;/SPAN&gt;actuallyDeleteParam]&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;def &lt;/SPAN&gt;isLicensed(self) -&amp;gt; bool:&lt;BR /&gt;        &lt;SPAN&gt;return True&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;    def &lt;/SPAN&gt;updateParameters(self&lt;SPAN&gt;, &lt;/SPAN&gt;parameters: list[arcpy.Parameter]):&lt;BR /&gt;        &lt;SPAN&gt;return&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;    def &lt;/SPAN&gt;updateMessages(self&lt;SPAN&gt;, &lt;/SPAN&gt;parameters: list[arcpy.Parameter]):&lt;BR /&gt;        &lt;SPAN&gt;return&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;    def &lt;/SPAN&gt;execute(self&lt;SPAN&gt;, &lt;/SPAN&gt;parameters: list[arcpy.Parameter]&lt;SPAN&gt;, &lt;/SPAN&gt;messages):&lt;BR /&gt;        taxlots = parameters[&lt;SPAN&gt;0&lt;/SPAN&gt;].value&lt;BR /&gt;        tables = parameters[&lt;SPAN&gt;1&lt;/SPAN&gt;].values&lt;BR /&gt;        taxlotJoinField: str = parameters[&lt;SPAN&gt;2&lt;/SPAN&gt;].value&lt;BR /&gt;        tableJoinField: str = parameters[&lt;SPAN&gt;3&lt;/SPAN&gt;].value&lt;BR /&gt;        actuallyDelete: bool = parameters[&lt;SPAN&gt;4&lt;/SPAN&gt;].value == &lt;SPAN&gt;True&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;        &lt;SPAN&gt;#arcpy.AddMessage(f"String: Taxlots: {taxlots}, Tables: {tables}")&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;        #arcpy.AddMessage(f"Type: Taxlots: {type(taxlots).__name__}, Tables: {type(tables).__name__}")&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;        #arcpy.AddMessage(f"Table count: {len(tables)}, tables[0]: {tables[0]}, type(tables[0]).__name__: {type(tables[0]).__name__}")&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;        main(taxlots&lt;SPAN&gt;, &lt;/SPAN&gt;tables&lt;SPAN&gt;, &lt;/SPAN&gt;taxlotJoinField&lt;SPAN&gt;, &lt;/SPAN&gt;tableJoinField&lt;SPAN&gt;, &lt;/SPAN&gt;actuallyDelete)&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;def &lt;/SPAN&gt;postExecute(self&lt;SPAN&gt;, &lt;/SPAN&gt;parameters: list[arcpy.Parameter]):&lt;BR /&gt;        &lt;SPAN&gt;return&lt;/SPAN&gt;&lt;/PRE&gt;</description>
    <pubDate>Tue, 08 Nov 2022 16:03:45 GMT</pubDate>
    <dc:creator>Anonymous User</dc:creator>
    <dc:date>2022-11-08T16:03:45Z</dc:date>
    <item>
      <title>Update Cursor not deleting all necessary features in AGOL Feature Layer</title>
      <link>https://community.esri.com/t5/arcgis-online-questions/update-cursor-not-deleting-all-necessary-features/m-p/1229558#M48768</link>
      <description>&lt;P&gt;Hi All,&lt;/P&gt;&lt;P&gt;I have taxlot data stored in AGOL with related tables, and I have a piece of code that finds and deletes records in the related tables that are not related to a record in the taxlot data. This is ultimately achieved using an update cursor. The code works perfectly on locally stored data, but the issue arises when I try to enact the script on hosted feature layers/tables in AGOL. It will get to 8000 records and then move on to the next table, regardless of how many records there actually are to process. Can anyone determine if I am missing something?&lt;/P&gt;&lt;PRE&gt;&lt;SPAN&gt;def &lt;/SPAN&gt;main(taxlots: object&lt;SPAN&gt;, &lt;/SPAN&gt;tables: list[object]&lt;SPAN&gt;, &lt;/SPAN&gt;taxlotJoinField: str&lt;SPAN&gt;, &lt;/SPAN&gt;tableJoinField: str&lt;SPAN&gt;, &lt;/SPAN&gt;actuallyDelete: bool) -&amp;gt; &lt;SPAN&gt;None&lt;/SPAN&gt;:&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;# Used for debugging progress bars if the script runs too fast to see them&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;def &lt;/SPAN&gt;insertDelay() -&amp;gt; &lt;SPAN&gt;None&lt;/SPAN&gt;:&lt;BR /&gt;        &lt;SPAN&gt;#time.sleep(0.0005)&lt;BR /&gt;&lt;/SPAN&gt;        &lt;SPAN&gt;pass&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;    arcpy.AddMessage(&lt;SPAN&gt;f"Actually delete: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;actuallyDelete&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;    arcpy.AddMessage(&lt;SPAN&gt;f"Analyzing Taxlots Feature Class: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;taxlots&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;    arcpy.SetProgressor(&lt;SPAN&gt;"default"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;"Counting rows..."&lt;/SPAN&gt;)&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;# Find the expected counts, for showing a progress bar&lt;BR /&gt;&lt;/SPAN&gt;    expectedTaxlotCount: int = int(arcpy.GetCount_management(taxlots)[&lt;SPAN&gt;0&lt;/SPAN&gt;])&lt;BR /&gt;&lt;BR /&gt;    arcpy.AddMessage(&lt;SPAN&gt;f"Taxlot Count (in table): &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;expectedTaxlotCount&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;BR /&gt;    taxlotCount = &lt;SPAN&gt;0&lt;BR /&gt;&lt;/SPAN&gt;    mapTaxlotNumbers: set[str] = set()&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;# Find the taxlot keys&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;with &lt;/SPAN&gt;arcpy.da.SearchCursor(taxlots&lt;SPAN&gt;, &lt;/SPAN&gt;[taxlotJoinField]) &lt;SPAN&gt;as &lt;/SPAN&gt;cursor:&lt;BR /&gt;        &lt;SPAN&gt;for &lt;/SPAN&gt;row &lt;SPAN&gt;in &lt;/SPAN&gt;cursor:&lt;BR /&gt;&lt;BR /&gt;            arcpy.SetProgressor(&lt;SPAN&gt;"step"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;f"Collecting taxlots: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;taxlotCount + &lt;SPAN&gt;1&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt; / &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;expectedTaxlotCount&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;min_range=&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;max_range=expectedTaxlotCount)&lt;BR /&gt;            arcpy.SetProgressorPosition(taxlotCount)&lt;BR /&gt;&lt;BR /&gt;            insertDelay()&lt;BR /&gt;&lt;BR /&gt;            taxlotCount += &lt;SPAN&gt;1&lt;BR /&gt;&lt;/SPAN&gt;            mapTaxlotNumbers.add(row[&lt;SPAN&gt;0&lt;/SPAN&gt;])&lt;BR /&gt;    &lt;BR /&gt;    arcpy.AddMessage(&lt;SPAN&gt;f"Collected Taxlots: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;taxlotCount&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;    &lt;BR /&gt;    &lt;SPAN&gt;# For each table, delete rows that aren't in the taxlot keys above&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;for &lt;/SPAN&gt;tableIndex&lt;SPAN&gt;, &lt;/SPAN&gt;table &lt;SPAN&gt;in &lt;/SPAN&gt;enumerate(tables):&lt;BR /&gt;        arcpy.AddMessage(&lt;SPAN&gt;f"Processing table: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;table&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;BR /&gt;        expectedCount = int(arcpy.GetCount_management(table)[&lt;SPAN&gt;0&lt;/SPAN&gt;])&lt;BR /&gt;&lt;BR /&gt;        includedCount = &lt;SPAN&gt;0&lt;BR /&gt;&lt;/SPAN&gt;        excludedCount = &lt;SPAN&gt;0&lt;BR /&gt;&lt;/SPAN&gt;        totalCount = &lt;SPAN&gt;0&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;        &lt;SPAN&gt;with &lt;/SPAN&gt;arcpy.da.UpdateCursor(table&lt;SPAN&gt;, &lt;/SPAN&gt;[tableJoinField]) &lt;SPAN&gt;as &lt;/SPAN&gt;cursor:&lt;BR /&gt;            &lt;SPAN&gt;for &lt;/SPAN&gt;row &lt;SPAN&gt;in &lt;/SPAN&gt;cursor:&lt;BR /&gt;&lt;BR /&gt;                arcpy.SetProgressor(&lt;SPAN&gt;"step"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;f"Processing table &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;tableIndex + &lt;SPAN&gt;1&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt; / &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;len(tables)&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;totalCount + &lt;SPAN&gt;1&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt; / &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;expectedCount&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;min_range=&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;max_range=expectedCount)&lt;BR /&gt;                arcpy.SetProgressorPosition(totalCount)&lt;BR /&gt;&lt;BR /&gt;                totalCount += &lt;SPAN&gt;1&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;                insertDelay()&lt;BR /&gt;&lt;BR /&gt;                &lt;SPAN&gt;if &lt;/SPAN&gt;row[&lt;SPAN&gt;0&lt;/SPAN&gt;] &lt;SPAN&gt;in &lt;/SPAN&gt;mapTaxlotNumbers:&lt;BR /&gt;                    includedCount += &lt;SPAN&gt;1&lt;BR /&gt;&lt;/SPAN&gt;                &lt;SPAN&gt;else&lt;/SPAN&gt;:&lt;BR /&gt;                    excludedCount += &lt;SPAN&gt;1&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;                    &lt;SPAN&gt;if &lt;/SPAN&gt;actuallyDelete:&lt;BR /&gt;                        cursor.deleteRow()&lt;BR /&gt;        &lt;BR /&gt;        arcpy.AddMessage(&lt;SPAN&gt;f"&lt;/SPAN&gt;&lt;SPAN&gt;\t&lt;/SPAN&gt;&lt;SPAN&gt;Rows in taxlots layer: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;includedCount&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}\n\t&lt;/SPAN&gt;&lt;SPAN&gt;Not in layer: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;excludedCount&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}\n\t&lt;/SPAN&gt;&lt;SPAN&gt;Total: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;totalCount&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;}\n\t&lt;/SPAN&gt;&lt;SPAN&gt;Excess deleted: &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;actuallyDelete&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;    &lt;BR /&gt;    arcpy.AddMessage(&lt;SPAN&gt;"Processing complete!"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;class &lt;/SPAN&gt;DeleteNonAssociatedTaxlotRows(object):&lt;BR /&gt;    &lt;SPAN&gt;"""A script tool class for ArcGIS"""&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;def &lt;/SPAN&gt;__init__(self) -&amp;gt; &lt;SPAN&gt;None&lt;/SPAN&gt;:&lt;BR /&gt;        self.label = &lt;SPAN&gt;"Delete Non Associated Taxlot Rows"&lt;BR /&gt;&lt;/SPAN&gt;        self.description = &lt;SPAN&gt;"Deletes related table rows that are not associated with a taxlots layer."&lt;BR /&gt;&lt;/SPAN&gt;        self.canRunInBackground = &lt;SPAN&gt;False&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;    &lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;    def &lt;/SPAN&gt;getParameterInfo(self) -&amp;gt; list[arcpy.Parameter]:&lt;BR /&gt;&lt;BR /&gt;        taxlotsParam = arcpy.Parameter(&lt;BR /&gt;            name=&lt;SPAN&gt;"Taxlots"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            displayName=&lt;SPAN&gt;"Taxlots"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            direction=&lt;SPAN&gt;"Input"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            datatype=&lt;SPAN&gt;"DEFeatureClass"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            parameterType=&lt;SPAN&gt;"Required"&lt;/SPAN&gt;)&lt;BR /&gt;        &lt;BR /&gt;        tablesParam = arcpy.Parameter(&lt;BR /&gt;            name=&lt;SPAN&gt;"Tables"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            displayName=&lt;SPAN&gt;"Tables"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            direction=&lt;SPAN&gt;"Input"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            datatype=&lt;SPAN&gt;"Table"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            parameterType=&lt;SPAN&gt;"Required"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            multiValue=&lt;SPAN&gt;True&lt;/SPAN&gt;)&lt;BR /&gt;        &lt;BR /&gt;        taxlotJoinFieldParam = arcpy.Parameter(&lt;BR /&gt;            name=&lt;SPAN&gt;"TaxlotJoinField"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            displayName=&lt;SPAN&gt;"Taxlot Join Field"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            direction=&lt;SPAN&gt;"Input"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            datatype=&lt;SPAN&gt;"GPString"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            parameterType=&lt;SPAN&gt;"Required"&lt;/SPAN&gt;)&lt;BR /&gt;        &lt;BR /&gt;        tableJoinFieldParam = arcpy.Parameter(&lt;BR /&gt;            name=&lt;SPAN&gt;"TableJoinField"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            displayName=&lt;SPAN&gt;"Table Join Field"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            direction=&lt;SPAN&gt;"Input"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            datatype=&lt;SPAN&gt;"GPString"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            parameterType=&lt;SPAN&gt;"Required"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;BR /&gt;        actuallyDeleteParam = arcpy.Parameter(&lt;BR /&gt;            name=&lt;SPAN&gt;"ActuallyDelete"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            displayName=&lt;SPAN&gt;"Actually Delete"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            direction=&lt;SPAN&gt;"Input"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            datatype=&lt;SPAN&gt;"GPBoolean"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;            parameterType=&lt;SPAN&gt;"Required"&lt;/SPAN&gt;)&lt;BR /&gt;        &lt;BR /&gt;        taxlotJoinFieldParam.value = &lt;SPAN&gt;"MapTaxlot"&lt;BR /&gt;&lt;/SPAN&gt;        tableJoinFieldParam.value = &lt;SPAN&gt;"MapTaxlot"&lt;BR /&gt;&lt;/SPAN&gt;        actuallyDeleteParam.value = &lt;SPAN&gt;False&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;        return &lt;/SPAN&gt;[taxlotsParam&lt;SPAN&gt;, &lt;/SPAN&gt;tablesParam&lt;SPAN&gt;, &lt;/SPAN&gt;taxlotJoinFieldParam&lt;SPAN&gt;, &lt;/SPAN&gt;tableJoinFieldParam&lt;SPAN&gt;, &lt;/SPAN&gt;actuallyDeleteParam]&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;def &lt;/SPAN&gt;isLicensed(self) -&amp;gt; bool:&lt;BR /&gt;        &lt;SPAN&gt;return True&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;    def &lt;/SPAN&gt;updateParameters(self&lt;SPAN&gt;, &lt;/SPAN&gt;parameters: list[arcpy.Parameter]):&lt;BR /&gt;        &lt;SPAN&gt;return&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;    def &lt;/SPAN&gt;updateMessages(self&lt;SPAN&gt;, &lt;/SPAN&gt;parameters: list[arcpy.Parameter]):&lt;BR /&gt;        &lt;SPAN&gt;return&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;    def &lt;/SPAN&gt;execute(self&lt;SPAN&gt;, &lt;/SPAN&gt;parameters: list[arcpy.Parameter]&lt;SPAN&gt;, &lt;/SPAN&gt;messages):&lt;BR /&gt;        taxlots = parameters[&lt;SPAN&gt;0&lt;/SPAN&gt;].value&lt;BR /&gt;        tables = parameters[&lt;SPAN&gt;1&lt;/SPAN&gt;].values&lt;BR /&gt;        taxlotJoinField: str = parameters[&lt;SPAN&gt;2&lt;/SPAN&gt;].value&lt;BR /&gt;        tableJoinField: str = parameters[&lt;SPAN&gt;3&lt;/SPAN&gt;].value&lt;BR /&gt;        actuallyDelete: bool = parameters[&lt;SPAN&gt;4&lt;/SPAN&gt;].value == &lt;SPAN&gt;True&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;        &lt;SPAN&gt;#arcpy.AddMessage(f"String: Taxlots: {taxlots}, Tables: {tables}")&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;        #arcpy.AddMessage(f"Type: Taxlots: {type(taxlots).__name__}, Tables: {type(tables).__name__}")&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;        #arcpy.AddMessage(f"Table count: {len(tables)}, tables[0]: {tables[0]}, type(tables[0]).__name__: {type(tables[0]).__name__}")&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;        main(taxlots&lt;SPAN&gt;, &lt;/SPAN&gt;tables&lt;SPAN&gt;, &lt;/SPAN&gt;taxlotJoinField&lt;SPAN&gt;, &lt;/SPAN&gt;tableJoinField&lt;SPAN&gt;, &lt;/SPAN&gt;actuallyDelete)&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;def &lt;/SPAN&gt;postExecute(self&lt;SPAN&gt;, &lt;/SPAN&gt;parameters: list[arcpy.Parameter]):&lt;BR /&gt;        &lt;SPAN&gt;return&lt;/SPAN&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 08 Nov 2022 16:03:45 GMT</pubDate>
      <guid>https://community.esri.com/t5/arcgis-online-questions/update-cursor-not-deleting-all-necessary-features/m-p/1229558#M48768</guid>
      <dc:creator>Anonymous User</dc:creator>
      <dc:date>2022-11-08T16:03:45Z</dc:date>
    </item>
  </channel>
</rss>

