Página 1 de 1

Comparar Registros em 2 DBF'S iguais

Enviado: 16 Nov 2011 17:52
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

Comparar Registros em 2 DBF'S iguais

Enviado: 16 Nov 2011 18:06
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.

Comparar Registros em 2 DBF'S iguais

Enviado: 16 Nov 2011 20:14
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

Comparar Registros em 2 DBF'S iguais

Enviado: 16 Nov 2011 20:32
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.

Comparar Registros em 2 DBF'S iguais

Enviado: 09 Dez 2011 17:28
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).

Comparar Registros em 2 DBF'S iguais

Enviado: 11 Dez 2011 13:12
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.

Comparar Registros em 2 DBF'S iguais

Enviado: 13 Dez 2011 17:18
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.