Página 1 de 1
Falha no aSort ou Descend ?
Enviado: 04 Mar 2019 18:48
por asimoes
Peguei um erro no aSort, agora não sei se foi usando a função Descend
Código: Selecionar todos
aSort( aFiltro1 ,,, {|x,y| StrZero( 999999999999999.00 - x["VALOR"], 20, 2 ) < StrZero( 999999999999999.00 - y["VALOR"], 20, 2 ) } )
? "aFiltro1"
?
For Each oElemento In aFiltro1
? oElemento["CNPJ_CPF"] + " " + Str( oElemento["ID"], 10 ) + " " + Transform( oElemento["VALOR"], "@E 999.99")
Next
?
? "aFiltro2"
?
aSort( aFiltro2 ,,, {|x,y| Descend( StrZero( x["VALOR"], 20, 2 ) ) < Descend( StrZero( y["VALOR"], 20, 2 ) ) } )
For Each oElemento In aFiltro2
? oElemento["CNPJ_CPF"] + " " + Str( oElemento["ID"], 10 ) + " " + Transform( oElemento["VALOR"], "@E 999.99")
Next
Falha no aSort ou Descend ?
Enviado: 04 Mar 2019 19:33
por asimoes
Vi na documentação da função Descend que ela faz o descend parcial, diante disso vou usar StrZero( 999999999999999.00 - x["VALOR"], 20, 2 )
Falha no aSort ou Descend ?
Enviado: 05 Mar 2019 02:15
por JoséQuintas
Descend() é compatível com Clipper, e com isso, gera problemas pra codepage diferente da padrão do Clipper.
Código: Selecionar todos
FUNCTION MyDescend( cText )
LOCAL cResult, acAscii := {}, nCont
STATIC cFrom, cTo
IF cFrom == NIL .OR. cTo == NIL
FOR nCont = 1 TO 255
Aadd( acAscii, Chr( nCont ) )
NEXT
ASort( acAscii )
cFrom := cTo := ""
FOR nCont = 1 TO 255
cFrom += acAscii[ nCont ]
cTo += acAscii[ 256 - nCont ]
NEXT
ENDIF
cResult := hb_StrReplace( cText, cFrom, cTo )
RETURN cResult
Falha no aSort ou Descend ?
Enviado: 05 Mar 2019 08:31
por asimoes
Descobri outra coisa
Assim funciona com 14 digitos ( até 99 tri ), mais do que isso a ordenação falha.
StrZero( 99999999999999.00 - x["VALOR"], 17, 2 )
Falha no aSort ou Descend ?
Enviado: 05 Mar 2019 08:44
por JoséQuintas
Mas pera lá... acho que esquecemos de uma coisa...
Pelo menos pro Asort.
x > y
x < y
Só inverter o sinal.
Falha no aSort ou Descend ?
Enviado: 06 Mar 2019 08:53
por asimoes
Esse asort tem 3 campos
Ordem de cpf e fonte + ( valor do maior para o menor ).
CPF, FONTE e VALOR
x["CPF"] + x["FONTE"] + StrZero( 99999999999999.00 - x["VALOR"], 17, 2 )
O resultado do asort deve ser isso:
Código: Selecionar todos
99999999999 100 100.00
99999999999 100 90.00
99999999999 100 80.00
99999999999 186 80.00
99999999999 186 70.00
Falha no aSort ou Descend ?
Enviado: 06 Mar 2019 09:38
por JoséQuintas
Mais ou menos isto:
Código: Selecionar todos
iif( x[ "CPF" ] == y[ "CPF" ], ;
iif( x[ "FONTE" ] == y[ "FONTE" ], ;
x[ "VALOR" ] > y[ "VALOR" ], x[ "FONTE" ] < y[ "FONTE" ] ), ;
x[ "CPF" ] < y[ "CPF" ] )
Sempre me confundo no < ou >, dentro do asort
CPF menor vém na frente
Em CPF repetido, fonte menor vém na frente
Em Fonte repetido, Valor maior vém na frente
Falha no aSort ou Descend ?
Enviado: 06 Mar 2019 11:40
por asimoes
Funcionou o seu código Quintas, obrigado.