<?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 Re: Conditional dropdown in Tool Validator based on user input in Python Questions</title>
    <link>https://community.esri.com/t5/python-questions/conditional-dropdown-in-tool-validator-based-on/m-p/1001636#M59057</link>
    <description>&lt;P&gt;Randy, wow thanks! Your code worked beautifully, ran the Toolvalidator script and then my main geoprocessing script seamlessly. I am reworking it now to display a list of full-length parcels in the 3rd param and then let the user select multiple parcels for running the script. I will post it once I get it working with my changes.&lt;/P&gt;&lt;P&gt;But I have a question on debugging the ToolValidator.&amp;nbsp;How do you structure&amp;nbsp;it so that you can run&amp;nbsp;it as a script in an IDE (Pycharm&amp;nbsp;in my case)?&amp;nbsp;&lt;/P&gt;&lt;P&gt;I had earlier tried setting it up using the example at the bottom of this page: &lt;A href="https://desktop.arcgis.com/en/arcmap/latest/analyze/creating-tools/debugging-a-toolvalidator-class.htm" target="_blank"&gt;https://desktop.arcgis.com/en/arcmap/latest/analyze/creating-tools/debugging-a-toolvalidator-class.htm&lt;/A&gt;&lt;/P&gt;&lt;P&gt;Then I tried the script you posted at the bottom of your post. Then I tried combining the two. They handle the parameters differently, so I tried it both ways.&amp;nbsp;The problems are mostly about accessing the parameters and feeding them into the Tool Validator script. Here's the debug script. What am I not understanding?&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN&gt;# DEBUGGING SCRIPT FOR TOOLVALIDATOR CODE - 11/15/2020&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;# create parameter array and values&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;arcpy&lt;BR /&gt;&lt;SPAN&gt;# Load the toolbox and get the tool's parameters, using the tool name (not the tool label).&lt;BR /&gt;&lt;/SPAN&gt;tb = &lt;SPAN&gt;r"G:\projects\ocp\pd\env_wetlands\Env_Assessment_maps\Map_compositions\Environmental_Map_Template_dev2\Parcel or Address Search.tbx"&lt;BR /&gt;&lt;/SPAN&gt;arcpy.ImportToolbox(tb)&lt;BR /&gt;params = arcpy.GetParameterInfo(&lt;SPAN&gt;"RequestParcelInput"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;# set required parameters&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;# params[0].value = "PARCELS_BASE"&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;# params[1].value = "0401 01"&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;# params[2].value = "0401 01  0001"&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;inFC = arcpy.GetParameterAsText(&lt;SPAN&gt;0&lt;/SPAN&gt;)      &lt;SPAN&gt;# input feature class (Input, Data Type 'Feature Layer')&lt;BR /&gt;&lt;/SPAN&gt;PIN = arcpy.GetParameterAsText(&lt;SPAN&gt;1&lt;/SPAN&gt;)       &lt;SPAN&gt;# PIN[:8]  (Input, Data Type 'String')&lt;BR /&gt;&lt;/SPAN&gt;PIN2 = arcpy.GetParameterAsText(&lt;SPAN&gt;2&lt;/SPAN&gt;)      &lt;SPAN&gt;# full PIN (Input, Data Type 'String')&lt;BR /&gt;&lt;/SPAN&gt;whereClause = arcpy.GetParameterAsText(&lt;SPAN&gt;3&lt;/SPAN&gt;) &lt;SPAN&gt;# set by ToolValidator updateParameters (Output, Derived, Data Type 'String')&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;# arcpy.AddMessage("Where clause used: {}".format(whereClause))&lt;BR /&gt;&lt;/SPAN&gt;arcpy.SelectLayerByAttribute_management(inFC&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;"NEW_SELECTION"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;where_clause&lt;/SPAN&gt;=whereClause)&lt;BR /&gt;&lt;SPAN&gt;for &lt;/SPAN&gt;i &lt;SPAN&gt;in &lt;/SPAN&gt;range(arcpy.GetMessageCount()):  &lt;SPAN&gt;# display messages from SelectLayerByAttribute tool&lt;BR /&gt;&lt;/SPAN&gt;    arcpy.AddMessage(arcpy.GetMessage(i))&lt;BR /&gt;&lt;SPAN&gt;# n = arcpy.GetCount_management(inFC)&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;# arcpy.AddMessage("Number of records selected: {}".format(n))‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;#########################################################################################&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;class &lt;/SPAN&gt;ToolValidator(object):&lt;BR /&gt;    &lt;SPAN&gt;"""Class for validating a tool's parameter values and controlling&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;    the behavior of the tool's dialog."""&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;def &lt;/SPAN&gt;&lt;SPAN&gt;__init__&lt;/SPAN&gt;(&lt;SPAN&gt;self&lt;/SPAN&gt;&lt;span class="lia-unicode-emoji" title=":disappointed_face:"&gt;😞&lt;/span&gt;&lt;BR /&gt;        &lt;SPAN&gt;"""Setup arcpy and the list of tool parameters."""&lt;BR /&gt;&lt;/SPAN&gt;        &lt;SPAN&gt;self&lt;/SPAN&gt;.params = arcpy.GetParameterInfo()&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;def &lt;/SPAN&gt;&lt;SPAN&gt;initializeParameters&lt;/SPAN&gt;(&lt;SPAN&gt;self&lt;/SPAN&gt;&lt;span class="lia-unicode-emoji" title=":disappointed_face:"&gt;😞&lt;/span&gt;&lt;BR /&gt;        &lt;SPAN&gt;"""Refine the properties of a tool's parameters. This method is&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;        called when the tool is opened."""&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;def &lt;/SPAN&gt;&lt;SPAN&gt;updateParameters&lt;/SPAN&gt;(&lt;SPAN&gt;self&lt;/SPAN&gt;&lt;span class="lia-unicode-emoji" title=":disappointed_face:"&gt;😞&lt;/span&gt;&lt;BR /&gt;        &lt;SPAN&gt;"""Modify the values and properties of parameters before internal&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;        validation is performed. This method is called whenever a parameter&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;        has been changed."""&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;        &lt;SPAN&gt;if &lt;/SPAN&gt;&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;0&lt;/SPAN&gt;].value:  &lt;SPAN&gt;# feature class has been selected&lt;BR /&gt;&lt;/SPAN&gt;            useFields = [&lt;SPAN&gt;'PIN'&lt;/SPAN&gt;]  &lt;SPAN&gt;# name of field used by tool (parcel identification number - a string)&lt;BR /&gt;&lt;/SPAN&gt;            desc = arcpy.Describe(&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;0&lt;/SPAN&gt;].value)  &lt;SPAN&gt;# information about the input feature&lt;BR /&gt;&lt;/SPAN&gt;            fieldNames = {f.name: f.type &lt;SPAN&gt;for &lt;/SPAN&gt;f &lt;SPAN&gt;in &lt;/SPAN&gt;desc.fields}  &lt;SPAN&gt;# dictionary used to keep field names and types together&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;            &lt;SPAN&gt;if &lt;/SPAN&gt;set(useFields).issubset(fieldNames.keys()):  &lt;SPAN&gt;# all fields were found by tool&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;                # NOTE: if any selections have been made in fc, then only selected features will be searched&lt;BR /&gt;&lt;/SPAN&gt;                fc&lt;SPAN&gt;, &lt;/SPAN&gt;fld = str(&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;0&lt;/SPAN&gt;].value)&lt;SPAN&gt;, &lt;/SPAN&gt;useFields&lt;BR /&gt;                &lt;SPAN&gt;# GQD unique-values filter from all parcels in PARCELS_BASE&lt;BR /&gt;&lt;/SPAN&gt;                &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].filter.list = sorted(set([f[&lt;SPAN&gt;0&lt;/SPAN&gt;][:&lt;SPAN&gt;7&lt;/SPAN&gt;] &lt;SPAN&gt;for &lt;/SPAN&gt;f &lt;SPAN&gt;in &lt;/SPAN&gt;arcpy.da.SearchCursor(fc&lt;SPAN&gt;, &lt;/SPAN&gt;fld)]))&lt;BR /&gt;                &lt;SPAN&gt;if &lt;/SPAN&gt;&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].value &lt;SPAN&gt;not in &lt;/SPAN&gt;&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].filter.list:&lt;BR /&gt;                    &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].value = &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].filter.list[&lt;SPAN&gt;0&lt;/SPAN&gt;]&lt;BR /&gt;&lt;BR /&gt;                wc = &lt;SPAN&gt;"PIN LIKE '{}%'"&lt;/SPAN&gt;.format(&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].value)&lt;BR /&gt;                &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;5&lt;/SPAN&gt;].value = &lt;SPAN&gt;"querystring: " &lt;/SPAN&gt;+ wc  &lt;SPAN&gt;# display to debugger&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;                &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;2&lt;/SPAN&gt;].filter.list = sorted(set([f[&lt;SPAN&gt;0&lt;/SPAN&gt;][:] &lt;SPAN&gt;for &lt;/SPAN&gt;f &lt;SPAN&gt;in &lt;/SPAN&gt;arcpy.da.SearchCursor(fc&lt;SPAN&gt;, &lt;/SPAN&gt;fld&lt;SPAN&gt;, &lt;/SPAN&gt;wc)]))&lt;BR /&gt;                &lt;SPAN&gt;if &lt;/SPAN&gt;&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;2&lt;/SPAN&gt;].value &lt;SPAN&gt;not in &lt;/SPAN&gt;&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;2&lt;/SPAN&gt;].filter.list:&lt;BR /&gt;                    &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;2&lt;/SPAN&gt;].value = &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;2&lt;/SPAN&gt;].filter.list[&lt;SPAN&gt;0&lt;/SPAN&gt;]&lt;BR /&gt;&lt;BR /&gt;                &lt;SPAN&gt;# output completed whereClause&lt;BR /&gt;&lt;/SPAN&gt;                &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;3&lt;/SPAN&gt;].value = &lt;SPAN&gt;"PIN = '{}'"&lt;/SPAN&gt;.format(&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;2&lt;/SPAN&gt;].value)&lt;BR /&gt;                &lt;SPAN&gt;# self.params[3].value = "PIN = '{} {}'".format(self.params[1].value, self.params[2].value)&lt;BR /&gt;&lt;/SPAN&gt;                &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;5&lt;/SPAN&gt;].value = &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;3&lt;/SPAN&gt;].value  &lt;SPAN&gt;# display to debugger&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;            &lt;SPAN&gt;else&lt;/SPAN&gt;:  &lt;SPAN&gt;# at least one of the field names does not exist in feature; using the parameter to hold an error message&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;                &lt;SPAN&gt;if &lt;/SPAN&gt;&lt;SPAN&gt;'PIN' &lt;/SPAN&gt;&lt;SPAN&gt;not in &lt;/SPAN&gt;fieldNames.keys():&lt;BR /&gt;                    &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].value = &lt;SPAN&gt;"ERROR: Field 'PIN' not in selected feature class."&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&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;&lt;SPAN&gt;updateMessages&lt;/SPAN&gt;(&lt;SPAN&gt;self&lt;/SPAN&gt;&lt;span class="lia-unicode-emoji" title=":disappointed_face:"&gt;😞&lt;/span&gt;&lt;BR /&gt;        &lt;SPAN&gt;"""Modify the messages created by internal validation for each tool&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;        parameter. This method is called after internal validation."""&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;        &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;0&lt;/SPAN&gt;].clearMessage()&lt;BR /&gt;        &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].clearMessage()&lt;BR /&gt;        &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;2&lt;/SPAN&gt;].clearMessage()&lt;BR /&gt;        &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;3&lt;/SPAN&gt;].clearMessage()&lt;BR /&gt;        &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;4&lt;/SPAN&gt;].clearMessage()&lt;BR /&gt;        &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;5&lt;/SPAN&gt;].clearMessage()&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;if &lt;/SPAN&gt;&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;0&lt;/SPAN&gt;].value &lt;SPAN&gt;is not None&lt;/SPAN&gt;:        &lt;SPAN&gt;# set error msg if field not in feature so user can correct problem&lt;BR /&gt;&lt;/SPAN&gt;            &lt;SPAN&gt;if &lt;/SPAN&gt;&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].value &lt;SPAN&gt;is not None&lt;/SPAN&gt;:&lt;BR /&gt;                &lt;SPAN&gt;if &lt;/SPAN&gt;&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].value.startswith(&lt;SPAN&gt;"ERROR:"&lt;/SPAN&gt;&lt;span class="lia-unicode-emoji" title=":disappointed_face:"&gt;😞&lt;/span&gt;&lt;BR /&gt;                    &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].value = &lt;SPAN&gt;None     &lt;/SPAN&gt;&lt;SPAN&gt;# clear error message in parameter value, if desired&lt;BR /&gt;&lt;/SPAN&gt;                    &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].setErrorMessage(&lt;BR /&gt;                        &lt;SPAN&gt;"Field '{}' is not in Input FC '{}'"&lt;/SPAN&gt;.format(&lt;SPAN&gt;'PIN'&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;0&lt;/SPAN&gt;].value))&lt;BR /&gt;&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;&lt;SPAN&gt;isLicensed&lt;/SPAN&gt;(&lt;SPAN&gt;self&lt;/SPAN&gt;&lt;span class="lia-unicode-emoji" title=":disappointed_face:"&gt;😞&lt;/span&gt;&lt;BR /&gt;        &lt;SPAN&gt;"""Set whether tool is licensed to execute."""&lt;BR /&gt;&lt;/SPAN&gt;        &lt;SPAN&gt;return True&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;#########################################################################################&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;# Below Toolvalidator code, create Toolvalidator class and call UpdateParameters + messages&lt;BR /&gt;&lt;/SPAN&gt;validator = ToolValidator()&lt;BR /&gt;validator.updateParameters()&lt;BR /&gt;validator.updateMessages()&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Mon, 16 Nov 2020 02:42:02 GMT</pubDate>
    <dc:creator>AllisonClark</dc:creator>
    <dc:date>2020-11-16T02:42:02Z</dc:date>
    <item>
      <title>Conditional dropdown in Tool Validator based on user input</title>
      <link>https://community.esri.com/t5/python-questions/conditional-dropdown-in-tool-validator-based-on/m-p/238703#M18567</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;This picks up from&amp;nbsp;&lt;A href="https://community.esri.com/thread/210869" target="_blank"&gt;Conditional Drop Down Lists - Tool Validator&lt;/A&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;My basic question is, how do you write a script tool parameter window that takes data entry input as a filter on a feature class field?&amp;nbsp;And then lets the user select values from the filtered output.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;My&amp;nbsp;script tool is meant to prompt the user to enter the first six digits of a parcel ID, such as '0401 01' and then uses that to filter a list of parcels pulled from the PARCELS_BASE feature class. I tried to reuse the code from&amp;nbsp;&lt;SPAN style="font-size: 11.0pt;"&gt;&lt;A _jive_internal="true" href="https://community.esri.com/thread/210869-conditional-drop-down-lists-tool-validator" target="_blank"&gt;https://community.esri.com/thread/210869-conditional-drop-down-lists-tool-validator&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;because it's similar, but could not get it to filter based on data entry.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here's my most recent iteration. In my situation, the feature class and field are fixed, so I tried substituting in the hard-coded names, leaving just the one input parameter, GridQuadDbl, for user data entry. I expected this to display the filtered list as the OutValue. All I got was an error on the line where I invoked SearchCursor, saying that NoneType object has no attribute 'list'. That's going to be something dumb and obvious, but it's insane trying to debug inside Tool Validator, and it's late, and I'm tired.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;First, the attribute table, with PIN being the field where I'm trying to filter the results:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;IMG class="image-2 jive-image" src="https://community.esri.com/legacyfs/online/512450_pastedImage_2.png" /&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The parameter window when you run the tool:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;IMG class="image-3 jive-image" src="https://community.esri.com/legacyfs/online/512451_pastedImage_3.png" /&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Next, the parameters (ignore debugger)&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;IMG class="image-1 jive-image" src="https://community.esri.com/legacyfs/online/512431_pastedImage_1.png" /&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The code:&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;&lt;SPAN style="color: #0033b3;"&gt;class &lt;/SPAN&gt;&lt;SPAN style="color: #000000;"&gt;ToolValidator&lt;/SPAN&gt;(&lt;SPAN style="color: #000080;"&gt;object&lt;/SPAN&gt;):
