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
2019-03-04 18_38_53-Window.png

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.