Comunidad de diseño web y desarrollo en internet online

Error - Grupos duplicados en AdvancedDataGrid

Citar            
MensajeEscrito el 22 Sep 2008 07:46 pm
Hello:
I am developing an application with backend on .net.
Hola
Estoy desarrollando una aplicacion con backend en .net con Web Services, el cual retorna un Xml como este:

Código :

<Proyecto>
  <Id>17</Id> 
  <Nombre>Azul Paraiso2 2</Nombre> 
  <Descripcion /> 
  <Siglas>023-0001</Siglas> 
  <Detalle>gfi</Detalle> 
  <IdCliente>26</IdCliente> 
- <ObjCliente>
       <Id>26</Id> 
       <Codigo>1</Codigo> 
       <Organizacion>dulcito</Organizacion> 
       <Apellido>perez</Apellido> 
       <Nombre>raul</Nombre> 
............

<Proyecto>
  <Id>17</Id> 
   ......

Donde obtengo Proyectos, los cuales a su vez tienen objetos dentro, por ejemplo el objeto "Proyecto" tiene adentro el objeto "ObjCliente".
Estoy tratando de agrupar los proyectos por medio del tag ObjCliente.Nombre, pero muestra grupos repetidos (con distinto contenido), aunque trato de ordenar los datos la ultima funcion que se ejecuta es groupFunc, la cual toma al azar elementos de la grilla, y empieza a agrupar por objetos, pero solo los consecutivos. Por ejemplo, Tengo 6 ObjectProxy en el ArrayCollection que tienen los siguientes datos en ObjCliente.Nombre:

ObjCliente.Nombre 1= "pepe"
ObjCliente.Nombre 2= "raul"
ObjCliente.Nombre 3= "pepe"
ObjCliente.Nombre 4= "pepe"
ObjCliente.Nombre 5= "raul"
ObjCliente.Nombre 6= "raul"

Esto generaria 3 agrupaciones, la primera "pepe" con 1 elemento hijo, la segunda "raul" con 1 elemento hijo, la tercera "pepe" con 2 elemento hijo y la cuarta "raul" con 2 elementos hijos.
De esta forma solo esta agrupando los elementos que tienen el mismo nombre de cliente pero solo si estan de forma consecutiva en el ArrayCollection.

Aqui el codigo que estoy usando:

Código :

<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml"  xmlns="*"
   width="100%" height="100%">

   <mx:Script>
      <![CDATA[
         import mx.collections.SortField;
         import mx.collections.Sort;
         import mx.collections.GroupingCollection;
         import mx.collections.Grouping;
         import mx.collections.GroupingField;
         import mx.rpc.events.ResultEvent;
         import mx.collections.ArrayCollection;   

         [Bindable]private var myData:ArrayCollection;
         [Bindable]public var myGColl:GroupingCollection = new GroupingCollection();
           private var myGrp:Grouping = new Grouping();
        
         private function getData():void
         {
            myWS.ObtenerProyectos();            
         }
         
         private function resultHandler(event:ResultEvent):void
         {
            myData = event.result as ArrayCollection;
            var ordenaLista:Sort = new Sort();
            ordenaLista.compareFunction =sortByClientes;
            myData.sort = ordenaLista
            myData.refresh();
            initDG();      
         }
         
         private function groupFunc(item:Object, field:GroupingField):String
         {
         // display field2 as the label of the group
         return item.ObjCliente.Nombre;
         }


        private function initDG():void {     

            // Initialize the GroupingCollection instance.
            myGColl.source = myData;
                        
            // The Grouping instance defines the grouping fields
            // in the collection, and the order of the groups 
            // in the hierarchy.
             var gf:GroupingField = new GroupingField("Cliente");
             gf.groupingFunction = groupFunc;
             var gf1:GroupingField = new GroupingField("Nombre"); 


            // The grouping property contains a Grouping instance.
            myGColl.grouping = myGrp;

            // Specify the GroupedCollection as the data provider for 
            // the AdvancedDataGrid control.
            dgProyectos.dataProvider=myGColl;
            
            // Refresh the display.
            myGColl.refresh();
        }      
        
       private function sortByClientes(obj1:Object, obj2:Object,fields:Array = null):int
       {
            var value1:String = obj1.ObjCliente.Nombre;
            var value2:String = obj2.ObjCliente.Nombre;

            if(value1 < value2) {
                return -1;
            }
            else if(value1 > value2){
                return 1;
            }
            else {
                return 0;
            }
        }

   ]]>
   </mx:Script>
   
   <mx:WebService id="myWS" 
   wsdl="http://localhost/XlineProjectTools/WebServices/Proyectos.asmx?WSDL"
   load="getData()"
    result="resultHandler(event)" />
   

   <mx:AdvancedDataGrid id="dgProyectos" width="100%" height="100%" creationComplete="initDG();" sortableColumns="true">
      <mx:columns>
         <mx:AdvancedDataGridColumn headerText="Nombre" dataField="Nombre" />
         <mx:AdvancedDataGridColumn headerText="Nombre2" dataField="Nombre" />
         <mx:AdvancedDataGridColumn headerText="Descripcion" dataField="Descripcion" />
      </mx:columns>
   </mx:AdvancedDataGrid>
   
</mx:Panel>


Si alguien me puede ayudar lo agradeceria.
Saludos.

Por conocsharp

3 de clabLevel



 

msie7
Citar            
MensajeEscrito el 29 Sep 2008 02:02 pm
Ya le encotre solucion, saque una funcion de ordenamiento y la asigne antes de la funcion de agrupacion

Porque por mas que el ArrayCollection de Objetos esté ordenado, la groupingFunction toma al azar elementos del array, de esta forma se soluciona.
Saludos a todos!!

....
gf.compareFunction=sortByClientes;
....

private function sortByClientes(obj1:Object, obj2:Object,fields:Array = null):int
{
var value1:String = obj1.ObjCliente.Nombre;
var value2:String = obj2.ObjCliente.Nombre;

if(value1 < value2) {
return -1;
}
else if(value1 > value2){
return 1;
}
else {
return 0;
}
}

Por conocsharp

3 de clabLevel



 

msie7

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.