Olá pessoal,
Como faço para comparar, se os registros de 2 DBF'S indenticos, estão iguais??
Ex:
Arquivo1 com os campos..........: "codigo","descrição","unidade","preço","preço de custo","aliquota"
Arquivo2 com os mesmos campos: "codigo","descrição","unidade","preço","preço de custo","aliquota"
eu quero comparar se o registro 1 do arquivo1 esta indentico ao registro 1 do arquivo2
e assim sucessivamente até o ultimo registro, onde quando o registro no arquivo1 tiver algum campo diferente do arquivo2 eu marco o registro no arquivo1
Comparar Registros em 2 DBF'S iguais
Moderador: Moderadores
- Gilberto M Silva
- Usuário Nível 3

- Mensagens: 230
- Registrado em: 13 Mar 2007 18:00
- Localização: Natal-RN / Parelhas(RN) / Natal(RN)
- Contato:
Comparar Registros em 2 DBF'S iguais
Gilberto[]
A cada conversasão realizada conquistamos mais amigos, isto é um lucro inestimável
Clip5.2 DBFCDX
marcolinosilva@click21.com.br gmarcolinosilva@hotmail.com / Skype:gilberto.marcolino
A cada conversasão realizada conquistamos mais amigos, isto é um lucro inestimável
Clip5.2 DBFCDX
marcolinosilva@click21.com.br gmarcolinosilva@hotmail.com / Skype:gilberto.marcolino
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Comparar Registros em 2 DBF'S iguais
Eu nunca fiz, mas uma saída genial seria utilizar MD5, concatenar os campos e comparar. O maligno tinha dado essa dica há algum tempo. Tem muito sobre o tema: https://pctoledo.org/forum/viewto ... md5#p25469
Como foi dito em um desses tópicos de MD5, era bom você converter tudo para maiusculas (com a função UPPER+ função extra para acentos), assim não corre o risco de dar resultado diferentes mesmo que esteja escrito iguais mas diferenciado entre maiuscula e minusculas.
Como foi dito em um desses tópicos de MD5, era bom você converter tudo para maiusculas (com a função UPPER+ função extra para acentos), assim não corre o risco de dar resultado diferentes mesmo que esteja escrito iguais mas diferenciado entre maiuscula e minusculas.
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
- Gilberto M Silva
- Usuário Nível 3

