<?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>