Need SDE connection?

382
3
07-18-2012 08:49 AM
Zeke
by
Regular Contributor III
The script below runs fine when all the feature classes are in the same geodatabase (TestCases_Geodatabase.gdb). But for production, one of the features, Parcel, is in a SDE geodatabase. This fails, however. Not sure if problem is in the workspace setting, feature class name, if I need a connection string to the SDE, or what. The actual feature class name is in a feature dataset in the db and is named CitySDE.GIS.Parcel. If I use the name CitySDE.GIS.Parcel in the line parcel =, I get error 1; if I change the line to parcel = "Parcel" (the name in the TOC), I get error 2.

Any help greatly appreciated. Thanks.

Error 1 - parcel = "CitySDE.GIS.Parcel"
Executing: CreateCaseFeature del1
Start Time: Wed Jul 18 10:52:30 2012
Running script CreateCaseFeature...
Case number: del1
Checking for previous layer
<class 'arcgisscripting.ExecuteError'>: Failed to execute. Parameters are not valid.
ERROR 000732: Input Rows: Dataset TempleSDE.GIS.Parcel does not exist or is not supported
Failed to execute (GetCount).
...


Error 2 - parcel = "Parcel"

Dissolve complete...Appending to Cases
Error adding parcels to Cases in SelectCases(). 
Failed to execute. Parameters are not valid.
The value cannot be a feature class
ERROR 000840: The value is not a Raster Catalog Layer.
ERROR 000840: The value is not a Mosaic Layer.
Failed to execute (SelectLayerByLocation).

Adding Case number...
Case number del1 added.
Setting definition query to: "Case_" = 'del1'
<type 'exceptions.UnboundLocalError'>: local variable 'layer' referenced before assignment
Failed to execute (CreateCaseFeature).
Failed at Wed Jul 18 11:03:02 2012 (Elapsed Time: 43.00 seconds)



import arcpy, sys
from arcpy import env

env.workspace = r"\\ServerA\Planning\Cases_Geodatabase.gdb"
#env.workspace = r"\\ServerA\Planning\TestCases_Geodatabase.gdb"
env.overwriteOutput = True
case_number = arcpy.GetParameterAsText(0)
arcpy.AddMessage("Case number: " + case_number)
lyr = r"\\ServerA\Planning\Cases_Geodatabase.gdb\temp_parcel_lyr"
#lyr = r"\\ServerA\Planning\TestCases_Geodatabase.gdb\temp_parcel_lyr"
parcel = "CitySDE.GIS.Parcel"
mxd = arcpy.mapping.MapDocument("CURRENT")

#-------------------------------------------------------------------------------

def MakeCaseFeature():
    '''  Dissolve selected parcel features into one temporary lyr file.
         Append it to the Cases feature class.
         Delete the temporary lyr file.
         Clear the parcel selection. '''


    clear = "CLEAR_SELECTION"
    target = "Cases"
    schemaType = "NO_TEST"
    fld = "CENTRACT"    # no data is stored in this field
    selectType = "HAVE_THEIR_CENTER_IN"

    try:
        arcpy.AddMessage("Starting Dissolve...")

        # make temporary parcel lyr file from selected parcels, dissolving them
        # into one feature
        arcpy.Dissolve_management(parcel, lyr, fld)

        arcpy.AddMessage("Dissolve complete...Appending to Cases")

        # add case feature in temporary layer to Cases
        arcpy.Append_management(lyr, target, schemaType, "", "")

        # select new case feature
        arcpy.SelectLayerByLocation_management(target, selectType, lyr)

        # delete temporary layer
        arcpy.Delete_management(lyr)

        arcpy.AddMessage("Append complete...")

        # clear selection on parcels
        arcpy.SelectLayerByAttribute_management(parcel, clear)

    except Exception as e:
        arcpy.AddError("Error adding parcels to Cases in SelectCases(). \n" + e.message)

#-------------------------------------------------------------------------------
# Add case number to case_ field in Cases
#

