Fiz um rotina pra gravar as alterações que o usuário faz no registro (DBF) pra efeito de auditoria, até tenho uma pra campos especificos mais nada até então para alteração em dados de cadastro, gostaria de compartilhar, pra mim serviu bem.
Frazato
Código: Selecionar todos
use produto
Go 3
cMatrizAntes := CarregaDadosRegistro()
Go 5
cMatrizDepois:= CarregaDadosRegistro()
wAlterados := AnaliseDiferenca(cMatrizAntes,cMatrizDepois)
? Len(wAlterados )
*Inkey(0)
For x:= 1 to Len(wAlterados)
? wAlterados[x,1]+' '+wAlterados[x,2]
Next
*? 'Registrando o Log de Alterados'
*Grav_Log_Produto_DBF(wAlterados)
CLose All
Return nil
//--------------------------------------------------------
Static Function AnaliseDiferenca(cVar1,cVar2)
Local i , cAlteracao
Local cAlterados := {}
For i:= 1 to Len(cVar1)
If cVar1[i,2]#cVar2[i,2]
cAlteracao := 'De..:'+cVar1[i,2]+' Para:'+cVar2[i,2]
Aadd(cAlterados,{cVar1[i,1],cAlteracao } )
Endif
Next
If Len(cAlterados) > 0
// Gravando as alteracoes em arquivo txt
Grav_Log_Produto_DBF(cAlterados)
Endif
Return cAlterados
//--------------------------------------------------------
Static Function CarregaDadosRegistro()
Local i,cNomeCampos,cValorCampo,wValoresCampos := {}
For i:= 1 to Fcount()
cNomeCampos := FieldName(i)
If FieldType(i)=='D'
cValorCampo := Dtoc(&cNomeCampos)
ElseIf FieldType(i)=='N'
cValorCampo := Str(&cNomeCampos,13,5)
ElseIf FieldType(i)=='L'
cValorCampo := Iif(&cNomeCampos==.t.,'S','N')
Else
cValorCampo := &cNomeCampos
Endif
Aadd(wValoresCampos,{cNomeCampos,cValorCampo})
NExt
Return wValoresCampos
//--------------------------------------------
Static Function Grav_Log_Produto_DBF(wAlterados)
Local cFileName := "LogJaf\Log_Produto.txt"
Local hFile, cLine := "", n
Local cFieldAnt
Local CRLF := Chr(13)+Chr(10)
Local i
For i:= 1 to Len(wAlterados)
cLine += Alltrim(mUsr)+' '+Dtoc(Date())+' '+Time()+Space(2)+;
'Campo.:'+wAlterados[i,1]+' Valor:'+wAlterados[i,2] +CRLF
Next
If ! File( cFileName ) // Caso nao tenha cria o arquivo
FClose( FCreate( cFileName ) )
Endif
Do Whil .T.
If ( ( hFile := FOpen( cFileName, 1+16 ) ) # -1 )
FSeek( hFile, 0, 2 )
FWrite( hFile, cLine, Len( cLine ) )
FClose( hFile )
Exit
Else
Exit
Endif
Enddo
Retu(.T.)


