Verificar se houve alguma mudança no DBF

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Verificar se houve alguma mudança no DBF

Mensagem por rubens »

Bom dia...

Alguém se sabe ou se lembra de alguma função/forma de verificar se houve alterações no dbf.
Eu estou carregando minha tabela de produtos na memória, em uma tabela temporária na memória. Daí a cada orçamento gravado eu faço uma leitura no arquivo dbf. Isso toma alguns segundos.
Quero verificar se houve alguma alteração no dbf desde a última leitura, se houver carrego de novo para o arquivo em memória senão continuo normalmente.

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Verificar se houve alguma mudança no DBF

Mensagem por rubens »

Resolvido:

Código: Selecionar todos

aFiles := Directory( 'PRODUTOS.DBF')
cHoraUltAlteracao := aFiles[1,4]
:))
"Eu e minha casa servimos ao Senhor e você ???"
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Verificar se houve alguma mudança no DBF

Mensagem por lugab »

Rubens,

Tem casos em que o DBF nao é alterado, mas o seu CDX/NTX é
lugab
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Verificar se houve alguma mudança no DBF

Mensagem por bencz »

Calcule o MD5 dos DBFs e NTX, isto é uma forma mais segura de verificar se houve alterações
Imagem
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Verificar se houve alguma mudança no DBF

Mensagem por alxsts »

Ola!
the last modification date of a database (.dbf) file
------------------------------------------------------------------------------
Syntax

LUPDATE() --> dModification

Returns

LUPDATE() returns the date of the last change to the open database file
in the current work area. If there is no database file in USE,
LUPDATE() returns a blank date.

Description

LUPDATE() is a database function that determines the date the database
file in the current work area was last modified and CLOSEd. By default,
LUPDATE() operates on the currently selected work area. It will operate
on an unselected work area if you specify it as part of an aliased
expression, as shown in the example below.

Examples

. This example demonstrates that the modification date of the
database file is not changed until the database file is closed:

? DATE() // Result: 09/01/90
USE Sales NEW
? LUPDATE() // Result: 08/31/90
//
APPEND BLANK
? LUPDATE() // Result: 08/31/90
CLOSE DATABASES
//
USE Sales NEW
? LUPDATE() // Result: 09/01/90

. This example uses an aliased expression to access LUPDATE()
for a database file opened in an unselected work area:

USE Sales NEW
USE Customer NEW
? LUPDATE(), Sales->(LUPDATE())

Files Library is EXTEND.LIB.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Verificar se houve alguma mudança no DBF

Mensagem por rubens »

Bom dia..
Tem casos em que o DBF nao é alterado, mas o seu CDX/NTX é
Vou verificar isso nos testes Gabriel.. obrigado pelo alerta..
Calcule o MD5 dos DBFs e NTX, isto é uma forma mais segura de verificar se houve alterações
Vou verificar isso também... mas acho que não precisa ser uma informação tão precisa, é só para evitar de ficar carregando o dbf toda hora.. obrigado
LUPDATE() --> dModification
Alxsts LUPDATE() não serve, ele só mostra a data de modificação, eu preciso verificar isso várias vezes no dia..

Inclusive, acho que minha regra de negócio aí tá falha, porque não vai haver modificação na tabela de produtos só quando houver uma inclusão ou exclusão ou quando mudar um preço... etc... Toda vez que efetuar uma venda vai acontecer mudanças no dbf.. Toda venda dá baixa no estoque e salva data/hora da última venda.

Mas obrigado pelas dicas..
Tô estudando aqui a melhor forma de fazer isso..

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1298
Registrado em: 06 Jul 2004 00:44
Contato:

Verificar se houve alguma mudança no DBF

Mensagem por ANDRIL »

rubens escreveu: porque não vai haver modificação na tabela de produtos só quando houver uma inclusão ou exclusão ou quando mudar um preço... etc...
Neste caso poderia criar um TXT apenas quando houver uma destas operações e buscar a data e hora de gravação deste TXT ao invéz do DBF.
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Verificar se houve alguma mudança no DBF