def AddCaseNumber():
    fc = "Cases"
    fld = "Case_"

    arcpy.AddMessage("Adding Case number...")

    try:
        arcpy.CalculateField_management(fc, fld, '"%s"' % case_number)
        arcpy.AddMessage("Case number " + case_number + " added.")
    except Exception as e:
        arcpy.AddError("Error setting Case_ field value to case number: " + case_number +  "\n" + e.message)

#-------------------------------------------------------------------------------
# Set the definition query to display only the new case
#

def SetDefinitionQuery():
    clear = "CLEAR_SELECTION"
    fc = "Cases"
    fld = "Case_"
    query = "\"Case_\" = '%s'" % case_number
    # alternate formatting methods for query
    # query = "\"%s\" = '%s'" % (fld, case_number)
    # query = '"%s"' % fld + " = " + "'%s'" % case_number
    mxd = arcpy.mapping.MapDocument("CURRENT")

    arcpy.AddMessage("Setting definition query to: " + query)

    try:
        arcpy.RefreshActiveView()
        for layer in arcpy.mapping.ListLayers(mxd, fc):
            layer.definitionQuery = query

        # clear selection on parcels
        arcpy.SelectLayerByAttribute_management(fc, clear)

    except Exception as e:
        arcpy.AddError("Error setting definition query. \n" + layer.definitionQuery + "/n" + e.message)

    arcpy.RefreshActiveView()
    arcpy.RefreshTOC()
    mxd.save()
    del mxd

#-------------------------------------------------------------------------------
# Start 'er up!
#

def main():
    arcpy.AddMessage("Checking for previous layer")
    if arcpy.Exists(lyr):
        arcpy.Delete_management(lyr)

    # Check how many parcels are selected. Count returns all parcels if none are
    # selected, or only selected ones if there are any. Check returns a list of
    # selected parcels, or 0 if none are selected.
    count = int(arcpy.GetCount_management(parcel).getOutput(0))
    desc = arcpy.Describe(parcel)
    check = desc.FIDSet

    # make sure parcels are selected before running rest of script, otherwise exit
    if len(check) != 0:
        arcpy.AddMessage("There are " + str(count) + " parcels selected \n" )
        for layer in arcpy.mapping.ListLayers(mxd, "Cases"):
            layer.definitionQuery = ""
        MakeCaseFeature()       # create the case feature
        AddCaseNumber()         # add case number to the case field
        SetDefinitionQuery()    # only display current case

        arcpy.RefreshActiveView()
        arcpy.RefreshTOC()

    else:
        arcpy.AddError("No features selected! \n Please select at least one parcel feature. \n")
        arcpy.AddError("Quitting the Create Case tool \n")


if __name__ == '__main__':
    main()
Tags (2)
0 Kudos
3 Replies
MathewCoyle
Frequent Contributor
When you are making selections you need to make your feature classes layers.
0 Kudos
Zeke
by
Regular Contributor III
When you are making selections you need to make your feature classes layers.

Thanks, appreciate it. Which feature classes? I create a temporary layer to hold the preliminary Case feature before adding it to the feature class. Also, both features - Case and Parcel - are feature classes in the TestCases_Geodatabase, where it runs fine, so I don't know why it wouldn't run in production, except that Parcel is in a sde database there. That's the only difference I can think of.
It would be inconvenient to make the sde Parcel feature class a lyr file. It contains tens of thousands of records that are updated fairly frequently. I'd have to recreate it every time the script is run. The purpose of this script is to automate a task for another department where the users don't have a lot of Arc experience.
0 Kudos
MathewCoyle
Frequent Contributor
The "CitySDE.GIS.Parcel" I assume is the name of the feature class not the layer "Parcels" in your mxd correct? What you want to do is your second case where you have "Parcels" as the referenced layer the user is making the selection on.

The error you are receiving in your second case is that
target = "Cases"
references a feature class in
env.workspace = r"\\ServerA\Planning\Cases_Geodatabase.gdb"
not the layer in your mxd. So you can either references the layer in the mxd that is pointing to the "Cases" feature class, or you can create a feature layer using Make Feature Layer.
0 Kudos