Skip navigation
All Places > Survey123 for ArcGIS > Blog > 2017 > October > 26

With the 2.4 release of Survey123 Connect, a null value is now supported in the bind::esri:fieldType column of an XLSFormWhen the field type is null, Survey123 Connect will not create a field when publishing.  I’d like to highlight 3 cases where this can really enhance your forms: 

  1. Intermediate Calculations 
  2. Multiple Geopoints 
  3. More easily match an existing feature services 

 

Intermediate Calculations 

When doing a set of complex calculations, it’s often easier to break out sub calculations into their own question to make them more manageable.  While this was easier for you as a survey author to manage, this meant that you would have these intermediate steps stored in the database.  By assigning these the null field type, we simplify the data being stored to only the final calculations. 

For example, this Excel sheet calculates the linear regression of three observations. This involves a number of intermediate calculations, beginning with calculating the mean value of X & Y and then the distance an observation is from the mean value. 

 

Multiple Geopoints 

Form with 2 points

Another popular request the null value solves is the ability to capture multiple locations in a form; one location can be stored as the geometry of the feature with the other points being stored in x & y fields. Note that as the survey submission needs to have a geometry, you must have 1 geopoint question not set to null.

 

An example where multiple geopoints are useful is when collecting the location of a culvert or other relatively straight linear asset.   

To store the point information, get started by creating 3 (or more) questions for each point after the first: 

  1. The geopoint question to record the value 
  2. Two decimal (or calculate/hidden) questions to store the points x and y values (add additional fields for z and accuracy, if desired) 

Set the field type to null for the geopoint and use the pulldata(‘@geopoint’) function to extract the value after the point is set.  Here's a basic sample with a start and end point. 

 

Matching an existing feature service 

While Survey123 can automatically create a form based on an existing feature service, it may not create the form you quite want.  For example, a field storing how long someone has lived at a place might be better shown on the form by asking when did they move in – the length of time can then be calculated.  By creating a separate question to be asked with the null field type, you can create some flexibility between what is asked and the data that gets stored. 

 

Have another use for the null field type? Share in the comments below! 

 

 

 

On occasion, you may want to limit the extent in which points can be input into a survey. This may be to simply validate the input data on initial entry, or to restrict input for functional requirements. In the attached survey, the extent has been limited to Ireland. In order to do this, there are a few things that have to be done.

 

1. Get Extent Values

 

A good way to do this is to go to your organisations settings. Go to your Organisation - Edit Settings - Map and click Choose Extent as below.

 

 

From there, you can a Draw an extent, and note down the Lat/Long values you will need to use in your survey. The values below correspond to the values used in the attached form, so you can directly replace them as necessary.

 

 

The alternative is to use the super-useful Super-Duper Extent Helper developed by Bradley Snider.

 

Image of Bradley Snider's Super-Duper Extent Helper

 

2. Setup Calculations in Survey123 Connect

 

There are various calculations you have to make in order to limit and input point to a particular extent, as below.

 

  • pulldata("@geopoint",${Location},"x")
    • This pulls the x attribute from the ${Location} geopoint question and stores it as a separate attribute
    • Further information on pulling data from geopoint questions can be found in this blog post
  • pulldata("@geopoint",${Location},"y")
    • This pulls the y attribute from the ${Location} geopoint question and stores it as a separate attribute
  • if((number(${XValue}) > -10.7) and (number(${XValue}) < -5.4), 1, 0)
    • This uses the if function in order to ensure the the x attribute returned from the pulldata function is between -10.7 and -5.4. If this is true, the value of this field is equal to 1, otherwise it is equal to 0
  • if((number(${YValue}) > 51.4) and (number(${YValue}) < 55.4), 1, 0)
    • This uses the if function in order to ensure the the y attribute returned from the pulldata function is between 51.4 and 55.4. If this is true, the value of this field is equal to 1, otherwise it is equal to 0
  • int(${ValidX}) + int(${ValidY})
    • This calculation adds the values of both if calculations together

 

3. Setup Constraint

 

This is ultimately what is used to check whether the point is within the specified extent. A message is returned to the user if it is not within the appropriate extent. In order for this to pass, it's value must equal 2 (i.e. the sum of both if statements). If it is not equal to 2, it means that either the x or y attributes, or both do not lie within the specified extent.

 

4. Hide and Don't Store Validation Calculations

 

In order to hide any validation calculations, we set the field types as hidden. We also use The Power of Nothing to ensure fields are not created to store the calculation results being used as part of the point validation (see bind::esri:fieldType column).

 

5. Add a Note when Outside of Extent

 

This will help notify the user that they are outside of the allowable extent. To do this, you add a note row, along with a label - not including a name here results in a field not being created in the Feature Layer for the note. Then specify a relevant calculation so that the warning message only gets displayed when the user is outside of the allowable extent.

 

See the completed form below (also attached):

 

typenamelabelconstraintconstraint_messagerelevantcalculationbind::esri:fieldType
geopointLocationSpecify Location
hiddenXValueX Co-Ordinatepulldata("@geopoint",${Location},"x")null
hiddenYValueY Co-Ordinatepulldata("@geopoint",${Location},"y")null
hiddenValidXX Within Rangeif((number(${XValue}) > -10.7) and (number(${XValue}) < -5.4), 1, 0)null
hiddenValidYY Within Rangeif((number(${YValue}) > 51.4) and (number(${YValue}) < 55.4), 1, 0)null
hiddenAllowedWithin Specified Extent?.=2Specified Location Outside of Extentint(${ValidX}) + int(${ValidY})null
note<b><center><font color="red">**** Specified Location Outside of Ireland ****</font></center></b>${Allowed} != 2

 

This is not currently supported in Web Forms because the pulldata() function is not supported when used against geopoint question (as documented here)