&lt;SPAN style="color: #8c8c8c;"&gt;
&lt;/SPAN&gt;&lt;SPAN style="color: #8c8c8c;"&gt;    &lt;/SPAN&gt;&lt;SPAN style="color: #0033b3;"&gt;def &lt;/SPAN&gt;&lt;SPAN style="color: #b200b2;"&gt;__init__&lt;/SPAN&gt;(&lt;SPAN style="color: #94558d;"&gt;self&lt;/SPAN&gt;):
&lt;SPAN style="color: #8c8c8c;"&gt;        &lt;/SPAN&gt;&lt;SPAN style="color: #94558d;"&gt;self&lt;/SPAN&gt;.params = arcpy.GetParameterInfo()

    &lt;SPAN style="color: #0033b3;"&gt;def &lt;/SPAN&gt;&lt;SPAN style="color: #000000;"&gt;initializeParameters&lt;/SPAN&gt;(&lt;SPAN style="color: #94558d;"&gt;self&lt;/SPAN&gt;):
&lt;SPAN style="color: #8c8c8c;"&gt;        
&lt;/SPAN&gt;&lt;SPAN style="color: #8c8c8c;"&gt;    &lt;/SPAN&gt;&lt;SPAN style="color: #0033b3;"&gt;def &lt;/SPAN&gt;&lt;SPAN style="color: #000000;"&gt;updateParameters&lt;/SPAN&gt;(&lt;SPAN style="color: #94558d;"&gt;self&lt;/SPAN&gt;):
&lt;SPAN style="color: #8c8c8c;"&gt;        # set values for fc and field
&lt;/SPAN&gt;&lt;SPAN style="color: #8c8c8c;"&gt;        &lt;/SPAN&gt;fc, col = &lt;SPAN style="color: #008080; font-weight: bold;"&gt;"PARCELS_BASE"&lt;/SPAN&gt;, &lt;SPAN style="color: #008080; font-weight: bold;"&gt;"PIN"
&lt;/SPAN&gt;&lt;SPAN style="color: #008080; font-weight: bold;"&gt;
&lt;/SPAN&gt;&lt;SPAN style="color: #008080; font-weight: bold;"&gt;        &lt;/SPAN&gt;&lt;SPAN style="color: #8c8c8c;"&gt;# get value for grid-quad-dbl
&lt;/SPAN&gt;&lt;SPAN style="color: #8c8c8c;"&gt;        &lt;/SPAN&gt;&lt;SPAN style="color: #0033b3;"&gt;if &lt;/SPAN&gt;&lt;SPAN style="color: #94558d;"&gt;self&lt;/SPAN&gt;.params[&lt;SPAN style="color: #1750eb;"&gt;0&lt;/SPAN&gt;].value:
            wc = &lt;SPAN style="color: #008080; font-weight: bold;"&gt;"{0} LIKE '{1}%'"&lt;/SPAN&gt;.format(col, &lt;SPAN style="color: #000080;"&gt;str&lt;/SPAN&gt;(&lt;SPAN style="color: #94558d;"&gt;self&lt;/SPAN&gt;.params[&lt;SPAN style="color: #1750eb;"&gt;0&lt;/SPAN&gt;].value))
            &lt;SPAN style="color: #94558d;"&gt;self&lt;/SPAN&gt;.params[&lt;SPAN style="color: #1750eb;"&gt;2&lt;/SPAN&gt;].value = wc
            &lt;SPAN style="color: #94558d;"&gt;self&lt;/SPAN&gt;.params[&lt;SPAN style="color: #1750eb;"&gt;1&lt;/SPAN&gt;].filter.list = [&lt;SPAN style="color: #000080;"&gt;str&lt;/SPAN&gt;(val) &lt;SPAN style="color: #0033b3;"&gt;for &lt;/SPAN&gt;val &lt;SPAN style="color: #0033b3;"&gt;in &lt;/SPAN&gt;&lt;SPAN style="color: #000080;"&gt;sorted&lt;/SPAN&gt;(
                &lt;SPAN style="color: #000080;"&gt;set&lt;/SPAN&gt;(row.getValue(col) &lt;SPAN style="color: #0033b3;"&gt;for &lt;/SPAN&gt;row &lt;SPAN style="color: #0033b3;"&gt;in &lt;/SPAN&gt;arcpy.SearchCursor(fc, &lt;SPAN style="color: #660099;"&gt;fields&lt;/SPAN&gt;=col, &lt;SPAN style="color: #660099;"&gt;where_clause&lt;/SPAN&gt;=wc)))]

        &lt;SPAN style="color: #0033b3;"&gt;if &lt;/SPAN&gt;&lt;SPAN style="color: #94558d;"&gt;self&lt;/SPAN&gt;.params[&lt;SPAN style="color: #1750eb;"&gt;1&lt;/SPAN&gt;].value &lt;SPAN style="color: #0033b3;"&gt;not in &lt;/SPAN&gt;&lt;SPAN style="color: #94558d;"&gt;self&lt;/SPAN&gt;.params[&lt;SPAN style="color: #1750eb;"&gt;1&lt;/SPAN&gt;].filter.list:
            &lt;SPAN style="color: #94558d;"&gt;self&lt;/SPAN&gt;.params[&lt;SPAN style="color: #1750eb;"&gt;1&lt;/SPAN&gt;].value = &lt;SPAN style="color: #94558d;"&gt;self&lt;/SPAN&gt;.params[&lt;SPAN style="color: #1750eb;"&gt;1&lt;/SPAN&gt;].filter.list[&lt;SPAN style="color: #1750eb;"&gt;0&lt;/SPAN&gt;]

        &lt;SPAN style="color: #0033b3;"&gt;return
