Retrieve Coded Domain Values from Query

11291
18
08-13-2010 01:13 PM
DonCaviness
New Contributor III
I am running a query on a dataset and the data that is being returned has coded domain values in the database.  How do I get the name returned instead of the value?  In other words I am getting the value of '1' but I would like returned 'School'.  I can see in the REST directory that the all the info is there, I am just not sure how to display 'School' instead of '1'.  Any examples or help would be greatly appreciated.
Tags (2)
0 Kudos
18 Replies
DasaPaddock
Esri Regular Contributor
The server won't return the query results with the name instead of the value, but you can use the LayerDetails.fields and types to get to the domains and then show the name instead of the value when you're displaying the results.

Reference:
http://help.arcgis.com/en/webapi/flex/apiref/com/esri/ags/layers/supportClasses/LayerDetails.html
http://help.arcgis.com/en/webapi/flex/apiref/com/esri/ags/layers/supportClasses/Domain.html
0 Kudos
DonCaviness
New Contributor III
The server won't return the query results with the name instead of the value, but you can use the LayerDetails.fields and types to get to the domains and then show the name instead of the value when you're displaying the results.

Reference:
http://help.arcgis.com/en/webapi/flex/apiref/com/esri/ags/layers/supportClasses/LayerDetails.html
http://help.arcgis.com/en/webapi/flex/apiref/com/esri/ags/layers/supportClasses/Domain.html


Dasa, is there a sample or code snippet of how this works?
0 Kudos
RobertScheitlin__GISP
MVP Emeritus
Don,

    I am not sure why the api team has not shared a sample for this yet, so I created one.

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
      xmlns:s="library://ns.adobe.com/flex/spark"
      xmlns:mx="library://ns.adobe.com/flex/mx"
      xmlns:esri="http://www.esri.com/2008/ags"
      pageTitle="Query with Domain Values Returned" currentState="test">
 <!--
 This sample shows how to query the server and displaying
 the result in a datagrid with domain values returned or not.
  
 This sample sets up a QueryTask (what layer on what server to query).
 When the user clicks the "Search" button, a Query is sent.
 The results are displayed in the DataGrid and if the option for 
 "results with domain values" is chosen than the featurelayers'
 layerDetails fields is used to retrieve the value of the domain.
 -->

 <fx:Declarations>
  <s:RadioButtonGroup id="qGroup"/>
 </fx:Declarations>
 <s:layout>
  <s:VerticalLayout gap="0" horizontalAlign="center"/>
 </s:layout>

 <fx:Script>
  <![CDATA[
   import com.esri.ags.FeatureSet;
   import com.esri.ags.Graphic;
   import com.esri.ags.layers.supportClasses.CodedValue;
   import com.esri.ags.layers.supportClasses.CodedValueDomain;
   import com.esri.ags.layers.supportClasses.Domain;
   import com.esri.ags.layers.supportClasses.LayerDetails;
   import com.esri.ags.layers.supportClasses.RangeDomain;
   import com.esri.ags.tasks.QueryTask;
   import com.esri.ags.tasks.supportClasses.Query;
   
   import mx.collections.ArrayCollection;
   import mx.controls.Alert;
   import mx.rpc.AsyncResponder;
   import mx.utils.ObjectUtil;
   
   private function getDomainValue(fieldName:String,code:String):String
   {
    var returnValue:String = "";
    var fld:Object;
    var cVal:CodedValue;
    var cDomain:CodedValueDomain;
    for each (fld in fLayer.layerDetails.fields)
    {
     if(fld.name == fieldName){
      cDomain = fld.domain;
      if (cDomain){
       for each (cVal in cDomain.codedValues)
       {
        if(cVal.code == code)
         returnValue = cVal.name;
       }
      }
     }
    }
    return returnValue;
   }
   
   protected function doQuery():void
   {
    myMap.cursorManager.setBusyCursor();
    var queryTask:QueryTask = new QueryTask("http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/SanFrancisco/311Incidents/MapServer/0");
    queryTask.useAMF = true;
    var query:Query = new Query();
    query.where = "status > 1";
    query.outFields = ["*"];
    query.returnGeometry = true;
    query.outSpatialReference = myMap.spatialReference;
    queryTask.execute(query, new AsyncResponder(onResult, onFault));
    
    // on result
    function onResult(featureSet:FeatureSet, token:Object = null):void                
    {   
     try
     {
      var qResults:Array = [];
      for each (var myGraphic:Graphic in featureSet.features)
      {
       var qObj:Object = new Object();
       
       var obj:Object = myGraphic.attributes;
       var fld:String;
       var value:String;
       
       for (fld in obj)
       {
        try{                            
         value = obj[fld].toString();
        } catch (error: Error){
         value = "";
        }
        
        if (fld.toUpperCase().indexOf("SHAPE") < 0)
        {
         if(qGroup.selectedValue == "Results with domain values"){
          var cval:String = getDomainValue(fld,value);
          if (cval != "")
           value = cval;
         }
         qObj[fld] = value;
        }
       }
       qResults.push(qObj);
      }
      resultsGrid.dataProvider = qResults;
      myMap.cursorManager.removeBusyCursor();
     }
     catch (error:Error)
     {
      Alert.show(error.message);
     } 
    }
    
    //on fault
    function onFault(info:Object, token:Object = null) : void
    {                 
     Alert.show(info.toString());         
    }
   }
  ]]>
 </fx:Script>
 <s:controlBarLayout>
  <s:HorizontalLayout horizontalAlign="center"
       verticalAlign="middle"
       paddingBottom="7"
       paddingTop="7"/>
 </s:controlBarLayout>
 <s:controlBarContent>
  <s:RadioButton groupName="qGroup" label="Results with domain values"/>
  <s:RadioButton groupName="qGroup" label="Results with out domain values (Normal Results)" selected="true"/>
  <s:Button click="doQuery()" label="Search"/>
 </s:controlBarContent>
 <esri:Map id="myMap">
  <esri:extent>
   <esri:Extent xmin="-14181000" ymin="4306000" xmax="-12917000" ymax="4767000">
    <esri:SpatialReference wkid="102100"/>
   </esri:Extent>
  </esri:extent>
  <esri:ArcGISTiledMapServiceLayer url="http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"/>
  <esri:FeatureLayer id="fLayer" mode="onDemand" outFields="*" url="http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/SanFrancisco/311Incidents/MapServer/0"/>
 </esri:Map>
 <mx:DataGrid id="resultsGrid" width="100%">
  <mx:columns>
   <mx:DataGridColumn dataField="req_id" headerText="Request Id"/>
   <mx:DataGridColumn dataField="req_type" headerText="Request Type"/>
   <mx:DataGridColumn dataField="req_date" headerText="Request Date"/>
   <mx:DataGridColumn dataField="req_time" headerText="Request Time"/>
   <mx:DataGridColumn dataField="address" headerText="Address"/>
   <mx:DataGridColumn dataField="district" headerText="District"/>
   <mx:DataGridColumn dataField="status" headerText="Status, Domain"/>
  </mx:columns>
 </mx:DataGrid>
