Página 1 de 1

Indexar campo binário

Enviado: 27 Set 2017 20:43
por LABarreto
Boa noite pessoal!
Estou migrando um sistema completo de Clipper para Harbour, até o momento estava indo tudo bem mas alguns campos codificados em formato binário quando indexados em Clipper seguem a ordem ASCII dos caracteres, quando indexo em Harbour devido ao Code Page alguns caracteres, exemplo: 'Ç' faz mudar toda a ordem do índice. Para alterar estes campos preciso alterar todo o sistema e é muita coisa mesmo, tem alguma maneira que eu possa indexar em Harbour utilizando o Code Page padrão do Clipper?
Em Harbour estou utilizando a Code Page PT850 e índices NTX, a versão do Harbour é a 3.2

Agradeço a colaoração!

Indexar campo binário

Enviado: 27 Set 2017 22:44
por JoséQuintas
Em Harbour estou utilizando a Code Page PT850
Se não percebeu, você mesmo respondeu sua pergunta.
Se está trocando a codepage, e isso dá problema.... ué... é só não trocar.

Indexar campo binário

Enviado: 28 Set 2017 09:03
por LABarreto
Obrigado pela colaboração Quintas, mas não se trata da Code Page, eu uso a Code Page PT850 porque é a mesma que já utilizava em Clipper. Utilizando esta code page permanecem iguais todos os caracteres, seja de formatação de tela ou de dados: acentuação, cedilhas, caracteres especiais, todos.
A questão é que arquivos indexados em Clipper as letras acentuadas e cedilhas são ordenadas pelo código ASCII e no Harbour são ordenadas junto com as respectivas letras não acentuadas e o cedilha é ordenado junto com a letra "C" não respeitando o código ASCII do caracter, isto é ótimo para ordenação de texto: clientes, fornecedores, produtos, etc... não necessitando preocupar se o texto contém ou não letras acentuadas :-Y , porém se o campo contém dados binários a ordem ASCII não prevalece... :%
No meu caso eu utilizo um campo de caracteres para gravar data e hora codificada: "AMDhms" com um caracter para cada valor: A=Ano, M=Mes, D=Dia, h=Hora, m=Minuto e s=Segundo, este campo está presente em todos os arquivos de meu sistema e em algumas tabelas existem dois ou mais campos deste formato, como incio a contagem do ano em 1890 o ano de 2018 é representado pelo caracter "Ç" = ASCII(128) se a indexação é feita pelo Clipper tudo bem mas se é feita pelo Harbour é considerado equivalente ao caracter "C" = ASCII(67) saíndo completamente da ordem desejada...
:'( :'( :'(

Indexar campo binário

Enviado: 28 Set 2017 09:43
por JoséQuintas
Realmente aí complicou, porque até mesmo o Descend( Dtos( Date() ) dá problema no Harbour por causa da codepage.
Vai ter que pensar em outro tipo de chave.

Aliás... Se o problema é ganhar espaço, vai ganhar mais espaço usando CDX do que mantendo esse campo desse jeito.

Indexar campo binário

Enviado: 28 Set 2017 12:32
por LABarreto
É a profissão que escolhemos, um dragão por dia.... :P

O problema é que são milhares de linhas, centenas de PRG e a solução tem que ser rápida...
Já percebi que a função Descend() também dá erro na ordenação, estou tentando mudar minha função de compactação do campo para saltar letras acentuadas e cedilhas, vou perder alguns bons anos de autonomia no campo mas é uma forma de ganhar tempo e mais tarde mudar toda a programação...

De qualquer maneira obrigado por sua atenção!

Indexar campo binário

Enviado: 28 Set 2017 12:45
por Kapiaba
Use:

Código: Selecionar todos

    EXTERNAL DESCEND

Indexar campo binário

Enviado: 28 Set 2017 12:51
por Kapiaba

Código: Selecionar todos

FUNCTION TIRA_ACENTUACAO( cStr )

   local cStrNew := "", nX

   cAcentos := {"—","ƒ","Æ","Ç"," ","µ","…","·","‚","É","ê","ˆ","","Ò","í","Í","ó","¢","à","ä","å","“","â","ú","é","","š","ç","€","ã","Ã","á","Á","à","À","é","É","ê","Ê","í","Í","ó","Ó","õ","Õ","ô","Ô","ú","Ú","ü","Ü","ç","ù","AAO","§","¦","º","ª","€","‡","Ç","ç","'","`","ø","¡","Þ","×","Ø","ÿ","Ö",chr(239)}

   cLetras  := {"U","A","A","A","A","A","A","A","E","E","E","E","E","E","I","I","O","O","O","O","O","O","O","U","U","U","U","C","C","A","A","A","A","A","A","E","E","E","E","I","I","O","O","O","O","O","O","U","U","U","U","C"," ","AAO",".",".",".",".","C","C","C","C","" ,"" ,".","I","I","I","I","", "I",  ""   }

   For nX := 1 TO LEN(cAcentos)
      cStrNew := StrTran(cStr, cAcentos[nX], cLetras[nX])
      cStr := cStrNew
   Next

Return( cStrNew )

Indexar campo binário

Enviado: 28 Set 2017 12:57
por JoséQuintas
Não Kapiaba, não tem a ver com a função entrar ou não no Harbour.

Também não tem a ver com usar letras nos campos.
É converter campos pra binário, e o resultado dar problema por usar ordem alfabética, e string PTBR ser diferente.

Descend() pega por exemplo o Ascii 1 e transforma em 254, e vice-versa.
Na codepage EUA, a ordem alfabética acaba coincidindo com o código ascii, então de 0 a 255 transforma pra 255 a 0.
Na codepage PTBR, os caracteres não são os mesmos, e a ordem alfabética não respeita o código Ascii, pra poder atender PTBR.

No final, qualquer alternativa que ele use, vai acabar precisando de ajuste em fonte.

Uma opção seria indexar por uma função Index on Desconverte(campo), mas mesmo assim, vai ter que alterar fontes.
Deste jeito o binário não entra no índice.
Mas se for criptografia pra segurança de informações, nada feito, vai expor as informações.

Indexar campo binário

Enviado: 28 Set 2017 13:02
por JoséQuintas
Pelo que entendi, como exemplo:

A data 10-12-2017, ele converte pra Chr(10) + Chr(12) + Chr(20) + Chr(17), pra ocupar 4 bytes ao invés de 8 bytes.
Mas isso em ordem alfabética, cai no problema da codepage PTBR, de não ser em ordem de código Ascii.

Por isso considero uma opção um índice por Desconverte( chave )
Ao invés de usar o binário, vai usar a informação original sem conversão pra indexar.

Indexar campo binário

Enviado: 28 Set 2017 13:05
por asimoes
Como eu digo: nem tudo que vem do clipper pode ser usado, tem que se adaptar ou sai do xbase

Indexar campo binário

Enviado: 28 Set 2017 13:41
por asimoes
Nem tudo é simples mas uma ideia seria trabalhar os números na faixa ascii

65 a 90 (A-Z)
97 a 122 (a-z)

Com a mesma ideia convertendo o número de 1 a 31, de 1 a 12, 20 para um caracter ascii pode até ser até a letra A e de 17 a nn

Isso é uma ideia

Indexar campo binário

Enviado: 28 Set 2017 15:17
por Itamar M. Lins Jr.
Ola!
, tem alguma maneira que eu possa indexar em Harbour utilizando o Code Page padrão do Clipper?
Por não pode ?

Código: Selecionar todos

code page do clipper
index on ...
code page do harbour
Faço assim para desenhar os caracteres em tela.

Saudações,
Itamar M. Lins Jr.

Indexar campo binário

Enviado: 28 Set 2017 15:52
por Itamar M. Lins Jr.
Ola!
O harbour tem funções novas para isso "se não estou enganado", não lembro o nome agora.

Código: Selecionar todos

//Eu uso assim:
DbUseArea(.T.,"DBFCDX",cDB,cApel,.T.,.F.,'PTISO')
2015-06-26 14:18 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
* include/harbour.hbx
* src/rtl/cdpapihb.c
+ added new PRG function:
hb_cdpIsCharIdx( [ <cCdpID> ] [, <lNewMode>] ) -> <lPrevMode>
It returns .T. when given codepage uses custom character indexes
instead of byte indexes.
If <cCdpID> is not specified then current HVM codepage is used.
Optional logical parameter <lNewMode> allows to enable/disable
custom character indexes in codepages which have such functionality,
i.e. UTF8, BIG5, CP950.
Pode abrir o DBF com a page code que desejar.
Tem outra função, que estou tentando achar.

Saudações,
Itamar M. Lins Jr.