Comparar Registros em 2 DBF'S iguais

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Gilberto M Silva
Usuário Nível 3
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

Mensagem por Gilberto M Silva »

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
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
Avatar do usuário
Pablo César
Usuário Nível 7
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

Mensagem por Pablo César »

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.
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.
Avatar do usuário
Gilberto M Silva
Usuário Nível 3
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

Mensagem por Gilberto M Silva »

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
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
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Comparar Registros em 2 DBF'S iguais

Mensagem por ANDRIL »

Gilberto, veja se isto lhe ajuda.

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 all
Abraços.
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Comparar Registros em 2 DBF'S iguais

Mensagem por Maligno »

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
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).
[]'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!
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Comparar Registros em 2 DBF'S iguais

Mensagem por Stanis Luksys »

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.
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.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Comparar Registros em 2 DBF'S iguais

Mensagem por Maligno »

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!
Responder