Valdir Posted May 6, 2015 Report Share Posted May 6, 2015 Olá pessoal... Existe alguma função que seja possível verificar a integridade das informações dos campos dentro de um arquivo .Dbf ? Obrigado. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted May 6, 2015 Report Share Posted May 6, 2015 http://www.pctoledo.com.br/forum/viewtopic.php?f=1&t=9500 Quote Link to comment Share on other sites More sharing options...
Valdir Posted May 6, 2015 Author Report Share Posted May 6, 2015 http://www.pctoledo.com.br/forum/viewtopic.php?f=1&t=9500 Valeu tranka... vou testar. Obrigado. kapiaba 1 Quote Link to comment Share on other sites More sharing options...
emotta Posted May 6, 2015 Report Share Posted May 6, 2015 Vc pode resolver com Try tb.... Valeu tranka... vou testar. Obrigado. kapiaba 1 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted May 6, 2015 Report Share Posted May 6, 2015 Vc pode resolver com Try tb.... Whats? puedes muestrar algo, porfa? Saludos, regards, saudações corinthianas. Quote Link to comment Share on other sites More sharing options...
Theotokos Posted May 6, 2015 Report Share Posted May 6, 2015 Try *** Abre o Arquivo *** Faz o Tratamento necessário Catch *** Mensagem: Não Foi Possível Abrir o Arquivo End ACHO que isso que ele quiz dizer kapiaba 1 Quote Link to comment Share on other sites More sharing options...
rochinha Posted May 7, 2015 Report Share Posted May 7, 2015 Amiguinhos, Segue mais uma dica: Teste de Integridade de .DBF #INCLUDE "FILEIO.CH" FUNCTION lOkDbf( cNameExt, cPath ) LOCAL lReturn := .T. LOCAL nHnd, cBytes, nNumRecs, nHdrSize, nRecSize, nFileSize, nRecs LOCAL cError, cErrorLog // Abrimos en exclusiva. Si no es posible, alguien lo esta usando (NO dañado) IF (nHnd := FOpen(cPath + '\' + cNameExt, FO_READWRITE + FO_EXCLUSIVE)) > 0 FSeek(nHnd,4,FS_SET) // Numero registros segun tabla cBytes := '0000' FRead(nHnd,@cBytes,4) nNumRecs := Bin2L(cBytes) // Tamaño Header cBytes := '00' FRead(nHnd,@cBytes,2) nHdrSize := Bin2I(cBytes) // Tamaño Registro cBytes := '00' FRead(nHnd,@cBytes,2) nRecSize := Bin2I(cBytes) // Tamaño Tabla nFileSize := FSeek(nHnd,0,FS_END) // Numero de registros real nRecs := (nFileSize - nHdrSize) / nRecSize // Si el archivo se manipulo con dBase, Fox ... tiene 1 byte mas IF nRecs != Round(nRecs,0) nRecs := (nFileSize - nHdrSize - 1) / nRecSize ENDIF // Si los registros segun la tabla y los calculados no coinciden IF nRecs != nNumRecs cError := "Número de registros incorrecto en fichero " + cNameExt cErrorLog := cError + " en" + CRLF + Trim(cPath) + ' :' + CRLF + CRLF +; " Registros iniciales " + sTr(nNumRecs,7) + CRLF +; " Registros detectados " + sTr(nRecs,7) + CRLF + CRLF +; "Asegúrese de guardar la última copia de seguridad y" + CRLF +; "realice una copia suplementaria ANTES DE corregir el" + CRLF +; "problema." IF MsgNoYes( cErrorLog + CRLF + CRLF +; "¿ Desea corregir el problema ?", "Error de apertura") FSeek(nHnd,4,FS_SET) FWrite(nHnd,L2Bin(Round(nRecs,0)),4) MsgInfo('El problema ha sido corregido.' + CRLF + CRLF +; 'Antes de continuar el uso normal del programa' + CRLF +; 'debe realizarse una "Indexación de ficheros".','Aviso Importante') ENDIF ENDIF FClose(nHnd) ENDIF RETURN lReturn function MsgNoYes( mensagem ) if Alert( mensagem, { "Sim", "Nao" } ) == 1 return .t. endif return .f. function MsgInfo( mensagem ) Alert( mensagem ) return .t. Um fato interessante dos problemas encontrados em .DBF relativos a sujeira está relacionado aos caches das estações e ao uso do Internet Explorer. O uso do IE enquanto se manipula .DBFs faz com que a sujeira dele se misture aos dados das tabelas, sobrepondo registros ou intercalando entre eles. Encontrar estes caracteres estranhos em campos caracteres e memos é fácil, mas quando os mesmos estão em campos numéricos, data, etc aí complica e as funções triviais não funcionam e quebram. Friso que somente encontrei estes problemas com o IE, outros browsers não me deram problemas. Solução: - Não usar o IE em estações. - Configurar o cache e a forma de descarrego. - Melhorar o trato dos Commits() - Nunca usar pastas TEMP ou TMP como área de descarego do sistema. - Separar parte da memória como disco virtual( imDiskTK ) e usá-la como cache do sistema. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted May 7, 2015 Report Share Posted May 7, 2015 Fiz um teste com este programa, abrindo o .dbf pelo editor for DOS, e fui até o fim do arquivo, e tirei algo, o resultado, não me foi satisfatório. Não senti firmeza. Mas como não tenho nenhum arquivo corrompido, fico na dúvida. // DBFOK.PRG #include "FiveWin.ch" #Include "Fileio.Ch" STATIC oWnd function Main() LOCAL cNomeArq, cPath, oBar cNomeArq := "CUSTOMER.DBF" cPath := "C:\TESTE" DEFINE WINDOW oWnd TITLE "Verificar Integridade do DBF" DEFINE BUTTONBAR oBar _3D OF oWnd DEFINE BUTTON OF oBar ACTION lOkDbf( cNomeArq, cPath ) SET MESSAGE OF oWnd TO "Verificar Integridade do DBF" ; NOINSET CLOCK DATE KEYBOARD ACTIVATE WINDOW oWnd return nil FUNCTION lOkDbf( cNomeArq, cPath ) LOCAL lReturn := .T. LOCAL nHnd, cBytes, nNumRecs, nHdrSize, nRecSize, nFileSize, nRecs LOCAL cError, cErrorLog IF FILE( cPath+"\"+cNomeArq ) // ? cNomeArq, cPath, "ARQUIVO ENCONTRADO" ELSE ? "ARQUIVO NAO LOCALIZADO" RETURN( .F. ) ENDIF // Abrimos en exclusiva. Si no es posible, alguien lo esta usando (NO dañado) IF (nHnd := FOpen(cPath + '\' + cNomeArq, FO_READWRITE + FO_EXCLUSIVE)) > 0 FSeek(nHnd,4,FS_SET) // Numero registros segun tabla cBytes := '0000' FRead(nHnd,@cBytes,4) nNumRecs := Bin2L(cBytes) // Tamaño Header cBytes := '00' FRead(nHnd,@cBytes,2) nHdrSize := Bin2I(cBytes) // Tamaño Registro cBytes := '00' FRead(nHnd,@cBytes,2) nRecSize := Bin2I(cBytes) // Tamaño Tabla nFileSize := FSeek(nHnd,0,FS_END) // Numero de registros real nRecs := (nFileSize - nHdrSize) / nRecSize // Si el archivo se manipulo con dBase, Fox ... tiene 1 byte mas IF nRecs != Round(nRecs,0) nRecs := (nFileSize - nHdrSize - 1) / nRecSize ENDIF // Si los registros segun la tabla y los calculados no coinciden IF nRecs != nNumRecs cError := "Número de registros incorretos no arquivo " + cNomeArq cErrorLog := cError + " em" + CRLF + Trim(cPath) + ' :' +CRLF+CRLF+ ; " Registros Iniciais: " + sTr(nNumRecs,7) + CRLF +; " Registros detectados " + sTr(nRecs,7) + CRLF + CRLF +; "Assegure-se de guardar a ultima copia de seguranca" + CRLF +; "realize uma copia suplementar antes de corrigir o" + CRLF +; "problema." IF MsgNoYes( cErrorLog + CRLF + CRLF +; "Deseja corrigir o problema ?", "Error de abertura") FSeek(nHnd,4,FS_SET) FWrite(nHnd,L2Bin(Round(nRecs,0)),4) MsgInfo('O problema foi corrigido.' + CRLF + CRLF +; 'Antes de continuar o uso normal do programa' + CRLF +; 'Realize a Indexacao dos arquivos".','Aviso Importante') ENDIF ELSE ? cNomeArq+" NAO ESTA CORROMPIDO, DBFOK!" ENDIF FClose(nHnd) ENDIF RETURN lReturn function MsgNoYes( mensagem ) if Alert( mensagem, { "Sim", "Nao" } ) == 1 return .t. endif return .f. function MsgInfo( mensagem ) Alert( mensagem ) return .t. abs Quote Link to comment Share on other sites More sharing options...
Euclidao Posted May 7, 2015 Report Share Posted May 7, 2015 Oi Kapi! "fui até o fim do arquivo, e tirei algo, o resultado, não me foi satisfatório." Isso parece lógica FUZZY (tem explicação no wikipedia) :-)) Esta rotina que o Rochinha postou, só verifica se o número de registros reais (tam.-do-arquivo - tam.-header) / tam.registro é igual a valor do número de registros cadastrados no header (se não for igual, tem a opção de corrigir). Anexei um arquivo DBF (modificado) para V. testar. [ ]'s, Euclides POW! Agora que eu vi a mensagem: "Você não tem permissão para fazer upload deste tipo de arquivo" (é só 'abrir' um arquivo DBF com um editor-hexa e alterar o valor na posição # 4) Sorry kapiaba 1 Quote Link to comment Share on other sites More sharing options...
emotta Posted May 7, 2015 Report Share Posted May 7, 2015 ISSO MESMO !!! VLW Try *** Abre o Arquivo *** Faz o Tratamento necessário Catch *** Mensagem: Não Foi Possível Abrir o Arquivo End ACHO que isso que ele quiz dizer Quote Link to comment Share on other sites More sharing options...
kapiaba Posted May 7, 2015 Report Share Posted May 7, 2015 Oi Kapi! "fui até o fim do arquivo, e tirei algo, o resultado, não me foi satisfatório." Isso parece lógica FUZZY (tem explicação no wikipedia) :-)) Esta rotina que o Rochinha postou, só verifica se o número de registros reais (tam.-do-arquivo - tam.-header) / tam.registro é igual a valor do número de registros cadastrados no header (se não for igual, tem a opção de corrigir). Anexei um arquivo DBF (modificado) para V. testar. [ ]'s, Euclides POW! Agora que eu vi a mensagem: "Você não tem permissão para fazer upload deste tipo de arquivo" (é só 'abrir' um arquivo DBF com um editor-hexa e alterar o valor na posição # 4) Sorry kkkkkkkkkkkkkkkkkk, peça autorização ao Gilmer para permissão de UpLoad Euclides. Obg. abs. Envie-me o DBF modificado em: joao@pleno.com.br email/skype - abs. Quote Link to comment Share on other sites More sharing options...
Valdir Posted May 7, 2015 Author Report Share Posted May 7, 2015 Pessoal... Ainda não tive tempo de realizar os testes... Más pelo visto, o tema é por demais complicado. Tentarei testar neste final de semana, depois reporto os resultados. Por enquanto, obrigados à todos que se envolveram. Abração. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted May 11, 2015 Report Share Posted May 11, 2015 Obg. Euclides. Com o seu CATG.DBF, deu para entender o funcionamento do programa. Show() de bola. abs. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.