</s:Application>
0 Kudos
DonCaviness
New Contributor III
Thank you Robert!  That example is exactly what I was looking for.
0 Kudos
KathleenBrenkert
Occasional Contributor
I'm trying to use a modified version of this code to populate a dropdownlist as the application initializes, but I keep getting the error message "cannot access a property or mehtod of a null object reference.'  Any ideas?

private function getcodedValues(fieldName:String):ArrayCollection
   {
    var returnValues:ArrayCollection=new ArrayCollection();
    var fld:Object;
    var cVal:CodedValue;
    var cDomain:CodedValueDomain;
    for each (fld in myFeatureLayer.layerDetails.fields)
    {
     if(fld.name==fieldName)
     {
      cDomain=fld.domain;
      if (cDomain)
      {
       for each (cVal in cDomain.codedValues)
       {
        returnValues.addItem({label:cVal.name,data:cVal.code});
       }
      }
     }
    }
    return returnValues;
   }
0 Kudos
DasaPaddock
Esri Regular Contributor
You may be calling it too early. Is myFeatureLayer loaded? What is the line of code where the error occurs?
0 Kudos
KathleenBrenkert
Occasional Contributor
Thank you! now it works!
0 Kudos
RamonaNavarrete
New Contributor
This seems like a common requirement, since most of our customers don't like viewing the coded value and prefer the actual value.

Are there any plans to set this up as an export option?

Just frustrated that something so simple is complicated for us non-programmer types.

thank you
0 Kudos
RobertMyers
New Contributor
The code below from a post a while back worked at one point. Flex is not showing an error but the app hangs in the browser. Any idea what is wrong with the code?