Mensagem por asimoes »

Rubens,

Usando o artifício de uma THREAD STATIC

Só uma ideia:

A função GravaHora() será usada somente quando o DBF físico for atualizado (commit), enquanto isso você fica testando se LerHora() retorna .T., caso retorne Carrega a tabela novamente.

Código: Selecionar todos

THREAD STATIC cUpdate 

FUNCTION MAIN

   GravaHora() 
   
   LerHora()
   
   GravaHora()
   
   IF LerHora()
      CarregaTabela()
   ENDIF  

ENDIF

FUNCTION GravaHora()   
    StrFile( Time(), "LUPDATE.TXT", 0, .T. )
RETURN Nil   

FUNCTION LerHora()
LOCAL lUpdate := .F.
   
   IF cUpdate = Nil
      cUpdate := FileStr("LUPDATE.TXT")
   ELSE
      IF cUpdate != FileStr("LUPDATE.TXT")
         lUpdate := .T.
      ENDIF   
   ENDIF   
      
RETURN lUpdate
►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)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Verificar se houve alguma mudança no DBF

Mensagem por asimoes »

Sugestão para a função GravaHora()

Código: Selecionar todos

FUNCTION GravaHora()   
    StrFile( DataHora(), "LUPDATE.TXT", 0, .T. )
RETURN Nil   

FUNCTION DataHora( cSeparador )
LOCAL cDataHora

   Hb_Default(@cSeparador, ' ')

   cDataHora := Hb_TTOC( Hb_DateTime(), 'DD/MM/YYYY', 'HH:MM:SS')
   cDataHora := StrTran(cDataHora, ' ', cSeparador)
      
RETURN cDataHora

►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)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Verificar se houve alguma mudança no DBF

Mensagem por asimoes »

Uma modificação:

Código: Selecionar todos

FUNCTION LerHora()
LOCAL lUpdate := .F.
   
   IF cUpdate = Nil
      cUpdate := FileStr("LUPDATE.TXT")
   ELSE
      lUpdate := cUpdate != FileStr("LUPDATE.TXT")
   ENDIF
      
RETURN lUpdate
►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)
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

Verificar se houve alguma mudança no DBF

Mensagem por Claudio Soto »

Aquí hay un ejemplo en HMG oficial de como monitorear los cambios en un archivo, tal vez pueda ser útil:


http://hmgforum.com/viewtopic.php?f=15&t=1411
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Verificar se houve alguma mudança no DBF

Mensagem por alxsts »

Olá!

Pessoalmente acho que é muito esforço só para usar DBF em memória. Creio que este recurso seja bom e rápido mas deve ser usado de forma apropriada, ou seja, para dados que sofram poucas atualizações. Por exemplo: tabelas para carregar list boxes ou combo boxes (UF, Cidades, Contas contábeis, centros de custo, etc...).
rubens escreveu:Inclusive, acho que minha regra de negócio aí tá falha, porque não vai haver modificação na tabela de produtos só quando houver uma inclusão ou exclusão ou quando mudar um preço... etc... Toda vez que efetuar uma venda vai acontecer mudanças no dbf.. Toda venda dá baixa no estoque e salva data/hora da última venda
Neste ponto creio que a normalização das tabelas deveria ser outra:
- Cadastro de produtos deve conter dados cadastrais.
- Estoque seria outra tabela com os estoques por produto. Isto permite controlar vários estoques em vários locais diferentes.
- Preço seria outra tabela, contendo preços por produto, permitindo cadastrar várias tabelas com preços diferenciados por produto.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Verificar se houve alguma mudança no DBF

Mensagem por asimoes »

Pensei em uso de trigger, lembro que tinha uma lib pra isso, o Letodb tem.
►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)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Verificar se houve alguma mudança no DBF

Mensagem por alxsts »

Olá!

É o Six RDD. Não sei se veio para o Harbour. No xHarbour tem a lib HbSix.
[]´s
Alexandre Santos (AlxSts)
Responder