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
array:
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 nResult
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"])
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 } )
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
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
Return to FiveWin for Harbour/xHarbour
Users browsing this forum: Google [Bot] and 61 guests