Indexar campo binário

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

LABarreto
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 31 Mai 2008 23:22
Localização: Barra Mansa - RJ

Indexar campo binário

Mensagem 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!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Indexar campo binário

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
LABarreto
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 31 Mai 2008 23:22
Localização: Barra Mansa - RJ

Indexar campo binário

Mensagem 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...
:'( :'( :'(
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Indexar campo binário

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
LABarreto
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 31 Mai 2008 23:22
Localização: Barra Mansa - RJ

Indexar campo binário

Mensagem 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!
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Indexar campo binário

Mensagem por Kapiaba »

Use:

Código: Selecionar todos

    EXTERNAL DESCEND
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Indexar campo binário

Mensagem 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 )
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Indexar campo binário

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Indexar campo binário

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Indexar campo binário

Mensagem por asimoes »

Como eu digo: nem tudo que vem do clipper pode ser usado, tem que se adaptar ou sai do xbase
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Indexar campo binário

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Indexar campo binário

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Indexar campo binário

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Responder