Page 1 of 1

ASort

PostPosted: Tue May 10, 2022 10:57 pm
by goosfancito
Hola.
La idea de este codigo es que dada un array lo ordene por fecha de cada "grupo" de "nIdPadre", si lo pueden ejecutar
van a ver que la primera vez ordena bien para los nIdPadre == 0, pero despues toma bien desde donde tiene que comenzar "nInicio" dado por el nIdPadre pero calcula mal hasta donde tiene que ordenar, el "nFInal" me pasó lo mismo con un codigo anterior similar a esto usando aScan, no se si son por los => o que.
Podrian ayudarme?

Code: Select all  Expand view
FUNCTION prueba()
   LOCAL aDatos := { }
   LOCAL nInicio, nFinal

   AAdd( aDatos, { "a", { "nId" => 0, "nIdPadre" => 0, "dFecha" => "01/8/1020", "nHitem" => 0 } } )
   AAdd( aDatos, { "a", { "nId" => 0, "nIdPadre" => 0, "dFecha" => "01/8/1011", "nHitem" => 0 } } )
   AAdd( aDatos, { "a", { "nId" => 0, "nIdPadre" => 0, "dFecha" => "03/7/1008", "nHitem" => 0 } } )
   AAdd( aDatos, { "a", { "nId" => 0, "nIdPadre" => 2, "dFecha" => "06/8/1020", "nHitem" => 0 } } )
   AAdd( aDatos, { "a", { "nId" => 0, "nIdPadre" => 2, "dFecha" => "01/10/2220", "nHitem" => 0 } } )
   AAdd( aDatos, { "a", { "nId" => 0, "nIdPadre" => 4, "dFecha" => "15/8/1008", "nHitem" => 0 } } )
   AAdd( aDatos, { "a", { "nId" => 0, "nIdPadre" => 5, "dFecha" => "10/8/2025", "nHitem" => 0 } } )

   nInicio := 1
   DO WHILE .T.
      nFinal := AScan( aDatos, { | xCelda | xCelda[ 2 ][ "nIdPadre" ] != aDatos[ nInicio ][ 2 ][ "nIdPadre" ] } )
      XBROWSER aDatos

      aDatos := ASort( aDatos, nInicio, nFinal - 1, { | x, y | CToD( x[ 2 ][ "dFecha" ] ) < CToD( y[ 2 ][ "dFecha" ] ) } )
      XBROWSER aDatos TITLE "desde: " + Str(nInicio) + " hasta: " + Str(nFinal)
      nInicio := nFinal
   ENDDO

   RETURN ( NIL )
 


Gracias

Re: ASort

PostPosted: Thu May 12, 2022 1:21 pm
by goosfancito
nada aun?

Re: ASort

PostPosted: Thu May 12, 2022 11:22 pm
by Antonio Linares
Querido Gustavo,

Aqui lo tienes: (lo he desordenado más aún para que se vea que funciona). Primero ordeno por nIdPadre y luego ordeno por fechas para padres iguales
Code: Select all  Expand view
#include "FiveWin.ch"

FUNCTION Main()

   LOCAL aDatos := { }

   AAdd( aDatos, { "a", { "nId" => 0, "nIdPadre" => 2, "dFecha" => "06/8/1020", "nHitem" => 0 } } )
   AAdd( aDatos, { "a", { "nId" => 0, "nIdPadre" => 0, "dFecha" => "01/8/1020", "nHitem" => 0 } } )
   AAdd( aDatos, { "a", { "nId" => 0, "nIdPadre" => 0, "dFecha" => "03/7/1008", "nHitem" => 0 } } )
   AAdd( aDatos, { "a", { "nId" => 0, "nIdPadre" => 5, "dFecha" => "10/8/2025", "nHitem" => 0 } } )
   AAdd( aDatos, { "a", { "nId" => 0, "nIdPadre" => 2, "dFecha" => "01/10/2220", "nHitem" => 0 } } )
   AAdd( aDatos, { "a", { "nId" => 0, "nIdPadre" => 0, "dFecha" => "01/8/1011", "nHitem" => 0 } } )
   AAdd( aDatos, { "a", { "nId" => 0, "nIdPadre" => 4, "dFecha" => "15/8/1008", "nHitem" => 0 } } )

   aDatos = ASort( aDatos,,, { | x, y | x[ 2 ][ "nIdPadre" ] < y[ 2 ][ "nIdPadre" ] } )
   aDatos = ASort( aDatos,,, { | x, y | x[ 2 ][ "nIdPadre" ] == y[ 2 ][ "nIdPadre" ] .and. ;
                                        CToD( x[ 2 ][ "dFecha" ] ) < CToD( y[ 2 ][ "dFecha" ] ) } )
   XBROWSER aDatos

RETURN NIL