- Mensagens: 230
- Registrado em: 13 Mar 2007 18:00
- Localização: Natal-RN / Parelhas(RN) / Natal(RN)
- Contato:
Comparar Registros em 2 DBF'S iguais
Pois é Pablo, eu já estou usando o MD5, toda vez que o arquivo1 é usado dentro do sistema eu gero o MD5 salvo o código gerado em arquivo e mando o arquivo1para uma pasta. Então toda vez que o sistema e reiniciado é gerado um MD5 do arquivo1 e compara com o salvo no arquivo se for igual blz, se não for é porque foi manipulado por fora do sistema, então tenho que correr todo o arquivo1 comparando com salvo na pasta para ver qual registro foi alterado e marcar o registro. Então eu queria saber se tem outra forma ou função que faça isso ou então a forma que eu já sei que é:
ler o registro do arquivo1
atribui os campos a variaveis
abre o arquivo2 e cheka, se tiver igual vai pro próximo
se não marca
ler o registro do arquivo1
atribui os campos a variaveis
abre o arquivo2 e cheka, se tiver igual vai pro próximo
se não marca
Gilberto[]
A cada conversasão realizada conquistamos mais amigos, isto é um lucro inestimável
Clip5.2 DBFCDX
marcolinosilva@click21.com.br gmarcolinosilva@hotmail.com / Skype:gilberto.marcolino
A cada conversasão realizada conquistamos mais amigos, isto é um lucro inestimável
Clip5.2 DBFCDX
marcolinosilva@click21.com.br gmarcolinosilva@hotmail.com / Skype:gilberto.marcolino
Comparar Registros em 2 DBF'S iguais
Gilberto, veja se isto lhe ajuda.
Abraços.
Código: Selecionar todos
select 1
use arq1 alias arq1
nCmps1=fcount()
COUNT TO nRegs1
select 2
use arq2 alias arq2
nCmps2=fcount()
COUNT TO nRegs2
go top
if nCmps1 != nCmps2 .or. nRegs1 != nRegs2
wait"Arquivos divergentes"
quit
endif
select 1
go top
do while !eof()
*--percorre a linha inteira do registro
for i = 1 to nCmps1
select 1
cmp1=FieldGet(i)
select 2
cmp2=FieldGet(i)
if cmp1 != cmp2
Wait"Voce deve criar um modo de marcar no select 1 o registro diferente"
endif
next
*--
select 1
skip +1
select 2
skip +1
enddo
close allClipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Comparar Registros em 2 DBF'S iguais
Note que o alvo da checagem de integridade não deveria ser exatamente o arquivo, mas sua unidade básica, o registro. Logo, o ideal seria salvar o hash de cada registro. Use CRC32, que é mais econômico (8 bytes), é bem mais rápido e tem uma taxa de colisão suficientemente boa para um registro pequeno de DBF. Adicionalmente, calcule o hash do arquivo e mantenha o procedimento que já tem hoje. Na eventualidade de ocorrer alguma discrepância, uma pequena função será suficiente para apontar o registro(s) culpado(s).então tenho que correr todo o arquivo1 comparando com salvo na pasta para ver qual registro foi alterado e marcar o registro. Então eu queria saber se tem outra forma ou função que faça isso
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
-
Stanis Luksys
- Colaborador

- Mensagens: 1329
- Registrado em: 18 Jun 2005 03:04
- Localização: São Paulo
- Contato:
Comparar Registros em 2 DBF'S iguais
Opa,
Eu trabalhei num sistema uma vez, que tinha este recurso, já até comentei aqui uma vez. Todos os arquivos tinham um campo que guardava uma chave, não necessariamente MD5, para conferência posterior. Se alguém manipulasse um registro por fora do sistema, via dbu por exemplo, era possível identificar.
Mas neste caso que está sendo discutido, apesar de o Maligno estar certo quanto a comparar registros, eu faria só o MD5 do arquivo todo. A possibilidade de dois arquivos diferentes resultarem no mesmo MD5 é remotíssima.
No Linux já vem esta ferramenta, e acho que já precisei baixar para usar no Windows também, para conferir o MD5 daqueles ISOs enormes que a gente baixa na net.
O programa é o md5sum.
Abraços.
Eu trabalhei num sistema uma vez, que tinha este recurso, já até comentei aqui uma vez. Todos os arquivos tinham um campo que guardava uma chave, não necessariamente MD5, para conferência posterior. Se alguém manipulasse um registro por fora do sistema, via dbu por exemplo, era possível identificar.
Mas neste caso que está sendo discutido, apesar de o Maligno estar certo quanto a comparar registros, eu faria só o MD5 do arquivo todo. A possibilidade de dois arquivos diferentes resultarem no mesmo MD5 é remotíssima.
No Linux já vem esta ferramenta, e acho que já precisei baixar para usar no Windows também, para conferir o MD5 daqueles ISOs enormes que a gente baixa na net.
O programa é o md5sum.
Abraços.
Stanis Luksys
sites.google.com/hblibs
Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
sites.google.com/hblibs
Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Comparar Registros em 2 DBF'S iguais
Mas note que o problema não está na eficiência (taxa de colisão) do hash escolhido. Também é remotíssima a chance do CRC32 falhar. O problema está em identificar exatamente qual registro está corrompido. Para evitar uma longa tarefa de comparação registro por registro, uma idéia é incluir um campo para o hash. CRC32, como disse antes, além de ser mais rápido, é mais econômico. E é mais que suficiente. Aliás, até CRC16 daria conta do recado.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!

