Page 1 of 1

como obtengo el valor mas chico de un array

PostPosted: Tue Aug 22, 2023 8:06 am
by goosfancito
Hola.
Para no hacer un bucle, puedo usar un eval para obtener la posicion del valor mas chico de un array con respecto a un valor dado?
ejempo:
array:
8
7
10
12
5


valor dado: 3
valor que deberia de obtener: 4

Re: como obtengo el valor mas chico de un array

PostPosted: Tue Aug 22, 2023 12:21 pm
by Antonio Linares
Code: Select all  Expand view
function Main()

   local a := { 8, 7, 10, 12, 5 }
   
   ? BuscaPos( a, 3 )

return nil

function BuscaPos( a, nVal )

   local nResult
   
   AScan( ASort( AClone( a ) ), { | n, nPos | If( nVal < n, nResult := AScan( a, n ) - 1,), n > nVal } )
   
return nResult

Re: como obtengo el valor mas chico de un array

PostPosted: Tue Aug 22, 2023 1:01 pm
by goosfancito
gracias

veo que me falta muchisimo para aprender a utilizar estas funciones. gracias.

Re: como obtengo el valor mas chico de un array

PostPosted: Tue Aug 22, 2023 2:41 pm
by Willi Quintana
Buenos dias amigos, esto para obtener el valo minimo de una array
Code: Select all  Expand view

Function AMIN(aDats, lCero, nIni, nPos)
local nMin := 0
DEFAULT lCero := .t.
DEFAULT nINi  := 1
DEFAULT nPos  := 0
IF VALTYPE(aDats) <> "A"
  Return(0)
EndIf
nPos := If(nPos = 0, LEN(aDats), nPos)
nMin := aDats[nIni]
If lCero
   AEVAL(aDats, {|xEl| nMin := IF(VALTYPE(xEl) = "N", IF(xEl < nMin, xEl, nMin), nMin)}, nIni, nPos )
  Else
   AEVAL(aDats, {|xEl| nMin := IF(VALTYPE(xEl) = "N" .AND. xEl <> 0, IF(xEl < nMin, xEl, nMin), nMin)}, nIni, nPos )
EndIf
Return(nMin)
 

Re: como obtengo el valor mas chico de un array

PostPosted: Wed Aug 23, 2023 5:21 pm
by goosfancito
Gracias a ambos.

tomo como ejemplo este:
AScan( ASort( AClone( a ) ), { | n, nPos | If( nVal < n, nResult := AScan( a, n ) - 1,), n > nVal } )

en mi caso "n" voy a usarlo asi: cToD(a:cargo["fecha"])


Mi consulta: para que el codigo no quede tan largo como:
Code: Select all  Expand view
AScan( ASort( AClone( a ) ), { | n, nPos | If( nVal < cToD(a:cargo["fecha"]), nResult := AScan( a, cToD(a:cargo["fecha"]) ) - 1,), cToD(a:cargo["fecha"]) > nVal } )


Hay alguna manera que cuando defina la variable, o sea en { |n, nPos |}, puda indicar que n es cToD(a:cargo["fecha"])?

gracias

Re: como obtengo el valor mas chico de un array

PostPosted: Wed Aug 23, 2023 5:48 pm
by Antonio Linares
AScan( ASort( AClone( a ) ), { | n, nPos | n := cToD(a:cargo["fecha"]), If( nVal < n, nResult := AScan( a, n) ) - 1,), cToD(n) > nVal } )

estás seguro de que ese código te funciona bien ?

Re: como obtengo el valor mas chico de un array

PostPosted: Thu Aug 24, 2023 7:49 am
by goosfancito
Code: Select all  Expand view
METHOD BuscaPos( a, nVal ) CLASS TAbm

   LOCAL nResult:= 0
   LOCAL cMenor:= ""

   IF Len( a ) > 0

      AScan( ASort( AClone( a ) ), ;
             { | n, nPos | ;
               IF( nVal < CToD( n:cargo[ "fecha" ] ), ;
                   ( cMenor:= n:cargo["fecha"], nResult := AScan( a, {|o| o:cargo["fecha"] ==cMenor}) - 1 ) , ), ;
               CToD( n:cargo[ "fecha" ] ) > nVal } )
   ENDIF

   RETURN nResult
 

Asi si me funciona Antonio.

Re: como obtengo el valor mas chico de un array

PostPosted: Thu Aug 24, 2023 7:56 am
by Antonio Linares
lo cual quiere decir que ascan(a, n:cargo["fecha"]) esta devolviendo cero

Por lo que veo, estas usando objetos en vez de números, por eso AScan() devuelve cero, no encuentra lo que buscas

Prueba con AScan( a, { | o | o:Cargo[ "fecha" ] == n:Cargo[ "fecha" ] } )

Re: como obtengo el valor mas chico de un array

PostPosted: Thu Aug 24, 2023 8:07 am
by goosfancito
Code: Select all  Expand view
METHOD BuscaPos( a, nVal ) CLASS TAbm

   LOCAL nResult:= 0
   LOCAL cMenor:= ""

   IF Len( a ) > 0

      AScan( ASort( AClone( a ) ), ;
             { | n, nPos | ;
               IF( nVal < CToD( n:cargo[ "fecha" ] ), ;
                   ( cMenor:= n:cargo["fecha"], nResult := AScan( a, {|o| o:cargo["fecha"] ==cMenor}) - 1 ) , ), ;
               CToD( n:cargo[ "fecha" ] ) > nVal } )
   ENDIF

   RETURN nResult


Asi me funciona Antonio.

Re: como obtengo el valor mas chico de un array

PostPosted: Thu Aug 24, 2023 8:09 am
by goosfancito
Porque quiero hacer esto?
porque quiero insertar el nuevo item que se crea por sobre o debajo de la fecha inmediata (menor o mayor) entonces con esto
me livero estar "ordenando" el tree.

ya voy a postear el cambio en el github

Re: como obtengo el valor mas chico de un array

PostPosted: Thu Aug 24, 2023 8:55 am
by Antonio Linares
me alegro que sigas avanzando :-)