2011-04-04 6 views
0

J'ai un AdvancedDatagrid et je voudrais trier les ADG selon un AdvancedDataGridColumn (studyDate) qui utilisent des chaînes au format JJ/MM/AAAA (je reçois comme celui-ci à partir du serveur):tri dates ADG

<mx:AdvancedDataGrid id="myADG" width="100%" height="100%" color="0x323232" dataProvider="{_currentDatosBusqueda}" verticalScrollPolicy="auto" 
     fontSize="11" fontFamily="Arial" fontStyle="normal" fontWeight="normal" doubleClickEnabled="true" 
    itemDoubleClick="dobleClickFilaDataGridBusqueda(event);" useRollOver="true" 
                > 

    <mx:AdvancedDataGridColumn headerText="Fecha del estudio" dataField="studyDate" paddingRight="0" textAlign="right" resizable="false"/> 

Et c'est la fonction que j'utiliser pour trier:

private function sortData():void { 
      var sort:Sort = new Sort(); 
      var sortField:SortField = new SortField("studyDate", true, true); 
      var sortField2:SortField = new SortField("studyTime", true, false); 

      sort.fields = [sortField, sortField2];   
      _currentDatosBusqueda.sort = sort; 

      _currentDatosBusqueda.refresh();   
     } 

Mais il ne sorte attendind le jour, je veux dire:

12/02/2011

23/03/2011

25/02/2011

Il trie comme ceci:

25/02/2011

23/03/2011

12/02/2011

j'essayer d'utiliser un sortCompareFunction mais il ne fonctionne pas (probablement que je fais mal) si quelqu'un peut me donner une idée ???

Merci à l'avance

EDIT:

Enfin je trouve mon problème, je viens d'essayer de trier les dates avec le format JJ/MM/AAAA, alors je dois convertir MM/jj/aaaa format avant le tri. Ceci est la fonction que je fais:

private function date_sortCompareFunc(itemA:Object, itemB:Object, fields:Array = null):int { 
      var year:int = int(itemA.studyDate.substr(6,4)); 
      var month:int = int(itemA.studyDate.substr(3,2))-1; 
      var day:int = int(itemA.studyDate.substr(0,2)); 

      var dateA : Date = new Date(year, month, day); 

      year = int(itemB.studyDate.substr(6,4)); 
      month = int(itemB.studyDate.substr(3,2))-1; 
      day = int(itemB.studyDate.substr(0,2)); 

      var dateB : Date = new Date(year, month, day); 

     // return ObjectUtil.dateCompare(dateA, dateB); 

      return (dateA.valueOf() > dateB.valueOf()) ? 1 : (dateA.valueOf() < dateB.valueOf()) ? -1 : 0; 
     } 

Mais je trouve un autre problème, je dois trier les colonnes du adg la première fois, il affiche alors j'ai utilisé la fonction suivante, mais il ne sorte de la récente journée à l'ancien, je ne sais pas ce que je peux faire parce que j'ai mis sort.descending = true, des idées?

private function sortData():void { 
      var sort:Sort = new Sort(); 
      var sortField:SortField = new SortField("studyDate", true, true); 
      sortField.descending = true; 
      var sortField2:SortField = new SortField("studyTime", true, false); 

      sort.fields = [sortField, sortField2];   
      sort.compareFunction = date_sortCompareFunc;    
      _currentDatosBusqueda.sort = sort; 
      _currentDatosBusqueda.refresh(); 

     } 

Répondre

1

Vous pouvez utiliser l'util d'objets pour faire quelque chose comme:

private function dateSortCompare(itemA:YourObject, itemB:YourObject):int 
{ 
    var dateA:Date = new Date(Date.parse(itemA.date)); 
    var dateB:Date = new Date(Date.parse(itemB.date)); 
    return ObjectUtil.dateCompare(dateA, dateB); 
} 

puis dans votre colonne:

<mx:AdvancedDataGridColumn headerText="Fecha del estudio" dataField="studyDate" paddingRight="0" textAlign="right" resizable="false" sortCompareFunction="dateSortCompare"/> 

ou faire le Date.time() et trier les numéros Quelle que soit la façon dont vous voulez ..

Ceci est pseudo code, je ne sais pas s'il compile, mais il devrait vous donner une idée de la façon de s'y prendre il. Bonne chance :)