&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 11 Dec 2021 12:00:54 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/conditional-dropdown-in-tool-validator-based-on/m-p/238703#M18567</guid>
      <dc:creator>AllisonClark</dc:creator>
      <dc:date>2021-12-11T12:00:54Z</dc:date>
    </item>
    <item>
      <title>Re: Conditional dropdown in Tool Validator based on user input</title>
      <link>https://community.esri.com/t5/python-questions/conditional-dropdown-in-tool-validator-based-on/m-p/238704#M18568</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I was experimenting with some code that uses a LIKE in the where clause.&amp;nbsp; It pulls parts of the PIN from the data and loads it into dropdowns for the user to select from.&amp;nbsp;&amp;nbsp; Hopefully, it is similar enough to your project that it will give you some ideas.&amp;nbsp; Here's the validator section:&lt;/P&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;&lt;CODE&gt;&lt;SPAN class="keyword token"&gt;import&lt;/SPAN&gt; arcpy
&lt;SPAN class="keyword token"&gt;class&lt;/SPAN&gt; &lt;SPAN class="token class-name"&gt;ToolValidator&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;object&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt;

    &lt;SPAN class="keyword token"&gt;def&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;__init__&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;self&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt;
        &lt;SPAN class="keyword token"&gt;import&lt;/SPAN&gt; arcpy
        self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; arcpy&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;GetParameterInfo&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;

    &lt;SPAN class="keyword token"&gt;def&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;initializeParameters&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;self&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt;
        &lt;SPAN class="comment token"&gt;# (initializeParameters code here)&lt;/SPAN&gt;
        &lt;SPAN class="keyword token"&gt;return&lt;/SPAN&gt;

    &lt;SPAN class="keyword token"&gt;def&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;updateParameters&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;self&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt;

        &lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt; self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;# feature has been selected&lt;/SPAN&gt;
            useFields &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="string token"&gt;'PIN'&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;# name of field used by tool (parcel identification number - a string)&lt;/SPAN&gt;
            desc &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; arcpy&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;Describe&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;  &lt;SPAN class="comment token"&gt;# information about the input feature&lt;/SPAN&gt;
            fieldNames &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;{&lt;/SPAN&gt; f&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;name&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt; f&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;type &lt;SPAN class="keyword token"&gt;for&lt;/SPAN&gt; f &lt;SPAN class="keyword token"&gt;in&lt;/SPAN&gt; desc&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;fields &lt;SPAN class="punctuation token"&gt;}&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;# dictionary used to keep field names and types together&lt;/SPAN&gt;

            &lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt; set&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;useFields&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;issubset&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;fieldNames&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;keys&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;# all fields were found by tool&lt;/SPAN&gt;


                &lt;SPAN class="comment token"&gt;# NOTE: if any selections have been made in fc, then only selected features will be searched&lt;/SPAN&gt;
                fc&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; fld &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; str&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; useFields

                self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;filter&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;list &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; sorted&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;set&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;f&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;4&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;for&lt;/SPAN&gt; f &lt;SPAN class="keyword token"&gt;in&lt;/SPAN&gt; arcpy&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;da&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;SearchCursor&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;fc&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt;fld&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
                &lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt; self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value &lt;SPAN class="operator token"&gt;not&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;in&lt;/SPAN&gt; self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;filter&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;list&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt;
                    self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;filter&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;list&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;

                where_1 &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="string token"&gt;"PIN LIKE '{}%'"&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;format&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
                
                self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;2&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;filter&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;list &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; sorted&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;set&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;f&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;5&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;7&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;for&lt;/SPAN&gt; f &lt;SPAN class="keyword token"&gt;in&lt;/SPAN&gt; arcpy&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;da&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;SearchCursor&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;fc&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt;fld&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt;where_1&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
                &lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt; self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;2&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value &lt;SPAN class="operator token"&gt;not&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;in&lt;/SPAN&gt; self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;2&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;filter&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;list&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt;
                    self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;2&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;2&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;filter&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;list&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;

                where_2 &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="string token"&gt;"PIN LIKE '{} {}%'"&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;format&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;2&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;

                self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;3&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;filter&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;list &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; sorted&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;set&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;f&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;8&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;for&lt;/SPAN&gt; f &lt;SPAN class="keyword token"&gt;in&lt;/SPAN&gt; arcpy&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;da&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;SearchCursor&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;fc&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt;fld&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt;where_2&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
                &lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt; self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;3&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value &lt;SPAN class="operator token"&gt;not&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;in&lt;/SPAN&gt; self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;3&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;filter&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;list&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt;
                    self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;3&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;3&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;filter&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;list&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;

                &lt;SPAN class="comment token"&gt;# output completed whereClause&lt;/SPAN&gt;
                self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;4&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="string token"&gt;"PIN = '{} {} {}'"&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;format&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;2&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;3&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;

            &lt;SPAN class="keyword token"&gt;else&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;# at least one of the field names does not exist in feature; using the parameter to hold an error message&lt;/SPAN&gt;

                &lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt; &lt;SPAN class="string token"&gt;'PIN'&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;not&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;in&lt;/SPAN&gt; fieldNames&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;keys&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt;
                    self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="string token"&gt;"ERROR: Field 'PIN' not in selected feature class."&lt;/SPAN&gt;

        &lt;SPAN class="keyword token"&gt;return&lt;/SPAN&gt;

    &lt;SPAN class="keyword token"&gt;def&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;updateMessages&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;self&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt;
        
        self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;clearMessage&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
        self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;clearMessage&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
        self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;2&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;clearMessage&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
        self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;3&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;clearMessage&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
        &lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt; self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value &lt;SPAN class="keyword token"&gt;is&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;not&lt;/SPAN&gt; None&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;# set error message if field not in feature so user can correct problem&lt;/SPAN&gt;

            &lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt; self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value &lt;SPAN class="keyword token"&gt;is&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;not&lt;/SPAN&gt; None&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt;
                &lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt; self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;startswith&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="string token"&gt;"ERROR:"&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt;
                    self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; None &lt;SPAN class="comment token"&gt;# clear error message in parameter value, if desired&lt;/SPAN&gt;
                    self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;setErrorMessage&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="string token"&gt;"Field '{}' is not in Input FC '{}'"&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;format&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="string token"&gt;'PIN'&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; self&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;params&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;value&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;

        &lt;SPAN class="keyword token"&gt;return&lt;/SPAN&gt;
