Indexar campo binário
Moderador: Moderadores
-
LABarreto
- Usuário Nível 1

- Mensagens: 9
- Registrado em: 31 Mai 2008 23:22
- Localização: Barra Mansa - RJ
Indexar campo binário
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!
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!
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Indexar campo binário
Se não percebeu, você mesmo respondeu sua pergunta.Em Harbour estou utilizando a Code Page PT850
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/
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

- Mensagens: 9
- Registrado em: 31 Mai 2008 23:22
- Localização: Barra Mansa - RJ
Indexar campo binário
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...
:'( :'( :'(
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...
:'( :'( :'(
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Indexar campo binário
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.
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/
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

- Mensagens: 9
- Registrado em: 31 Mai 2008 23:22
- Localização: Barra Mansa - RJ
Indexar campo binário
É a profissão que escolhemos, um dragão por dia....
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!
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

- Mensagens: 1908
- Registrado em: 07 Dez 2012 16:14
- Localização: São Paulo
- Contato:
Indexar campo binário
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 )
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Indexar campo binário
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.
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/
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/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Indexar campo binário
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.
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/
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/
Indexar campo binário
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)
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)
Indexar campo binário
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
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)
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)
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Indexar campo binário
Ola!
Faço assim para desenhar os caracteres em tela.
Saudações,
Itamar M. Lins Jr.
Por não pode ?, tem alguma maneira que eu possa indexar em Harbour utilizando o Code Page padrão do Clipper?
Código: Selecionar todos
code page do clipper
index on ...
code page do harbour
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Indexar campo binário
Ola!
O harbour tem funções novas para isso "se não estou enganado", não lembro o nome agora.
Tem outra função, que estou tentando achar.
Saudações,
Itamar M. Lins Jr.
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')
Pode abrir o DBF com a page code que desejar.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.
Tem outra função, que estou tentando achar.
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.