Getting a value from multiple functions

2496
0
08-31-2015 11:54 AM
EvelynHernandez
Occasional Contributor III

Im having an issue due to async functions on my widget

My code:

<viewer:BaseWidget 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:viewer="com.esri.viewer.*"   
    xmlns:components="com.esri.viewer.components.*"
    xmlns:esri="http://www.esri.com/2008/ags"  initialize="basewidget1_initializeHandler(event)" creationComplete="basewidget1_creationCompleteHandler(event)"
    
    >

  <fx:Declarations>
  <s:GlowFilter id="glowFilter"
   alpha="1"
   color="{getStyle('focusColor')}"
   inner="true"
   strength="2"/>

  <s:DateTimeFormatter id="dateFormatter" dateTimePattern="dd/MM/yyyy"/>
  </fx:Declarations>

  <fx:Script>
  <![CDATA[
  import com.esri.ags.FeatureSet;
  import com.esri.ags.Graphic;
  import com.esri.ags.tasks.QueryTask;
  import com.esri.ags.tasks.supportClasses.Query;

  import flash.utils.setTimeout;

  import mx.collections.ArrayCollection;
  import mx.controls.Alert;
  import mx.events.FlexEvent;
  import mx.rpc.AsyncResponder;
  import mx.rpc.Responder;

  import widgets.AdmIngresoClientes.utilidad.urls;
  [Bindable] public var idPosteNuevo:String;
  [Bindable] public var idDirNueva:String;
  [Bindable] public var rotNuevo:String;
  [Bindable] public var dirNueva:String;

  [Bindable] public var coleccionClientes:ArrayCollection = new ArrayCollection;
  [Bindable] public var fs:FeatureSet = new FeatureSet;
  [Bindable] public var rotu:int;

  protected function basewidget1_initializeHandler(event:FlexEvent):void
  {


  // TODO Auto-generated method stub
  coleccionClientes.removeAll();
  // TODO Auto-generated method stub
  var queryTask:QueryTask = new QueryTask(widgets.AdmIngresoClientes.utilidad.urls.URL_ADD_CLIENTE);
  var query:Query = new Query();
  query.where = "1=1";
  query.outFields = ['*'];
  query.orderByFields = ['created_date'];
  query.returnGeometry = true;
  queryTask.execute(query, new AsyncResponder(onResultQuery, onFaultQuery));



  function onResultQuery(featureSet:FeatureSet, token:Object = null):void
  {
  var k:int;


  for(k=0;k<featureSet.features.length;k++)
  {
  if ( (featureSet.features.attributes["TIPO_POSTE_CAMARA"] == "nuevo") && (featureSet.features.attributes["TIPO_DIRECCION"] == "nueva") ){
  idPosteNuevo = "calcular ID Poste";
  rotNuevo = "calcular rotulo";
  idDirNueva = "calcular ID Dir";
  dirNueva = "calcular direccion nombre";
  }
  if ( (featureSet.features.attributes["TIPO_POSTE_CAMARA"] == "nuevo") && (featureSet.features.attributes["TIPO_DIRECCION"] == "existente") ) {
  idPosteNuevo = "calcular ID Poste";
  rotNuevo = "calcular rotulo";
  idDirNueva = featureSet.features.attributes["ID_DIRECCION"];
  dirNueva = "calcular direccion nombre";
  }
  if ( (featureSet.features.attributes["TIPO_POSTE_CAMARA"] == "existente") && (featureSet.features.attributes["TIPO_DIRECCION"] == "nueva") ) {
  idPosteNuevo = featureSet.features.attributes["ID_POSTE_CAMARA"];
  rotNuevo = "calcular rotulo";
  idDirNueva = "calcular ID Dir";
  dirNueva = "calcular direccion nombre";
  }
  if ( (featureSet.features.attributes["TIPO_POSTE_CAMARA"] == "existente") && (featureSet.features.attributes["TIPO_DIRECCION"] == "existente") ) {
  rotNuevo = buscarRotulo(featureSet.features.attributes["ID_POSTE_CAMARA"]);
  idDirNueva = featureSet.features.attributes["ID_DIRECCION"];

  }

  var recordGraphic:Graphic = featureSet.features;
  coleccionClientes.addItem({OBJECTID:recordGraphic.attributes["OBJECTID"], 
  NIS:recordGraphic.attributes["NIS"],
  NUMERO_MEDIDOR:recordGraphic.attributes["NUMERO_MEDIDOR"],
  TIPO_POSTE_CAMARA:recordGraphic.attributes["TIPO_POSTE_CAMARA"],
  ID_POSTE_CAMARA:String(idPosteNuevo),
  TIPO_DIRECCION:recordGraphic.attributes["TIPO_DIRECCION"],
  ID_DIRECCION:String(idDirNueva),
  ROTULO:String(rotNuevo),
  gra:recordGraphic});
  }

  }
  function onFaultQuery(info:Object, token:Object = null):void
  {   
  Alert.show("Error en consulta","Carga de Clientes");
  }
  }


  public function buscarRotulo(idp:String):String{
  var rt:String;
  var queryTask:QueryTask = new QueryTask(widgets.AdmIngresoClientes.utilidad.urls.URL_ROTULOS);
  var query:Query = new Query();
  query.where = "id_nodo="+ idp;
  query.outFields = ['rotulo'];
  query.returnGeometry = false;
  queryTask.execute(query, new AsyncResponder(onResultQuery2, onFaultQuery2));

  function onResultQuery2(featureSet2:FeatureSet, token:Object = null):void {

  //var recordGraphic:Graphic = featureSet2.features[index];
  rt = String(featureSet2.features[0].attributes["rotulo"]);
  // Alert.show(rotNuevo);
  }
  function onFaultQuery2(info:Object, token:Object = null):void
  {   


  }


  return rt;
  }


  protected function basewidget1_creationCompleteHandler(event:FlexEvent):void
  {
  // TODO Auto-generated method stub
  DataClientesNuevos.dataProvider = coleccionClientes;
  }

  ]]>
  </fx:Script>
  <viewer:WidgetTemplate id="wTemplate"                      
    width="800" height="500"
    visible="true">

  <mx:Canvas id="ListadoClientes" label="Lista Clientes Nuevos" width="100%" height="100%">
  <s:VGroup width="100%" top="5" bottom="5" height="100%">
  <mx:Label id="Lblclie" text="Listado de Nuevos Clientes" fontSize="18"/>

  <mx:DataGrid id="DataClientesNuevos" resizableColumns="true" sortableColumns="true" editable="false"  
  width="100%" height="100%" visible="true" selectable="true">
  <mx:columns>        
  <mx:DataGridColumn  dataField="OBJECTID" headerText="OBJECTID" width="30" visible="false"/>                                                         

  <mx:DataGridColumn dataField="NUMERO_MEDIDOR" headerText="NUMERO MEDIDOR" width="50" />                                                
  <mx:DataGridColumn dataField="NIS" headerText="NIS" width="50"/>
  <mx:DataGridColumn dataField="TIPO_POSTE_CAMARA" headerText="TIPO_POSTE_CAMARA" visible="true" width="50" />

  <mx:DataGridColumn dataField="ID_POSTE_CAMARA" headerText="ID_POSTE_CAMARA" visible="true" width="50" />
  <mx:DataGridColumn dataField="ROTULO" headerText="ROTULO" visible="true" width="50" />
  <mx:DataGridColumn dataField="TIPO_DIRECCION" headerText="TIPO_DIRECCION" visible="true" width="50" />
  <mx:DataGridColumn dataField="ID_DIRECCION" headerText="ID_DIRECCION" visible="true" width="50" />


  <mx:DataGridColumn dataField="DIRECCION_PROPIETARIO" headerText="DIRECCION PROPIETARIO" visible="true" width="50" />
  <mx:DataGridColumn dataField="CALLE" headerText="CALLE" visible="true" width="50" />
  <mx:DataGridColumn dataField="NUMERO" headerText="NUMERO" visible="true" width="50" /> 
                                                           
  </mx:columns>
  </mx:DataGrid>                                 

  </s:VGroup>
  </mx:Canvas>
  </viewer:WidgetTemplate>
</viewer:BaseWidget>

The logic is:

the main query that u get the "numero medidor, nis, tipo tipo_direccion is from a layer)

The "rotulo" is a query from another layer in the service, the result has to be in the coleccionClientes arrayList, where i ask for the id_poste and it gives me the result for the rotulo.

I have to do the same with the direccion  , calle , and numero.

Since im starting to get the rotulo, my problem is i get null for the 2 rows that it has to be shown.

The result is this one in the attach.

How can i do this more efficiently? Cuz the async functions from the other layer im asking has a delay between each row.

thanks in advice! Soon i will start changing this to javascript T -T, i promise.

0 Kudos
0 Replies