&lt;SPAN class="line-numbers-rows"&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;&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;‍&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;&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;‍&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;&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;‍&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;&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;‍&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;&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;‍&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;&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;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;For my testing, I used the following script:&lt;/P&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;&lt;CODE&gt;&lt;SPAN class="keyword token"&gt;import&lt;/SPAN&gt; arcpy

inFC &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; arcpy&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;GetParameterAsText&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;# input feature class (Input, Data Type 'Feature Layer')&lt;/SPAN&gt;
PIN_a &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; arcpy&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;GetParameterAsText&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;# PIN[:4]  (Input, Data Type 'String')&lt;/SPAN&gt;
PIN_b &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; arcpy&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;GetParameterAsText&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;2&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;# PIN[5:7] (Input, Data Type 'String')&lt;/SPAN&gt;
PIN_c &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; arcpy&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;GetParameterAsText&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;3&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;# PIN[8:]  (Input, Data Type 'String')&lt;/SPAN&gt;
whereClause &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; arcpy&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;GetParameterAsText&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;4&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;# set by ToolValidator updateParameters (Output, Derived, Data Type 'String')&lt;/SPAN&gt;

arcpy&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;AddMessage&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="string token"&gt;"Where clause used: {}"&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;format&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;whereClause&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; 
arcpy&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;SelectLayerByAttribute_management&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;inFC&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; &lt;SPAN class="string token"&gt;"NEW_SELECTION"&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; where_clause&lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt;whereClause&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;

