Select to view content in your preferred language

get Coded value and coded description when using query task

3989
4
09-23-2012 05:55 AM
AmmarAssem1
Emerging Contributor
Hi,

I am using query task to do search in feature layer when i execute query task it return features. In this features there are attributes with coded domain values it return only description of domain i need code also

Thanks.
Tags (2)
0 Kudos
4 Replies
IvanBespalov
Frequent Contributor
working with table/layer - DetailsTask;
working with MapService - AllDetails
...
...

anywhere your target must be LayerDetails - it holds all information about layer/table types (each type is FeatureType) and layer/table fields (each field is Filed - > with public property domain).
You can access to layer details before executing query, after sending query request, instead query ...

smthing like this:
public function getDomainsByFieldName(fieldName:String, layerDetails:LayerDetails):ArrayCollection
{
    if (layerDetails != null && fieldName != null)
        {
            var layerFields:Array = layerDetails.fields;
            for each (var field:Field in layerFields)
            {
                if (field.name == fieldName)
                {
                    if (field.domain is CodedValueDomain)
                    {
                        var codedValues:Array = CodedValueDomain(field.domain).codedValues;
                        var domains:ArrayCollection = new ArrayCollection();
       
                        for each(var codedValue:CodedValue in codedValues)
                        {
                            // filter domains here if needed
                            domains.addItem(codedValue);
                        }
       
                        return domains;
                    }
                     /*
                        else if (field.domain is RangeDomain) {}
                    */     
                }
            }
        }
   
     return new ArrayCollection(); // empty list
}
0 Kudos
AmmarAssem1
Emerging Contributor
Thanks Ivan,
I try this code but in this "field.domain" often return null but i sure this field related with CodedValueDomain.

I Try more fields but also return null.

Best regards.
0 Kudos
IvanBespalov
Frequent Contributor
<?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">
 <!-- Flex SDK v. 4.6 -->
 <!-- ArcGIS API for Flex 3.0 -->
        <!--
        Run
        - Execute Query (Button click) 
        - Query result shown in grid as they are in database 
        - double click on datagrid row 
        - popup shown, where all coded value codes replaced && feature type Id's replaced
        -->
 <s:layout>
  <s:VerticalLayout horizontalAlign="center" />
 </s:layout>
 <fx:Script>
  <![CDATA[
   import com.esri.ags.FeatureSet;
   import com.esri.ags.layers.supportClasses.CodedValue;
   import com.esri.ags.layers.supportClasses.CodedValueDomain;
   import com.esri.ags.layers.supportClasses.FeatureType;
   import com.esri.ags.layers.supportClasses.Field;
   import com.esri.ags.layers.supportClasses.LayerDetails;
   import com.esri.ags.tasks.DetailsTask;
   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.rpc.Fault;
   
   [Bindable]
   private var queryResults:ArrayCollection;
   
   private var layerDetails:LayerDetails;
   
   protected function onSubmit(event:MouseEvent):void
   {
    layerDetails = null; // reset
    
    var detailsTask:DetailsTask = new DetailsTask(serviceUrl.text);
    detailsTask.getDetails(layerId.value, new AsyncResponder(onDetailsResult, onDetailsFault));
   }
   
   protected function onDetailsResult(detailsTaskResult:LayerDetails, token:Object = null):void
   {
    layerDetails = detailsTaskResult;
    
    executeQuery();
   }
   
   protected function onDetailsFault(fault:Fault, token:Object = null):void
   {
    Alert.show("Can't get given service details!");
    trace(fault.message.toString());
   }
   
   private function executeQuery():void
   {
    queryResults = new ArrayCollection(); // reset
    
    var queryTask:QueryTask = new QueryTask(serviceUrl.text + "/" + layerId.value);
    var query:Query = new Query();
    query.returnGeometry = false;
    query.outFields = new Array("*");
    query.where = "1=1";
    queryTask.execute(query, new AsyncResponder(onQueryResult, onQueryFault));
   }
   
   protected function onQueryResult(featureSet:FeatureSet, token:Object = null):void
   {
    queryResults = new ArrayCollection(featureSet.attributes);
   }
   
   protected function onQueryFault(fault:Fault, token:Object = null):void
   {
    Alert.show("Query faults!");
    trace(fault.message.toString());
   }
   
   private function getDomainsByFieldName(fieldName:String):ArrayCollection
   {
    if (layerDetails != null && fieldName != null)
    {
     var layerFields:Array = layerDetails.fields;
     for each (var field:Field in layerFields)
     {
      if (field.name == fieldName)
      {
       if (field.domain is CodedValueDomain)
       {
        var codedValues:Array = CodedValueDomain(field.domain).codedValues;
        var domains:ArrayCollection = new ArrayCollection();
        
        for each(var codedValue:CodedValue in codedValues)
        {
         domains.addItem(codedValue);
        }
        
        return domains;
       }      
      }
     }
    }
    
    return null;
   }

   protected function onGridDoubleClick(event:MouseEvent):void
   {
    if (resultsGrid.selectedItem != null)
    {
     var selectedFeature:Object = resultsGrid.selectedItem;
     // get domains for each field, if it is replace it's code to name
     for each (var field:Field in layerDetails.fields)
     {
      var domains:ArrayCollection = getDomainsByFieldName(field.name);
      if (domains)
      {
       for each (var codedValue:CodedValue in domains)
       {
        if (codedValue.code == selectedFeature[field.name])
        {
         selectedFeature[field.name] = codedValue.name;
         break;
        }
       }
      }
     }
     
     
     for each (var featureType:FeatureType in layerDetails.types)
     {
      // for each feature type replace its type ID to type name
      if (selectedFeature[layerDetails.typeIdField] == featureType.id)
      {
       selectedFeature[layerDetails.typeIdField] = featureType.name;
      }
      
      // loop through featureType.domains and replace codes to names
      for (var domainField:Object in featureType.domains) 
      {
       if (featureType.domains[domainField] is CodedValueDomain)
       {
        var codedValueDomain:CodedValueDomain = featureType.domains[domainField] as CodedValueDomain;
        for each (var codedValue1:CodedValue in codedValueDomain.codedValues)
        {
         if (selectedFeature[domainField] == codedValue1.code)
         {
          selectedFeature[domainField] = codedValue1.name;
          break;
         }
        }
       }
      }
     }
     
     showPopup(selectedFeature);
    }
   }
   
   private function showPopup(attributes:Object):void
   {
    var message:String = "";
    for each (var field:Field in layerDetails.fields)
    {
     message = message + field.alias + ": " + attributes[field.name] + "\n";
    }
    
    Alert.show(message);
   }

  ]]>
 </fx:Script>
 
 <s:HGroup width="100%">
  <s:Label text="service url: " />
  <s:TextInput id="serviceUrl"
      width="100%"
      text="http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/HomelandSecurity/operations/FeatureServer/" />
 </s:HGroup>
 
 <s:HGroup width="100%">
  <s:Label text="layer Id: " />
  <s:NumericStepper id="layerId"
        value="0"
        minimum="0"
        maximum="999" />
 </s:HGroup>
 
 <s:Button click="onSubmit(event)"
     label="Execute Query" />
 
 <s:DataGrid dataProvider="{queryResults}"
    sortableColumns="false"
    id="resultsGrid"
    width="100%"
    height="100%"
    doubleClick="onGridDoubleClick(event)"
    doubleClickEnabled="true"/>
</s:Application>
0 Kudos
AmmarAssem1
Emerging Contributor
Thanks Ivan,

It work well the problem was that I work in GIS server 9.3 but this option is available only in GIS server 10.

Thanks Ivan again and best regards.
0 Kudos