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")