&lt;SPAN class="keyword token"&gt;for&lt;/SPAN&gt; i &lt;SPAN class="keyword token"&gt;in&lt;/SPAN&gt; range&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;arcpy&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;GetMessageCount&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;:&lt;/SPAN&gt;  &lt;SPAN class="comment token"&gt;# display messages from SelectLayerByAttribute tool&lt;/SPAN&gt;
    arcpy&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;AddMessage&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;arcpy&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;GetMessage&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;i&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;

n &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; arcpy&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;GetCount_management&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;inFC&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
arcpy&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;AddMessage&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="string token"&gt;"Number of records selected: {}"&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;format&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;n&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="line-numbers-rows"&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;&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;‍&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;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;Hope this helps.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 11 Dec 2021 12:00:56 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/conditional-dropdown-in-tool-validator-based-on/m-p/238704#M18568</guid>
      <dc:creator>RandyBurton</dc:creator>
      <dc:date>2021-12-11T12:00:56Z</dc:date>
    </item>
    <item>
      <title>Re: Conditional dropdown in Tool Validator based on user input</title>
      <link>https://community.esri.com/t5/python-questions/conditional-dropdown-in-tool-validator-based-on/m-p/1001636#M59057</link>
      <description>&lt;P&gt;Randy, wow thanks! Your code worked beautifully, ran the Toolvalidator script and then my main geoprocessing script seamlessly. I am reworking it now to display a list of full-length parcels in the 3rd param and then let the user select multiple parcels for running the script. I will post it once I get it working with my changes.&lt;/P&gt;&lt;P&gt;But I have a question on debugging the ToolValidator.&amp;nbsp;How do you structure&amp;nbsp;it so that you can run&amp;nbsp;it as a script in an IDE (Pycharm&amp;nbsp;in my case)?&amp;nbsp;&lt;/P&gt;&lt;P&gt;I had earlier tried setting it up using the example at the bottom of this page: &lt;A href="https://desktop.arcgis.com/en/arcmap/latest/analyze/creating-tools/debugging-a-toolvalidator-class.htm" target="_blank"&gt;https://desktop.arcgis.com/en/arcmap/latest/analyze/creating-tools/debugging-a-toolvalidator-class.htm&lt;/A&gt;&lt;/P&gt;&lt;P&gt;Then I tried the script you posted at the bottom of your post. Then I tried combining the two. They handle the parameters differently, so I tried it both ways.&amp;nbsp;The problems are mostly about accessing the parameters and feeding them into the Tool Validator script. Here's the debug script. What am I not understanding?&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN&gt;# DEBUGGING SCRIPT FOR TOOLVALIDATOR CODE - 11/15/2020&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;# create parameter array and values&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;arcpy&lt;BR /&gt;&lt;SPAN&gt;# Load the toolbox and get the tool's parameters, using the tool name (not the tool label).&lt;BR /&gt;&lt;/SPAN&gt;tb = &lt;SPAN&gt;r"G:\projects\ocp\pd\env_wetlands\Env_Assessment_maps\Map_compositions\Environmental_Map_Template_dev2\Parcel or Address Search.tbx"&lt;BR /&gt;&lt;/SPAN&gt;arcpy.ImportToolbox(tb)&lt;BR /&gt;params = arcpy.GetParameterInfo(&lt;SPAN&gt;"RequestParcelInput"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;# set required parameters&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;# params[0].value = "PARCELS_BASE"&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;# params[1].value = "0401 01"&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;# params[2].value = "0401 01  0001"&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;inFC = arcpy.GetParameterAsText(&lt;SPAN&gt;0&lt;/SPAN&gt;)      &lt;SPAN&gt;# input feature class (Input, Data Type 'Feature Layer')&lt;BR /&gt;&lt;/SPAN&gt;PIN = arcpy.GetParameterAsText(&lt;SPAN&gt;1&lt;/SPAN&gt;)       &lt;SPAN&gt;# PIN[:8]  (Input, Data Type 'String')&lt;BR /&gt;&lt;/SPAN&gt;PIN2 = arcpy.GetParameterAsText(&lt;SPAN&gt;2&lt;/SPAN&gt;)      &lt;SPAN&gt;# full PIN (Input, Data Type 'String')&lt;BR /&gt;&lt;/SPAN&gt;whereClause = arcpy.GetParameterAsText(&lt;SPAN&gt;3&lt;/SPAN&gt;) &lt;SPAN&gt;# set by ToolValidator updateParameters (Output, Derived, Data Type 'String')&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;# arcpy.AddMessage("Where clause used: {}".format(whereClause))&lt;BR /&gt;&lt;/SPAN&gt;arcpy.SelectLayerByAttribute_management(inFC&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;"NEW_SELECTION"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;where_clause&lt;/SPAN&gt;=whereClause)&lt;BR /&gt;&lt;SPAN&gt;for &lt;/SPAN&gt;i &lt;SPAN&gt;in &lt;/SPAN&gt;range(arcpy.GetMessageCount()):  &lt;SPAN&gt;# display messages from SelectLayerByAttribute tool&lt;BR /&gt;&lt;/SPAN&gt;    arcpy.AddMessage(arcpy.GetMessage(i))&lt;BR /&gt;&lt;SPAN&gt;# n = arcpy.GetCount_management(inFC)&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;# arcpy.AddMessage("Number of records selected: {}".format(n))‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;#########################################################################################&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;class &lt;/SPAN&gt;ToolValidator(object):&lt;BR /&gt;    &lt;SPAN&gt;"""Class for validating a tool's parameter values and controlling&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;    the behavior of the tool's dialog."""&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;def &lt;/SPAN&gt;&lt;SPAN&gt;__init__&lt;/SPAN&gt;(&lt;SPAN&gt;self&lt;/SPAN&gt;&lt;span class="lia-unicode-emoji" title=":disappointed_face:"&gt;😞&lt;/span&gt;&lt;BR /&gt;        &lt;SPAN&gt;"""Setup arcpy and the list of tool parameters."""&lt;BR /&gt;&lt;/SPAN&gt;        &lt;SPAN&gt;self&lt;/SPAN&gt;.params = arcpy.GetParameterInfo()&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;def &lt;/SPAN&gt;&lt;SPAN&gt;initializeParameters&lt;/SPAN&gt;(&lt;SPAN&gt;self&lt;/SPAN&gt;&lt;span class="lia-unicode-emoji" title=":disappointed_face:"&gt;😞&lt;/span&gt;&lt;BR /&gt;        &lt;SPAN&gt;"""Refine the properties of a tool's parameters. This method is&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;        called when the tool is opened."""&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;def &lt;/SPAN&gt;&lt;SPAN&gt;updateParameters&lt;/SPAN&gt;(&lt;SPAN&gt;self&lt;/SPAN&gt;&lt;span class="lia-unicode-emoji" title=":disappointed_face:"&gt;😞&lt;/span&gt;&lt;BR /&gt;        &lt;SPAN&gt;"""Modify the values and properties of parameters before internal&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;        validation is performed. This method is called whenever a parameter&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;        has been changed."""&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;        &lt;SPAN&gt;if &lt;/SPAN&gt;&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;0&lt;/SPAN&gt;].value:  &lt;SPAN&gt;# feature class has been selected&lt;BR /&gt;&lt;/SPAN&gt;            useFields = [&lt;SPAN&gt;'PIN'&lt;/SPAN&gt;]  &lt;SPAN&gt;# name of field used by tool (parcel identification number - a string)&lt;BR /&gt;&lt;/SPAN&gt;            desc = arcpy.Describe(&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;0&lt;/SPAN&gt;].value)  &lt;SPAN&gt;# information about the input feature&lt;BR /&gt;&lt;/SPAN&gt;            fieldNames = {f.name: f.type &lt;SPAN&gt;for &lt;/SPAN&gt;f &lt;SPAN&gt;in &lt;/SPAN&gt;desc.fields}  &lt;SPAN&gt;# dictionary used to keep field names and types together&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;            &lt;SPAN&gt;if &lt;/SPAN&gt;set(useFields).issubset(fieldNames.keys()):  &lt;SPAN&gt;# all fields were found by tool&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;                # NOTE: if any selections have been made in fc, then only selected features will be searched&lt;BR /&gt;&lt;/SPAN&gt;                fc&lt;SPAN&gt;, &lt;/SPAN&gt;fld = str(&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;0&lt;/SPAN&gt;].value)&lt;SPAN&gt;, &lt;/SPAN&gt;useFields&lt;BR /&gt;                &lt;SPAN&gt;# GQD unique-values filter from all parcels in PARCELS_BASE&lt;BR /&gt;&lt;/SPAN&gt;                &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].filter.list = sorted(set([f[&lt;SPAN&gt;0&lt;/SPAN&gt;][:&lt;SPAN&gt;7&lt;/SPAN&gt;] &lt;SPAN&gt;for &lt;/SPAN&gt;f &lt;SPAN&gt;in &lt;/SPAN&gt;arcpy.da.SearchCursor(fc&lt;SPAN&gt;, &lt;/SPAN&gt;fld)]))&lt;BR /&gt;                &lt;SPAN&gt;if &lt;/SPAN&gt;&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].value &lt;SPAN&gt;not in &lt;/SPAN&gt;&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].filter.list:&lt;BR /&gt;                    &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].value = &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].filter.list[&lt;SPAN&gt;0&lt;/SPAN&gt;]&lt;BR /&gt;&lt;BR /&gt;                wc = &lt;SPAN&gt;"PIN LIKE '{}%'"&lt;/SPAN&gt;.format(&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].value)&lt;BR /&gt;                &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;5&lt;/SPAN&gt;].value = &lt;SPAN&gt;"querystring: " &lt;/SPAN&gt;+ wc  &lt;SPAN&gt;# display to debugger&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;                &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;2&lt;/SPAN&gt;].filter.list = sorted(set([f[&lt;SPAN&gt;0&lt;/SPAN&gt;][:] &lt;SPAN&gt;for &lt;/SPAN&gt;f &lt;SPAN&gt;in &lt;/SPAN&gt;arcpy.da.SearchCursor(fc&lt;SPAN&gt;, &lt;/SPAN&gt;fld&lt;SPAN&gt;, &lt;/SPAN&gt;wc)]))&lt;BR /&gt;                &lt;SPAN&gt;if &lt;/SPAN&gt;&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;2&lt;/SPAN&gt;].value &lt;SPAN&gt;not in &lt;/SPAN&gt;&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;2&lt;/SPAN&gt;].filter.list:&lt;BR /&gt;                    &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;2&lt;/SPAN&gt;].value = &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;2&lt;/SPAN&gt;].filter.list[&lt;SPAN&gt;0&lt;/SPAN&gt;]&lt;BR /&gt;&lt;BR /&gt;                &lt;SPAN&gt;# output completed whereClause&lt;BR /&gt;&lt;/SPAN&gt;                &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;3&lt;/SPAN&gt;].value = &lt;SPAN&gt;"PIN = '{}'"&lt;/SPAN&gt;.format(&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;2&lt;/SPAN&gt;].value)&lt;BR /&gt;                &lt;SPAN&gt;# self.params[3].value = "PIN = '{} {}'".format(self.params[1].value, self.params[2].value)&lt;BR /&gt;&lt;/SPAN&gt;                &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;5&lt;/SPAN&gt;].value = &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;3&lt;/SPAN&gt;].value  &lt;SPAN&gt;# display to debugger&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;            &lt;SPAN&gt;else&lt;/SPAN&gt;:  &lt;SPAN&gt;# at least one of the field names does not exist in feature; using the parameter to hold an error message&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;                &lt;SPAN&gt;if &lt;/SPAN&gt;&lt;SPAN&gt;'PIN' &lt;/SPAN&gt;&lt;SPAN&gt;not in &lt;/SPAN&gt;fieldNames.keys():&lt;BR /&gt;                    &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].value = &lt;SPAN&gt;"ERROR: Field 'PIN' not in selected feature class."&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&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;&lt;SPAN&gt;updateMessages&lt;/SPAN&gt;(&lt;SPAN&gt;self&lt;/SPAN&gt;&lt;span class="lia-unicode-emoji" title=":disappointed_face:"&gt;😞&lt;/span&gt;&lt;BR /&gt;        &lt;SPAN&gt;"""Modify the messages created by internal validation for each tool&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;        parameter. This method is called after internal validation."""&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;        &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;0&lt;/SPAN&gt;].clearMessage()&lt;BR /&gt;        &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].clearMessage()&lt;BR /&gt;        &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;2&lt;/SPAN&gt;].clearMessage()&lt;BR /&gt;        &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;3&lt;/SPAN&gt;].clearMessage()&lt;BR /&gt;        &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;4&lt;/SPAN&gt;].clearMessage()&lt;BR /&gt;        &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;5&lt;/SPAN&gt;].clearMessage()&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;if &lt;/SPAN&gt;&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;0&lt;/SPAN&gt;].value &lt;SPAN&gt;is not None&lt;/SPAN&gt;:        &lt;SPAN&gt;# set error msg if field not in feature so user can correct problem&lt;BR /&gt;&lt;/SPAN&gt;            &lt;SPAN&gt;if &lt;/SPAN&gt;&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].value &lt;SPAN&gt;is not None&lt;/SPAN&gt;:&lt;BR /&gt;                &lt;SPAN&gt;if &lt;/SPAN&gt;&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].value.startswith(&lt;SPAN&gt;"ERROR:"&lt;/SPAN&gt;&lt;span class="lia-unicode-emoji" title=":disappointed_face:"&gt;😞&lt;/span&gt;&lt;BR /&gt;                    &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].value = &lt;SPAN&gt;None     &lt;/SPAN&gt;&lt;SPAN&gt;# clear error message in parameter value, if desired&lt;BR /&gt;&lt;/SPAN&gt;                    &lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;1&lt;/SPAN&gt;].setErrorMessage(&lt;BR /&gt;                        &lt;SPAN&gt;"Field '{}' is not in Input FC '{}'"&lt;/SPAN&gt;.format(&lt;SPAN&gt;'PIN'&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;self&lt;/SPAN&gt;.params[&lt;SPAN&gt;0&lt;/SPAN&gt;].value))&lt;BR /&gt;&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;&lt;SPAN&gt;isLicensed&lt;/SPAN&gt;(&lt;SPAN&gt;self&lt;/SPAN&gt;&lt;span class="lia-unicode-emoji" title=":disappointed_face:"&gt;😞&lt;/span&gt;&lt;BR /&gt;        &lt;SPAN&gt;"""Set whether tool is licensed to execute."""&lt;BR /&gt;&lt;/SPAN&gt;        &lt;SPAN&gt;return True&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;#########################################################################################&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;# Below Toolvalidator code, create Toolvalidator class and call UpdateParameters + messages&lt;BR /&gt;&lt;/SPAN&gt;validator = ToolValidator()&lt;BR /&gt;validator.updateParameters()&lt;BR /&gt;validator.updateMessages()&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 16 Nov 2020 02:42:02 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/conditional-dropdown-in-tool-validator-based-on/m-p/1001636#M59057</guid>
      <dc:creator>AllisonClark</dc:creator>
      <dc:date>2020-11-16T02:42:02Z</dc:date>
    </item>
    <item>
      <title>Re: Conditional dropdown in Tool Validator based on user input</title>
      <link>https://community.esri.com/t5/python-questions/conditional-dropdown-in-tool-validator-based-on/m-p/1001968#M59064</link>
      <description>&lt;P&gt;Here's the script I used for debugging my Tool Validator code.&amp;nbsp; Since it is tested outside ArcMap, there are some modifications that are necessary.&amp;nbsp; For example, a full path to the feature containing your PINs is needed.&lt;/P&gt;&lt;LI-CODE lang="python"&gt;# HELP at http://desktop.arcgis.com/en/arcmap/latest/analyze/creating-tools/debugging-a-toolvalidator-class.htm

