English

How To: Create a model that makes a correctly formatted query from a string input with special characters

Summary

Models are often created that expose a string parameter, which is used to create a query to a database. For example, a model may be created that prompts the user for a county name, and then selects this county using the Select Layer by Attribute tool. Typically, this works correctly; however, database specific problems can arise. For example, when the input string contains a single quotation mark ('), it must be escaped when the query string is created. Instructions provided describe how to create a model that makes a correctly formatted query from a string input with special characters.

Procedure

Use the Calculate Value tool to do string manipulation in a model. This tool allows the use of the Python scripting language to do things like manipulate strings.

The following steps detail the process of creating a model that runs 'Make Feature Layer' with a query based on a user input string, and demonstrates how to manipulate the input string with the Calculate Value tool to ensure that the query works correctly. The example used throughout this procedure is for a query containing a single quotation mark (').

In this example, a model is being created that will select a restaurant by name from a file geodatabase feature class containing all restaurants in a city.

  1. Make a new toolbox.
    [O-Image] CreateNewToolbox
    In this new toolbox make a new model.
    [O-Image] CreateNewModel
    When a new model is created, a new model window should appear.
  2. Add the Make Feature Layer tool to the model. This tool is found in the Data Management Tools toolbox, in the Layers and Table Views toolset.
    [O-Image] MFLlocation
    Add the tool by dragging it from the ArcToolbox window and dropping it into the Model window. The model should now have the Make Feature Layer tool added.
    [O-Image] MakeFeatureLayerModel
  3. Add a dataset from a file geodatabase to the model. This is done by dragging and dropping a dataset from the Catalog Tree into the model. Alternatively, the 'add data' button in model builder can be used to add the dataset. The model should now have a tool and a dataset.
    [O-Image] MakeFeatureLayerWithData
  4. Double-click the Make Feature Layer tool that was added to the Model to open its input dialog box. For 'Input Features', use the drop-down menu to select the dataset that was added to the model.
    [O-Image] ChooseDataInMFL
    Click Ok to close the Make Feature Layer tool dialog box. The dataset should now be connected to the tool.
    [O-Image] MFLConnected
  5. Next, a string variable must be created. Right-click in the white space of the model and select 'Create Variable'.
    [O-Image] CreateVariable
    Scroll down and select 'string' and click Ok. A new string variable should be added to the model named 'String'. Rename the variable to 'Restaurant Name'. Double-click 'Restaurant Name' to open its value. Give it a default value. In this case, the default value is Anderson's.
    [O-Image] GiveRestaurantAValue
    Click Ok to return to the main model window. The string variable now has a value and should turn blue. The model should now have three variables and a tool.
    [O-Image] ThreeVarsAndaTool
  6. Now, the Calculate Value tool can be added to the model. Drag and drop the tool from the ArcToolbox window into the model. The Calculate Value tool is found in the Data Management Tools toolbox in the General toolset.
    [O-Image] CalculateValueLocation
    There should now be two tools in the model.
  7. The Calculate Value tool is used to manipulate the contents of the string variable named 'Restaurant' to create a query for a file geodatabase. A simple query uses the following syntax:

    "FIELDNAME" = 'value'

    In this case, it is known that some restaurants will have a single quotation mark (') in their name, for example, Anderson's Restaurant. In a query to a file geodatabase, this single quotation mark (') must be replaced with two single quotation marks (''). For example:

    "NAME" = 'Anderson''s Restaurant'

    Therefore, when the user types in Anderson's Restaurant in the string parameter, it needs to be changed to Anderson''s Bar before it is used in Make Feature Layer's query parameter.

    To do this, double-click the Calculate Value tool to open its input dialog box. In the Expression parameter type in:

    "%Restaurant Name%".replace("'", "''")

    The above expression also takes advantage of 'inline variables substitution'. A full explanation of inline variable substitution can be found in model builder at the following link: Inline Variable Discussion.

    The other parameter is the data type of the output. Change this from Variant to String.

    Calculate value should be ready.
    [O-Image] CalculateValueReady
    Click Ok to close the dialog box and return to the main model builder window.
  8. It is useful to change names of variables in the model so that they make sense. Change the name of Calculate Values output variable. Currently, it is 'output_value'. Rename this variable to 'FixedName', so that it is easier to remember.
    [O-Image] RenameOutputValue
  9. Ensure that Make Feature Layer uses the fixed string in its query. To do this, double-click the Make Feature Layer tool to open its input dialog box. In the Expression parameter type:

    "NAME" = '%FixedName%'

    Again, making use of inline variables. In this case, the value of the FixedName variable needs to be substituted into the expression.
    [O-Image] MFLquery
    Click Ok to save the changes and return to the main model builder window.
  10. Because the tools in this model are only tied to one another through inline variable substitution, it is important to fix the order of operations. To do this, a couple of preconditions need to be set. When a precondition is set on a tool, it means that the tool will not run until the precondition is set. Two preconditions need to be set in this model. First, ensure that Calculate Value will not run until the input string variable (Restaurant Name) has a value. Right-click the tool and select 'Properties'.
    [O-Image] CalculateValueRightClipProperties
    When the Properties dialog box appears, click the Preconditions tab. The Preconditions tab should have a list of all the variables in the model, including the Restaurant Name string variable. Select the Restaurant Name variable
    [O-Image] CalculateValuePreconditions
    and click Ok. The model should now have a dotted line between the string variable and Calculate Value.
    [O-Image] DottedLink
    This means that the Calculate Value tool will not run until the Restaurant Name variable has a value.
  11. Ensure that the Make Feature Layer tool does not run until after the Calculate Value tool has completed. Set a precondition on the Make Feature Layer tool, which will prevent it from running until the output of Calculate Value (FixedName) has a value. Right-click the Make Feature Layer tool and select 'Properties'. When the Properties dialog box appears, click the Preconditions tab. The Preconditions tab should have a list of all the variables in the model. Turn 'FixedName' on.
    [O-Image] MFLPrecondition
    Click Ok to save the change and exit the dialog box. The model should now have a dotted line between the output of Calculate Value and the Make Feature Layer tool.
    [O-Image] ModelWithPreconditions
  12. The parameters on the tool need to be exposed, so when the user types in an input name, the output will be the output of Make Feature Layer. To make parameters in a model, right-click the variable that needs to be a parameter and select 'Model Parameter'. This needs to be done on two variables: the 'Restaurant Name' variable
    [O-Image] MakeInputParameter
    and the output from the Make Feature Layer tool.
    [O-Image] MakeOutputParameter
    Once this is done, the model is ready to be run and tested.

    Note:
    It may be best to test this model in ArcMap, so that visual results are returned.

  13. Save the model.

Related Information