Pela postagem do harbour-users acho que ainda não entendeu, ou quer uma solução melhor (eu também gostaria).
"RUA ANTONIO NUMERO 365"
"20160626"
Descend() não distingue se a string é composta somente de números, trata como uma string.
E pra manter compatibilidade com Clipper, Descend() não usa codepage.
O resultado é que com PTISO ou outra codepage, Descend() não serve pra indexar string, principalmente se tiver números, porque o Ascii inverso é exatamente a área de caracteres que mais é afetada pela codepage.
O inverso de "A" não é "Z", e nem de "0" é "9".
O inverso de Letra é Chr( 256 - Asc( Letra ) ). o que resulta num caractere diferente, conforme a codepage.
Descend() funciona sem problemas em qualquer codepage quando o argumento é numérico ou data, porque retorna numérico.
Ok em:
Código: Selecionar todos
INDEX ON Descend( numero )
INDEX ON Descend( Data )
INDEX ON StrCodigo + Str( Descend( Data ), 7 ) + Str( Descend( Numero ), 16, 2 )
Obrigatoriamente codepage US pra funcionar em:
Código: Selecionar todos
INDEX ON Descend( Str( numero, 10 ) )
INDEX ON Descend( Dtos( Data ) )
INDEX ON Descend( Texto )
INDEX ON StrCodigo + Descend( Dtos( Data ) ) + Str( Descend( Numero ), 16, 2 )
O Clipper é assim, a diferença é que sempre usamos a codepage default no Clipper.
No Harbour... como Descend() é compatível com Clipper.... ficou sem codepage.
E só pra reforçar: INDEX ON ... DESCENDING não converte nada, apenas o NTX/CDX fica na sequência invertida, e a chave usada pra indexar continua sendo a mesma de sempre, por isso sem problemas com codepage.
O problema em Descend(Dtos()) não tem a ver com SET DATE, é diferença de codepage no valor inverso.
O que eu fiz nesta função CPDescend() foi encontrar o caractere que em ordem alfabética corresponde ao contrário do caractere original também em ordem alfabética. Pra isso crio uma lista em ordem crescente, e outra em ordem decrescente, e troco uma pela outra.
Código: Selecionar todos
FUNCTION CPDescend( 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