Multiple Subset Selections

2904
5
09-12-2012 08:33 AM
NoahHuntington
Occasional Contributor
Is it possible to have two subset selections in a tool.  As in...

  arcpy.SelectLayerByAttribute_management(lyr, "NEW_SELECTION", query)
  arcpy.SelectLayerByAttribute_management(lyr, "SUBSET_SELECTION", query1)
  arcpy.SelectLayerByAttribute_management(lyr, "SUBSET_SELECTION", query2)


Thanks in advance...
Tags (2)
0 Kudos
5 Replies
by Anonymous User
Not applicable
Is it possible to have two subset selections in a tool.  As in...

  arcpy.SelectLayerByAttribute_management(lyr, "NEW_SELECTION", query)
  arcpy.SelectLayerByAttribute_management(lyr, "SUBSET_SELECTION", query1)
  arcpy.SelectLayerByAttribute_management(lyr, "SUBSET_SELECTION", query2)


Thanks in advance...


Yes, I have done this before.  The final selection will be only those attributes that are in common after all 3 queries.
0 Kudos
NoahHuntington
Occasional Contributor
Yes, I have done this before.  The final selection will be only those attributes that are in common after all 3 queries.


hmm. I must have something in the rest of my code.  Any thoughts?

import arcpy

def main():
    arcpy.AddMessage("Starting")

    # Get and set variables
    sub = arcpy.GetParameterAsText(0)
    unit = arcpy.GetParameterAsText(1)
    blk = arcpy.GetParameterAsText(2)
    layer_name = "tax_acct"
    df_name = "Layers"

    arcpy.AddMessage(sub)
    arcpy.AddMessage(unit)
    arcpy.AddMessage(blk)

    
    # Define mxd, df and lyr objects
    mxd = arcpy.mapping.MapDocument("CURRENT")
    df = arcpy.mapping.ListDataFrames(mxd, df_name)[0]
    lyr = arcpy.mapping.ListLayers(mxd, layer_name, df)[0]

    arcpy.AddMessage(lyr.name)

    # Create where clause for selection
    query = "SUBDIVISIO = '%s'" % (sub)
    query1 = "UNIT_NUMBE = '%s'" % (unit)
    query2 = "BLK_NUM = '%s'" % (blk)

    arcpy.AddMessage(query)
    arcpy.AddMessage(query1)
    arcpy.AddMessage(query2)

    try:
        
        arcpy.SelectLayerByAttribute_management(lyr, "NEW_SELECTION", query)
        arcpy.SelectLayerByAttribute_management(lyr, "SUBSET_SELECTION", query1)
        arcpy.SelectLayerByAttribute_management(lyr, "SUBSET_SELECTION", query2)
      

    except Exception as e:
        print e.message
    
        # If using this code within a script tool, AddError can be used to return messages 
        #   back to a script tool.  If not, AddError will have no effect.
        arcpy.AddError(e.message)
        
    # Get number of selected features
    selection = int(arcpy.GetCount_management(layer_name).getOutput(0))

    arcpy.AddMessage("%s features selected" % (selection))

    # Set df extent to layer selection
    df.extent = lyr.getSelectedExtent()
    arcpy.RefreshActiveView()

    arcpy.AddMessage("Completed")


main()

0 Kudos
ChrisSnyder
Regular Contributor III
Wouldn't it be more efficient to just do:

query = "SUBDIVISIO = '%s'" % (sub)
query1 = "UNIT_NUMBE = '%s'" % (unit)
query2 = "BLK_NUM = '%s'" % (blk)
arcpy.SelectLayerByAttribute_management(lyr, "NEW_SELECTION", query + " AND " + query1 + " AND " + query2)


or better yet:

arcpy.MakeFeatureLayer_management(lyr, "new_layer", query + " AND " + query1 + " AND " + query2)
0 Kudos
NoahHuntington
Occasional Contributor
Wouldn't it be more efficient to just do:

query = "SUBDIVISIO = '%s'" % (sub)
query1 = "UNIT_NUMBE = '%s'" % (unit)
query2 = "BLK_NUM = '%s'" % (blk)
arcpy.SelectLayerByAttribute_management(lyr, "NEW_SELECTION", query + " AND " + query1 + " AND " + query2)


or better yet:

arcpy.MakeFeatureLayer_management(lyr, "new_layer", query + " AND " + query1 + " AND " + query2)


Hi Chris,

First code returned error.  I think I need to allow for <null> in query.  Suggestions?  Can't use second as I am trying to select from layers in TOC.



Executing: SubZoom "SLEEPY HOLLOW" 4 27
Start Time: Wed Sep 12 13:18:14 2012
Running script SubZoom...
Starting
SLEEPY HOLLOW
4
27
tax_acct
SUBDIVISIO = 'SLEEPY HOLLOW'
UNIT_NUMBE = '4'
BLK_NUM = '27'

Traceback (most recent call last):
  File "G:\Sub.py", line 45, in <module>
    main()
  File "G:\Sub.py", line 35, in main
    arcpy.SelectLayerByAttribute_management(lyr, "NEW_SELECTION", query + " AND " + query1 + " AND " + query2)
  File "C:\Program Files\ArcGIS\Desktop10.1\arcpy\arcpy\management.py", line 6461, in SelectLayerByAttribute
    raise e
ExecuteError: ERROR 000358: Invalid expression
Failed to execute (SelectLayerByAttribute).


Failed to execute (SubZoom).
Failed at Wed Sep 12 13:18:15 2012 (Elapsed Time: 1.00 seconds)
0 Kudos
NoahHuntington
Occasional Contributor
Actually I got this to work by removing leading zeros from fields.  It does however return error if any of the selected fields have any null or empty values.  Suggestions anybody?

import arcpy

def main():
    arcpy.AddMessage("Starting")

    # Get and set variables
    sub = arcpy.GetParameterAsText(0)
    unit = arcpy.GetParameterAsText(1)
    blk = arcpy.GetParameterAsText(2)
    lot = arcpy.GetParameterAsText(3)
    layer_name = "tax_acct"
    df_name = "Layers"

    arcpy.AddMessage(sub)
    arcpy.AddMessage(unit)
    arcpy.AddMessage(blk)
    arcpy.AddMessage(lot)
    
    # Define mxd, df and lyr objects
    mxd = arcpy.mapping.MapDocument("CURRENT")
    df = arcpy.mapping.ListDataFrames(mxd, df_name)[0]
    lyr = arcpy.mapping.ListLayers(mxd, layer_name, df)[0]

    arcpy.AddMessage(lyr.name)

    # Create where clause for selection
    query = "SUBDIVISIO = '%s'" % (sub)
    query1 = "UNIT_NUMBE = '%s'" % (unit)
    query2 = "BLOCK_NUMB = '%s'" % (blk)
    query3 = "LOT_NUMBER = '%s'" % (lot)

    arcpy.AddMessage(query)
    arcpy.AddMessage(query1)
    arcpy.AddMessage(query2)
    arcpy.AddMessage(query3)
            
    arcpy.SelectLayerByAttribute_management(lyr, "NEW_SELECTION", query)
    arcpy.SelectLayerByAttribute_management(lyr, "SUBSET_SELECTION", query1)
    arcpy.SelectLayerByAttribute_management(lyr, "SUBSET_SELECTION", query2)
    arcpy.SelectLayerByAttribute_management(lyr, "SUBSET_SELECTION", query3)
    
    # Set df extent to layer selection
    df.extent = lyr.getSelectedExtent()
    arcpy.RefreshActiveView()

    arcpy.AddMessage("Completed")


main()

0 Kudos