import arcpy

# Load the toolbox and get the tool's parameters, using the tool
#  name (not the tool label).
#
arcpy.ImportToolbox(r"C:\Path\to\toolbox.tbx") # toolbox location
params = arcpy.GetParameterInfo("SearchParcel") # name of script (not tool label)

# Set required parameters
#
params[0].value = r"C:\Path\to\geodatabase.gdb\PARCELS_BASE" # feature layer
# params[1].value = '0401' # first part of PIN
# params[2].value = '02' # middle part of PIN

# ToolValidator class block
# ----------------------------------------------------------------
class ToolValidator(object):

    def __init__(self):
        import arcpy
        self.params = arcpy.GetParameterInfo()

    def initializeParameters(self):
        # (initializeParameters code here)
        return

    def updateParameters(self):

        if self.params[0].value: # feature has been selected
            useFields = ['PIN'] # name of field used by tool (parcel identification number - a string)
            desc = arcpy.Describe(self.params[0].value)  # information about the input feature
            print(desc.dataType) # # Debug # #
            fieldNames = { f.name: f.type for f in desc.fields } # dictionary used to keep field names and types together
            print(fieldNames) # # Debug # #

            if set(useFields).issubset(fieldNames.keys()): # all fields were found by tool

                print("Field found in feature class") # # Debug # #
                # NOTE: If feature has selections, only the selections will be searched

                fc, fld = str(self.params[0].value), useFields

                self.params[1].filter.list = sorted(set([f[0][:4] for f in arcpy.da.SearchCursor(fc,fld)]))
                if self.params[1].value not in self.params[1].filter.list:
                    self.params[1].value = self.params[1].filter.list[0]
                    print(self.params[1].filter.list[0]) # # Debug # #
                    print(len(self.params[1].filter.list)) # # Debug # #
                    print(self.params[1].filter.list) # # Debug # #

                where_1 = "PIN LIKE '{}%'".format(self.params[1].value)
                print(where_1) # # Debug # #
                
                self.params[2].filter.list = sorted(set([f[0][5:7] for f in arcpy.da.SearchCursor(fc,fld,where_1)]))
                if self.params[2].value not in self.params[2].filter.list:
                    self.params[2].value = self.params[2].filter.list[0]
                    print(self.params[2].filter.list[0]) # # Debug # #
                    print(len(self.params[2].filter.list)) # # Debug # #
                    print(self.params[2].filter.list) # # Debug # #

                where_2 = "PIN LIKE '{} {}%'".format(self.params[1].value, self.params[2].value)
                print(where_2) # # Debug # #

                self.params[3].filter.list = sorted(set([f[0][8:] for f in arcpy.da.SearchCursor(fc,fld,where_2)]))
                if self.params[3].value not in self.params[3].filter.list:
                    self.params[3].value = self.params[3].filter.list[0]
                    print(self.params[3].filter.list[0]) # # Debug # #
                    print(len(self.params[3].filter.list)) # # Debug # #
                    print(self.params[3].filter.list) # # Debug # #

                # output completed whereClause
                self.params[4].value = "PIN = '{} {} {}'".format(self.params[1].value, self.params[2].value, self.params[3].value)
                print(self.params[4].value) # # Debug # #

            else: # at least one of the field names does not exist in feature; using the parameter to hold an error message

                if 'PIN' not in fieldNames.keys():
                    self.params[1].value = "ERROR: Field 'PIN' not in selected feature class."
                    print(self.params[1].value)  # # Debug # #

        return

    def updateMessages(self):
        
        self.params[0].clearMessage()
        self.params[1].clearMessage()
        self.params[2].clearMessage()
        self.params[3].clearMessage()
        if self.params[0].value is not None: # set error message if field not in feature so user can correct problem

            if self.params[1].value is not None:
                if self.params[1].value.startswith("ERROR:"):
                    self.params[1].value = None # clear error message in parameter value, if desired
                    self.params[2].value = None
                    self.params[3].value = None
                    self.params[0].setErrorMessage("Field '{}' is not in Input FC '{}'".format('PIN', self.params[0].value))
                    print('Setting message 0') # # Debug # #

        return
