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:valor dado: 3
8
7
10
12
5
valor que deberia de obtener: 4
array:valor dado: 3
8
7
10
12
5
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 nResultgracias
veo que me falta muchisimo para aprender a utilizar estas funciones. gracias.
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)en mi caso "n" voy a usarlo asi: cToD(a:cargo["fecha"])Mi consulta: para que el codigo no quede tan largo como:
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 } )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 ?
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 nResultlo 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" ] } )
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 nResultPorque 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