Página 1 de 1

Record de DATA e HORA de lançamento num DBF

Enviado: 17 Mai 2011 12:02
por Sidney Guidin
Por favor,

1 - Quando um lançamento é feito num banco de dados DBF, automaticamente são registrados a DATA e a HORA do lançamento. Se alguém alterar qualquer campo, seja diretamente ou via DBU ou de outra forma qualquer, os registros de DATA e HORA do lançamento inicial são alterados também?

2 - Esses registros de DATA e HORA podem ser alterados?

Obrigado.

Sidney.

Record de DATA e HORA de lançamento num DBF

Enviado: 17 Mai 2011 15:29
por alxsts
Olá!

Seja bem-vindo ao fórum Sidney.
Sidney Guidin escreveu:Quando um lançamento é feito num banco de dados DBF, automaticamente são registrados a DATA e a HORA do lançamento
No padrão de arquivos xBase não existe esta funcionalidade. Se o sistema necessitar disto, alguem terá que programar. Ou seja: criar campos nas tabelas para armazenar tais informações e atualizá-las no momento adequado.

O único controle que existe no padrão DBF é a data da última atualização da tabela, retornado pela função LUpdate() ou DbInfo(). Mas isso não serve para nada...

Record de DATA e HORA de lançamento num DBF

Enviado: 17 Mai 2011 19:02
por Sidney Guidin
Obrigado pela ajuda alxsts. Mas num programa feito em Dbase e continuado em Clipper de muitos anos atrás, o que me interessa é saber se alguém mexeu adulterando dados do banco de dados. Tendo o data e hora da última atualização, quando comparada com data de pedidos e de notas fiscais, pode-se saber se houve esse manuseio. No primeiro banco de dados, seguramente existiam os campos para essas informações. De qualquer forma agradeço pois vc ajudou e muito. Se tiver alguma outra dica para o que procuro, eu agradeço.

Abraços / Sidney.

Record de DATA e HORA de lançamento num DBF

Enviado: 17 Mai 2011 19:29
por alxsts
Olá!

A questão segurança sempre foi precária no padrão de arquivos DBF. Na verdade, ele é um arquivo texto com um header.

Mesmo que você implemente estes campos, alguem sempre poderá alterar, via DBU, Access, etc.

Algumas alternativas que já vi são criptografia dos registros ou a criação de um campo adicional em cada tabela onde é armazenado o resultado de um cálculo baseado no conteúdo dos campos do registro, uma espécie de CRC check.

Dependendo da necessidade, vale a pena pois tem um custo extra de processamento.

Record de DATA e HORA de lançamento num DBF

Enviado: 18 Mai 2011 13:10
por Sidney Guidin
Bem Alexandre. Obrigado pelas dicas. Ao usar as funções que vc citou, LUpdate() ou DbInfo(), obterei a data da última alteração certo? Isso ajudará sem dúvida.

Obrigado uma vez mais.

Record de DATA e HORA de lançamento num DBF

Enviado: 18 Mai 2011 14:44
por alxsts
Olá!
alxsts escreveu:O único controle que existe no padrão DBF é a data da última atualização da tabela, retornado pela função LUpdate() ou DbInfo().
Creio que o que você precisa não é em nível de tabela e sim de registros... Considere as outras sugestões que fiz.

Record de DATA e HORA de lançamento num DBF

Enviado: 18 Mai 2011 15:32
por asimoes
Olá Sidney,

Uma alterantiva seria criar um campo chksum criptografado com todos os campos da tabela e depois testa-los para saber se o conteúdo dos campos foi alterado por fora do sistema.

Outra maneira seria usar o harbour com netio ou letodb para ganhar segurança no acesso a base.

[]´s

Record de DATA e HORA de lançamento num DBF

Enviado: 18 Mai 2011 15:41
por asimoes
Sidney,

Veja este exemplo para o checksum:
Tabela teste com 2 campos:

Matricula
ChkSum

Código: Selecionar todos


FUNCTION MAIN
LOCAL iCalculo
         iCalculo := ChkSum(TESTE->Matricula)
         IF TESTE->ChkSum == iCalculo
             //Ok. os dados estão integros
         ELSE
             //Ops. alguém adulterou o registro
         ENDIF
RETURN NIL

FUNCTION ChkSum(cRegistro)

LOCAL nCount, nChkSum, cRegAux, nChkAnt

   cRegAux:=""
   FOR nCount:=1 TO LEN(cRegistro)
     IF SUBSTR(cRegistro,nCount,1)<>" "
        cRegAux+=SUBSTR(cRegistro,nCount,1)
     ENDIF
   NEXT

   nChkSum:=0
   FOR nCount:=1 TO LEN(cRegAux)
     nChkSum+=INT((ASC(SUBSTR(cRegAux,nCount,1))*(LEN(cRegAux)*nCount))*33)
   NEXT

   nChkAnt := nChkSum
   nChkSum:=VAL(SUBSTR(ALLTRIM(STR(nChkSum)),(Len(ALLTRIM(STR(nChkSum)))-2),2)+;
                SUBSTR(ALLTRIM(STR(nChkSum)),1,(Len(ALLTRIM(STR(nChkSum)))-2)))

   *** compatibilidade com try ... except do Delphi ***

   IF nChkSum > 2147483647      // maior tamanho de inteiro do Delphi
      nChkSum := nChkAnt
      nChkSum := ;
          VAL(SUBSTR((SUBSTR(ALLTRIM(STR(nChkSum)), (LEN(ALLTRIM(STR(nChkSum)))-2), 2) +;
              SUBSTR(ALLTRIM(STR(nChkSum)), 1, (LEN(ALLTRIM(STR(nChkSum)))-2))), 1, 9))
   ENDIF

   *** (AMelo)

   WHILE nChkSum > 65535
     nChkSum:=INT(nChkSum/2)
   END

RETURN IntToHex(nChkSum, 4)

****
*   Converte inteiro para hexadecimal
*
FUNCTION IntToHex(nDec, nCasas)

LOCAL cSign, cHex:="", aRestos:={}, nPos, nDig

   IF nDec<0
      nDec:=nDec*-1
      cSign:="-"
   ELSE
      cSign:=""
   ENDIF

   WHILE nDec>15
      AADD(aRestos, nDec%16)
      nDec:=INT(nDec/16)
   END
   AADD(aRestos, nDec)
   FOR nPos:=LEN(aRestos) TO 1 STEP -1
      nDig:=aRestos[nPos]
      cHex+=CHR(nDig+IF(nDig<10, 48, 55))
   NEXT

RETURN cSign+PADL(cHex, nCasas, "0")