# ----------------------------------------------------------------
# Call routine(s) to debug
#
validator = ToolValidator()
validator.updateParameters()
validator.updateMessages()

print('\n')
for p in params:
    print(p.name, p.datatype, p.parameterType, p.direction, p.value)
print('\n')

# tool script (modified for debugging):
inFC = params[0].value # arcpy.GetParameterAsText(0) # input feature class (Input, Data Type 'Feature Layer')
PIN_a = params[1].value # arcpy.GetParameterAsText(1) # PIN[:4]  (Input, Data Type 'String')
PIN_b = params[2].value # arcpy.GetParameterAsText(2) # PIN[5:7] (Input, Data Type 'String')
PIN_c = params[3].value # arcpy.GetParameterAsText(3) # PIN[8:]  (Input, Data Type 'String')
whereClause = params[4].value # arcpy.GetParameterAsText(4) # set by ToolValidator updateParameters (Output, Derived, Data Type 'String')

arcpy.AddMessage("Where clause used: {}".format(whereClause))
print("Where clause used: {}".format(whereClause)) # # Debug # #

# convert inFC to feature layer since we are outside arcmap
arcpy.MakeFeatureLayer_management(inFC,'inFC_layer')
# use layer created
arcpy.SelectLayerByAttribute_management('inFC_layer', "NEW_SELECTION", where_clause=whereClause)

