Solved! Go to Solution.
const objectIdField:String = event.featureLayer.tableDetails.objectIdField;
var url:String = "theURLpathToYourStandaloneTable" //or you can use your feature layer layerDetails informations to get the related table Id. var yourTable:FeatureLayer = new FeatureLayer(url, null, null) as FeatureLayer ; //Here you're casting the table as a FeatureLayer so it's editable
query.where = "yourTable_displayFeatureLayerID = yourDisplayedFeatureLayerID";where yourTable_displayFeatureLayerID is the foreign key in your standalone table.
<fx:Declarations> <esri:FeatureLayer id="yourTable" outFields="*" url="http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/SanFrancisco/311Incidents/FeatureServer/1"/> </fx:Declarations>
<?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:esri="http://www.esri.com/2008/ags" pageTitle="Attribute Table"> <s:layout> <s:VerticalLayout gap="0"/> </s:layout> <fx:Script> <![CDATA[ import com.esri.ags.Graphic; import com.esri.ags.events.AttributeTableEvent; import com.esri.ags.events.FeatureLayerEvent; import com.esri.ags.layers.supportClasses.FeatureEditResult; import com.esri.ags.layers.supportClasses.FeatureEditResults; import com.esri.ags.layers.supportClasses.Field; import com.esri.ags.tasks.supportClasses.Query; import mx.controls.Alert; import mx.events.FlexEvent; import mx.rpc.AsyncResponder; import mx.rpc.Fault; /* [Bindable] private var urltable:String = "http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/SanFrancisco/311Incidents/MapServer/1" //or you can use your feature layer layerDetails informations to get the related table Id. private var yourTable:FeatureLayer; //Here you're casting the table as a FeatureLayer so it's editable protected function application1_initializeHandler(event:FlexEvent):void { yourTable = new FeatureLayer(urltable, null, null) as FeatureLayer; }*/ protected function myMap_clickHandler(event:MouseEvent):void { if (event.target is Graphic || event.target.parent is Graphic) { var graphic:Graphic = event.target is Graphic ? Graphic(event.target) : Graphic(event.target.parent); var query:Query = new Query; query.objectIds = [graphic.attributes[myFeatureLayer.layerDetails.objectIdField]]; myFeatureLayer.selectFeatures(query, FeatureLayer.SELECTION_NEW); myFeatureLayer.addEventListener(FeatureLayerEvent.SELECTION_COMPLETE,myFeatureLayer_SelectionCompleteHandler); } else { myFeatureLayer.clearSelection(); yourTable.clearSelection(); } } protected function myFeatureLayer_SelectionCompleteHandler(event:FeatureLayerEvent):void { var query:Query = new Query; query.where = "sf_311_serviceoid = " + myFeatureLayer.selectedFeatures[0].attributes.objectid; yourTable.selectFeatures(query, FeatureLayer.SELECTION_NEW); } protected function fdg_updateFeatureHandler(event:AttributeTableEvent):void { //TODO } protected function fdg_deleteFeaturesHandler(event:AttributeTableEvent):void { //TODO } private function featureLayer_editsCompleteHandler(featureEditResults:FeatureEditResults, token:Object = null):void { //TODO } private function featureLayer_faultHandler(fault:Fault, token:Object = null):void { Alert.show(fault.faultString, "Fault"); myAttributeTable.refresh(); } ]]> </fx:Script> <fx:Declarations> <esri:FeatureLayer id="yourTable" outFields="*" url="http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/SanFrancisco/311Incidents/FeatureServer/1"/> </fx:Declarations> <s:controlBarContent> <s:RichText width="100%"> This sample demonstrates how to use the AttributeTable component which allows viewing and editing feature atttributes. The component uses a data grid where the columns correspond to the fields of a feature layer. The application also allows user to click on a feature and select it. The AttributeTable then displays the selection by highlighting the corresponding row in the grid. </s:RichText> </s:controlBarContent> <esri:Map id="myMap" width="100%" height="60%" click="myMap_clickHandler(event)"> <esri:extent> <esri:Extent id="sheepfire" xmin="-13638587" ymin="4543797" xmax="-13620242" ymax="4549912"> <esri:SpatialReference wkid="102100"/> </esri:Extent> </esri:extent> <esri:ArcGISTiledMapServiceLayer url="http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer"/> <esri:FeatureLayer id="myFeatureLayer" mode="onDemand" outFields="*" url="http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/SanFrancisco/311Incidents/FeatureServer/0"/> </esri:Map> <s:Line width="100%"> <s:stroke> <s:SolidColorStroke color="0x000000" weight="1"/> </s:stroke> </s:Line> <s:BorderContainer width="100%" height="40%" backgroundColor="0xEEEEEE" borderVisible="false"> <s:layout> <s:HorizontalLayout paddingLeft="5" paddingRight="5" paddingTop="2"/> </s:layout> <esri:AttributeTable id="myAttributeTable" width="100%" height="100%" deleteFeatures="fdg_deleteFeaturesHandler(event)" featureLayer="{yourTable}" updateFeature="fdg_updateFeatureHandler(event)"> </esri:AttributeTable> </s:BorderContainer> </s:Application>
<?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:esri="http://www.esri.com/2008/ags" pageTitle="Attribute Table"> <s:layout> <s:VerticalLayout gap="0"/> </s:layout> <fx:Script> <![CDATA[ import com.esri.ags.Graphic; import com.esri.ags.events.AttributeTableEvent; import com.esri.ags.events.FeatureLayerEvent; import com.esri.ags.layers.supportClasses.FeatureEditResult; import com.esri.ags.layers.supportClasses.FeatureEditResults; import com.esri.ags.layers.supportClasses.Field; import com.esri.ags.tasks.supportClasses.Query; import mx.controls.Alert; import mx.events.FlexEvent; import mx.rpc.AsyncResponder; import mx.rpc.Fault; /* [Bindable] private var urltable:String = "http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/SanFrancisco/311Incidents/MapServer/1" //or you can use your feature layer layerDetails informations to get the related table Id. private var yourTable:FeatureLayer; //Here you're casting the table as a FeatureLayer so it's editable protected function application1_initializeHandler(event:FlexEvent):void { yourTable = new FeatureLayer(urltable, null, null) as FeatureLayer; }*/ protected function myMap_clickHandler(event:MouseEvent):void { if (event.target is Graphic || event.target.parent is Graphic) { var graphic:Graphic = event.target is Graphic ? Graphic(event.target) : Graphic(event.target.parent); var query:Query = new Query; query.objectIds = [graphic.attributes[myFeatureLayer.layerDetails.objectIdField]]; myFeatureLayer.selectFeatures(query, FeatureLayer.SELECTION_NEW); myFeatureLayer.addEventListener(FeatureLayerEvent.SELECTION_COMPLETE,myFeatureLayer_SelectionCompleteHandler); } else { myFeatureLayer.clearSelection(); yourTable.clearSelection(); } } protected function myFeatureLayer_SelectionCompleteHandler(event:FeatureLayerEvent):void { var query:Query = new Query; query.where = "sf_311_serviceoid = " + myFeatureLayer.selectedFeatures[0].attributes.objectid; yourTable.selectFeatures(query, FeatureLayer.SELECTION_NEW); } protected function fdg_updateFeatureHandler(event:AttributeTableEvent):void { const attributes:Object = {}; const objectIdField:String = event.featureLayer.layerDetails.objectIdField; attributes[objectIdField] = event.feature.attributes[objectIdField]; attributes[event.field.name] = event.newValue; // change the attributes on client right away event.feature.attributes[event.field.name] = event.newValue; const feature:Graphic = new Graphic(null, null, attributes); const updates:Array = [ feature ]; event.featureLayer.applyEdits(null, updates, null, false, new AsyncResponder(featureLayer_editsCompleteHandler, featureLayer_faultHandler, { feature: event.feature, field: event.field, oldValue: event.oldValue })); } protected function fdg_deleteFeaturesHandler(event:AttributeTableEvent):void { const deletes:Array = event.features; event.featureLayer.applyEdits(null, null, deletes, false, new AsyncResponder(featureLayer_editsCompleteHandler, featureLayer_faultHandler)); } private function featureLayer_editsCompleteHandler(featureEditResults:FeatureEditResults, token:Object = null):void { var doRefresh:Boolean = false; for each (var deleteResult:FeatureEditResult in featureEditResults.deleteResults) { if (deleteResult.success === false) { Alert.show("Could not delete feature"); doRefresh = true; } } for each (var updateResult:FeatureEditResult in featureEditResults.updateResults) { const feature:Graphic = token.feature; if (updateResult.success === false) { Alert.show("Could not update feature, Restoring old value", "Error"); const field:Field = token.field; feature.attributes[field.name] = token.oldValue; doRefresh = true; } else { feature.refresh(); } } if (doRefresh) { myAttributeTable.refresh(); } } private function featureLayer_faultHandler(fault:Fault, token:Object = null):void { Alert.show(fault.faultString, "Fault"); myAttributeTable.refresh(); } ]]> </fx:Script> <fx:Declarations> <esri:FeatureLayer id="yourTable" outFields="*" url="http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/SanFrancisco/311Incidents/FeatureServer/1"/> </fx:Declarations> <s:controlBarContent> <s:RichText width="100%"> This sample demonstrates how to use the AttributeTable component which allows viewing and editing feature atttributes. The component uses a data grid where the columns correspond to the fields of a feature layer. The application also allows user to click on a feature and select it. The AttributeTable then displays the selection by highlighting the corresponding row in the grid. </s:RichText> </s:controlBarContent> <esri:Map id="myMap" width="100%" height="60%" click="myMap_clickHandler(event)"> <esri:extent> <esri:Extent id="sheepfire" xmin="-13638587" ymin="4543797" xmax="-13620242" ymax="4549912"> <esri:SpatialReference wkid="102100"/> </esri:Extent> </esri:extent> <esri:ArcGISTiledMapServiceLayer url="http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer"/> <esri:FeatureLayer id="myFeatureLayer" mode="onDemand" outFields="*" url="http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/SanFrancisco/311Incidents/FeatureServer/0"/> </esri:Map> <s:Line width="100%"> <s:stroke> <s:SolidColorStroke color="0x000000" weight="1"/> </s:stroke> </s:Line> <s:BorderContainer width="100%" height="40%" backgroundColor="0xEEEEEE" borderVisible="false"> <s:layout> <s:HorizontalLayout paddingLeft="5" paddingRight="5" paddingTop="2"/> </s:layout> <esri:AttributeTable id="myAttributeTable" width="100%" height="100%" deleteFeatures="fdg_deleteFeaturesHandler(event)" featureLayer="{yourTable}" updateFeature="fdg_updateFeatureHandler(event)"> </esri:AttributeTable> </s:BorderContainer> </s:Application>
<?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:esri="http://www.esri.com/2008/ags" pageTitle="Attribute Table"> <s:layout> <s:VerticalLayout gap="0"/> </s:layout> <fx:Script> <![CDATA[ import com.esri.ags.Graphic; import com.esri.ags.events.AttributeTableEvent; import com.esri.ags.events.FeatureLayerEvent; import com.esri.ags.layers.supportClasses.FeatureEditResult; import com.esri.ags.layers.supportClasses.FeatureEditResults; import com.esri.ags.layers.supportClasses.Field; import com.esri.ags.tasks.supportClasses.Query; import mx.controls.Alert; import mx.events.FlexEvent; import mx.rpc.AsyncResponder; import mx.rpc.Fault; /* [Bindable] private var urltable:String = "http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/SanFrancisco/311Incidents/MapServer/1" //or you can use your feature layer layerDetails informations to get the related table Id. private var yourTable:FeatureLayer; //Here you're casting the table as a FeatureLayer so it's editable protected function application1_initializeHandler(event:FlexEvent):void { yourTable = new FeatureLayer(urltable, null, null) as FeatureLayer; }*/ protected function myMap_clickHandler(event:MouseEvent):void { if (event.target is Graphic || event.target.parent is Graphic) { var graphic:Graphic = event.target is Graphic ? Graphic(event.target) : Graphic(event.target.parent); var query:Query = new Query; query.objectIds = [graphic.attributes[myFeatureLayer.layerDetails.objectIdField]]; myFeatureLayer.selectFeatures(query, FeatureLayer.SELECTION_NEW); myFeatureLayer.addEventListener(FeatureLayerEvent.SELECTION_COMPLETE,myFeatureLayer_SelectionCompleteHandler); } else { myFeatureLayer.clearSelection(); yourTable.clearSelection(); } } protected function myFeatureLayer_SelectionCompleteHandler(event:FeatureLayerEvent):void { var query:Query = new Query; query.where = "sf_311_serviceoid = " + myFeatureLayer.selectedFeatures[0].attributes.objectid; yourTable.selectFeatures(query, FeatureLayer.SELECTION_NEW); } protected function fdg_updateFeatureHandler(event:AttributeTableEvent):void { const attributes:Object = {}; const objectIdField:String = event.featureLayer.layerDetails.objectIdField; attributes[objectIdField] = event.feature.attributes[objectIdField]; attributes[event.field.name] = event.newValue; // change the attributes on client right away event.feature.attributes[event.field.name] = event.newValue; const feature:Graphic = new Graphic(null, null, attributes); const updates:Array = [ feature ]; event.featureLayer.applyEdits(null, updates, null, false, new AsyncResponder(featureLayer_editsCompleteHandler, featureLayer_faultHandler, { feature: event.feature, field: event.field, oldValue: event.oldValue })); } protected function fdg_deleteFeaturesHandler(event:AttributeTableEvent):void { const deletes:Array = event.features; event.featureLayer.applyEdits(null, null, deletes, false, new AsyncResponder(featureLayer_editsCompleteHandler, featureLayer_faultHandler)); } private function featureLayer_editsCompleteHandler(featureEditResults:FeatureEditResults, token:Object = null):void { var doRefresh:Boolean = false; for each (var deleteResult:FeatureEditResult in featureEditResults.deleteResults) { if (deleteResult.success === false) { Alert.show("Could not delete feature"); doRefresh = true; } } for each (var updateResult:FeatureEditResult in featureEditResults.updateResults) { const feature:Graphic = token.feature; if (updateResult.success === false) { Alert.show("Could not update feature, Restoring old value", "Error"); const field:Field = token.field; feature.attributes[field.name] = token.oldValue; doRefresh = true; } else { feature.refresh(); } } if (doRefresh) { myAttributeTable.refresh(); } } private function featureLayer_faultHandler(fault:Fault, token:Object = null):void { Alert.show(fault.faultString, "Fault"); myAttributeTable.refresh(); } ]]> </fx:Script> <fx:Declarations> <esri:FeatureLayer id="yourTable" outFields="*" url="http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/SanFrancisco/311Incidents/FeatureServer/1"/> </fx:Declarations> <s:controlBarContent> <s:RichText width="100%"> This sample demonstrates how to use the AttributeTable component which allows viewing and editing feature atttributes. The component uses a data grid where the columns correspond to the fields of a feature layer. The application also allows user to click on a feature and select it. The AttributeTable then displays the selection by highlighting the corresponding row in the grid. </s:RichText> </s:controlBarContent> <esri:Map id="myMap" width="100%" height="60%" click="myMap_clickHandler(event)"> <esri:extent> <esri:Extent id="sheepfire" xmin="-13638587" ymin="4543797" xmax="-13620242" ymax="4549912"> <esri:SpatialReference wkid="102100"/> </esri:Extent> </esri:extent> <esri:ArcGISTiledMapServiceLayer url="http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer"/> <esri:FeatureLayer id="myFeatureLayer" mode="onDemand" outFields="*" url="http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/SanFrancisco/311Incidents/FeatureServer/0"/> </esri:Map> <s:Line width="100%"> <s:stroke> <s:SolidColorStroke color="0x000000" weight="1"/> </s:stroke> </s:Line> <s:BorderContainer width="100%" height="40%" backgroundColor="0xEEEEEE" borderVisible="false"> <s:layout> <s:HorizontalLayout paddingLeft="5" paddingRight="5" paddingTop="2"/> </s:layout> <esri:AttributeTable id="myAttributeTable" width="100%" height="100%" deleteFeatures="fdg_deleteFeaturesHandler(event)" featureLayer="{yourTable}" updateFeature="fdg_updateFeatureHandler(event)"> </esri:AttributeTable> </s:BorderContainer> </s:Application>
const objectIdField:String = event.featureLayer.tableDetails.objectIdField;
protected function myFeatureLayer_SelectionCompleteHandler(event:FeatureLayerEvent):void { var query:Query = new Query; query.where = "Office = " + myFeatureLayer.selectedFeatures[0].attributes.NAME_SH; yourTable.selectFeatures(query, FeatureLayer.SELECTION_NEW); }