Página 1 de 1

Verificar se houve alguma mudança no DBF

Enviado: 28 Out 2018 09:16
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

Verificar se houve alguma mudança no DBF

Enviado: 28 Out 2018 11:03
por rubens
Resolvido:

Código: Selecionar todos

aFiles := Directory( 'PRODUTOS.DBF')
cHoraUltAlteracao := aFiles[1,4]
:))

Verificar se houve alguma mudança no DBF

Enviado: 28 Out 2018 14:19
por lugab
Rubens,

Tem casos em que o DBF nao é alterado, mas o seu CDX/NTX é

Verificar se houve alguma mudança no DBF

Enviado: 28 Out 2018 18:47
por bencz
Calcule o MD5 dos DBFs e NTX, isto é uma forma mais segura de verificar se houve alterações

Verificar se houve alguma mudança no DBF

Enviado: 28 Out 2018 19:25
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.

Verificar se houve alguma mudança no DBF

Enviado: 29 Out 2018 08:28
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

Verificar se houve alguma mudança no DBF

Enviado: 29 Out 2018 17:33
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.

Verificar se houve alguma mudança no DBF

Enviado: 29 Out 2018 21:31
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

Verificar se houve alguma mudança no DBF

Enviado: 29 Out 2018 21:39
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


Verificar se houve alguma mudança no DBF

Enviado: 29 Out 2018 22:16
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

Verificar se houve alguma mudança no DBF

Enviado: 29 Out 2018 23:17
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

Verificar se houve alguma mudança no DBF

Enviado: 30 Out 2018 11:10
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.

Verificar se houve alguma mudança no DBF

Enviado: 30 Out 2018 16:13
por asimoes
Pensei em uso de trigger, lembro que tinha uma lib pra isso, o Letodb tem.

Verificar se houve alguma mudança no DBF

Enviado: 30 Out 2018 16:28
por alxsts
Olá!

É o Six RDD. Não sei se veio para o Harbour. No xHarbour tem a lib HbSix.