for i in range(arcpy.GetMessageCount()):  # display messages from SelectLayerByAttribute tool
    arcpy.AddMessage(arcpy.GetMessage(i))
# print messages created by SelectLayers
print(arcpy.GetMessages()) # # Debug # #

n = arcpy.GetCount_management(inFC)
arcpy.AddMessage("Number of records selected: {}".format(n))
print("Number of records selected: {}".format(n)) # # Debug # #&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;You will notice that I've added some print statements inside the Tool Validator.&amp;nbsp; Normally I wouldn't try to debug the tool's script while working on the validator's code, but it can be placed at the bottom and will need some modification.&amp;nbsp; Even then, you may get some unexpected results.&lt;/P&gt;&lt;P&gt;For testing the params (just before the validator class), I started with just the feature and added parts of the PIN to see what changes this would make.&lt;/P&gt;&lt;P&gt;Hope this helps.&lt;/P&gt;</description>
      <pubDate>Mon, 16 Nov 2020 23:38:45 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/conditional-dropdown-in-tool-validator-based-on/m-p/1001968#M59064</guid>
      <dc:creator>RandyBurton</dc:creator>
      <dc:date>2020-11-16T23:38:45Z</dc:date>
    </item>
    <item>
      <title>Re: Conditional dropdown in Tool Validator based on user input</title>
      <link>https://community.esri.com/t5/python-questions/conditional-dropdown-in-tool-validator-based-on/m-p/1006390#M59196</link>
      <description>&lt;P&gt;Hello Randy,&amp;nbsp;&lt;/P&gt;&lt;P&gt;I've been stuck on a weird problem with resetting the filters. The dropdowns that draw from the PARCELS_BASE feature layer work beautifully until I actually run the tool script. Thereafter, the dropdowns only show the parcel ID that was used by the script. The only way to reset them is to close the project and reopen it.&amp;nbsp;&lt;/P&gt;&lt;P&gt;The attachment shows an example.&amp;nbsp;&lt;/P&gt;&lt;P&gt;I checked the PARCELS_BASE table; my script does a CLEAR SELECTION on it, and nothing is still selected.&amp;nbsp;&lt;/P&gt;&lt;P&gt;I didn't find much online on the topic of resetting filter lists drawn from the database, and nothing at all about using them in ToolValidator.&amp;nbsp;&lt;/P&gt;&lt;P&gt;I tried these statements in different places to no effect:&lt;/P&gt;&lt;P&gt;self.params[1].filter.list = []&lt;/P&gt;&lt;P&gt;cursor.reset()&amp;nbsp; &amp;nbsp; &amp;nbsp;(where cursor = arcpy.da.SearchCursor())&lt;/P&gt;&lt;P&gt;What am I missing?&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 02 Dec 2020 21:44:36 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/conditional-dropdown-in-tool-validator-based-on/m-p/1006390#M59196</guid>
      <dc:creator>AllisonClark</dc:creator>
      <dc:date>2020-12-02T21:44:36Z</dc:date>
    </item>
    <item>
      <title>Re: Conditional dropdown in Tool Validator based on user input</title>
      <link>https://community.esri.com/t5/python-questions/conditional-dropdown-in-tool-validator-based-on/m-p/1006513#M59198</link>
      <description>&lt;P&gt;Update: It looks like I need to put&amp;nbsp;SelectLayerByAttribute(&lt;SPAN&gt;"PARCELS_BASE"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;"CLEAR_SELECTION"&lt;/SPAN&gt;) into the ToolValidator code specifically?? I tried debugging in the Pro python window and found that worked.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 03 Dec 2020 02:58:57 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/conditional-dropdown-in-tool-validator-based-on/m-p/1006513#M59198</guid>
      <dc:creator>AllisonClark</dc:creator>
      <dc:date>2020-12-03T02:58:57Z</dc:date>
    </item>
    <item>
      <title>Re: Conditional dropdown in Tool Validator based on user input</title>
      <link>https://community.esri.com/t5/python-questions/conditional-dropdown-in-tool-validator-based-on/m-p/1006520#M59199</link>
      <description>&lt;P&gt;Yes, the tool should clear the selection.&amp;nbsp; Typically, this would be when things complete.&amp;nbsp; The user would need to manually clear any selections before reusing the tool, or the next use of the tool would be limited to the selections.&lt;/P&gt;&lt;P&gt;If it is important to see the selected feature after running the tool, I suppose you could insert the "clear selection" instruction at the start of the tool validator code.&amp;nbsp; The idea would be to clear any selections before populating the drop-downs.&amp;nbsp;&lt;/P&gt;&lt;P&gt;I could also see that allowing the user to select a group of features to search may help performance if there are lots of parcels and only a specific neighborhood needs to be searched.&amp;nbsp; Then the user would need to know if the dropdown doesn't contain enough selections, then exit the tool, clear any selections and try again.&lt;/P&gt;</description>
      <pubDate>Thu, 03 Dec 2020 03:40:33 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/conditional-dropdown-in-tool-validator-based-on/m-p/1006520#M59199</guid>
      <dc:creator>RandyBurton</dc:creator>
      <dc:date>2020-12-03T03:40:33Z</dc:date>
    </item>
    <item>
      <title>Re: Conditional dropdown in Tool Validator based on user input</title>
      <link>https://community.esri.com/t5/python-questions/conditional-dropdown-in-tool-validator-based-on/m-p/1006521#M59200</link>
      <description>&lt;P&gt;If you want to clear selections in the Tool Validator section, you might try:&lt;/P&gt;&lt;LI-CODE lang="python"&gt;    def updateParameters(self):

        if self.params[0].value: # feature has been selected

            arcpy.SelectLayerByAttribute_management(self.params[0].value, "CLEAR_SELECTION")

            # code continues&lt;/LI-CODE&gt;</description>
      <pubDate>Thu, 03 Dec 2020 03:52:48 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/conditional-dropdown-in-tool-validator-based-on/m-p/1006521#M59200</guid>
      <dc:creator>RandyBurton</dc:creator>
      <dc:date>2020-12-03T03:52:48Z</dc:date>
    </item>
  </channel>
</rss>