Don,

    I am not sure why the api team has not shared a sample for this yet, so I created one.

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
      xmlns:s="library://ns.adobe.com/flex/spark"
      xmlns:mx="library://ns.adobe.com/flex/mx"
      xmlns:esri="http://www.esri.com/2008/ags"
      pageTitle="Query with Domain Values Returned" currentState="test">
 <!--
 This sample shows how to query the server and displaying
 the result in a datagrid with domain values returned or not.
  
 This sample sets up a QueryTask (what layer on what server to query).
 When the user clicks the "Search" button, a Query is sent.
 The results are displayed in the DataGrid and if the option for 
 "results with domain values" is chosen than the featurelayers'
 layerDetails fields is used to retrieve the value of the domain.
 -->

 <fx:Declarations>
  <s:RadioButtonGroup id="qGroup"/>
 </fx:Declarations>
 <s:layout>
  <s:VerticalLayout gap="0" horizontalAlign="center"/>
 </s:layout>

 <fx:Script>
  <![CDATA[
   import com.esri.ags.FeatureSet;
   import com.esri.ags.Graphic;
   import com.esri.ags.layers.supportClasses.CodedValue;
   import com.esri.ags.layers.supportClasses.CodedValueDomain;
   import com.esri.ags.layers.supportClasses.Domain;
   import com.esri.ags.layers.supportClasses.LayerDetails;
   import com.esri.ags.layers.supportClasses.RangeDomain;
   import com.esri.ags.tasks.QueryTask;
   import com.esri.ags.tasks.supportClasses.Query;
   
   import mx.collections.ArrayCollection;
   import mx.controls.Alert;
   import mx.rpc.AsyncResponder;
   import mx.utils.ObjectUtil;
   
   private function getDomainValue(fieldName:String,code:String):String
   {
    var returnValue:String = "";
    var fld:Object;
    var cVal:CodedValue;
    var cDomain:CodedValueDomain;
    for each (fld in fLayer.layerDetails.fields)
    {
     if(fld.name == fieldName){
      cDomain = fld.domain;
      if (cDomain){
       for each (cVal in cDomain.codedValues)
       {
        if(cVal.code == code)
         returnValue = cVal.name;
       }
      }
     }
    }
    return returnValue;
   }
   
   protected function doQuery():void
   {
    myMap.cursorManager.setBusyCursor();
    var queryTask:QueryTask = new QueryTask("http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/SanFrancisco/311Incidents/MapServer/0");
    queryTask.useAMF = true;
    var query:Query = new Query();
    query.where = "status > 1";
    query.outFields = ["*"];
    query.returnGeometry = true;
    query.outSpatialReference = myMap.spatialReference;
    queryTask.execute(query, new AsyncResponder(onResult, onFault));
    
    // on result
    function onResult(featureSet:FeatureSet, token:Object = null):void                
    {   
     try
     {
      var qResults:Array = [];
      for each (var myGraphic:Graphic in featureSet.features)
      {
       var qObj:Object = new Object();
       
       var obj:Object = myGraphic.attributes;
       var fld:String;
       var value:String;
       
       for (fld in obj)
       {
        try{                            
         value = obj[fld].toString();
        } catch (error: Error){
         value = "";
        }
        
        if (fld.toUpperCase().indexOf("SHAPE") < 0)
        {
         if(qGroup.selectedValue == "Results with domain values"){
          var cval:String = getDomainValue(fld,value);
          if (cval != "")
           value = cval;
         }
         qObj[fld] = value;
        }
       }
       qResults.push(qObj);
      }
      resultsGrid.dataProvider = qResults;
      myMap.cursorManager.removeBusyCursor();
     }
     catch (error:Error)
     {
      Alert.show(error.message);
     } 
    }
    
    //on fault
    function onFault(info:Object, token:Object = null) : void
    {                 
     Alert.show(info.toString());         
    }
   }
  ]]>
 </fx:Script>
 <s:controlBarLayout>
  <s:HorizontalLayout horizontalAlign="center"
       verticalAlign="middle"
       paddingBottom="7"
       paddingTop="7"/>
 </s:controlBarLayout>
 <s:controlBarContent>
  <s:RadioButton groupName="qGroup" label="Results with domain values"/>
  <s:RadioButton groupName="qGroup" label="Results with out domain values (Normal Results)" selected="true"/>
  <s:Button click="doQuery()" label="Search"/>
 </s:controlBarContent>
 <esri:Map id="myMap">
  <esri:extent>
   <esri:Extent xmin="-14181000" ymin="4306000" xmax="-12917000" ymax="4767000">
    <esri:SpatialReference wkid="102100"/>
   </esri:Extent>
  </esri:extent>
  <esri:ArcGISTiledMapServiceLayer url="http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"/>
  <esri:FeatureLayer id="fLayer" mode="onDemand" outFields="*" url="http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/SanFrancisco/311Incidents/MapServer/0"/>
 </esri:Map>
 <mx:DataGrid id="resultsGrid" width="100%">
  <mx:columns>
   <mx:DataGridColumn dataField="req_id" headerText="Request Id"/>
   <mx:DataGridColumn dataField="req_type" headerText="Request Type"/>
   <mx:DataGridColumn dataField="req_date" headerText="Request Date"/>
   <mx:DataGridColumn dataField="req_time" headerText="Request Time"/>
   <mx:DataGridColumn dataField="address" headerText="Address"/>
   <mx:DataGridColumn dataField="district" headerText="District"/>
   <mx:DataGridColumn dataField="status" headerText="Status, Domain"/>
  </mx:columns>
 </mx:DataGrid>
</s:Application>
0 Kudos