Geraldo (gbsilva) Posted September 2, 2010 Report Share Posted September 2, 2010 Pessoal gostaria da opinião de voces sobre como voces registram qual usuário gravou, modificou ou excluiu um determinado registro. Voces tem outra tabela ou dbf que voces gravam ou um arquivo texto etc. Estou em dúvidas num sistema e preciso de algumas dicas. Grato, Geraldo B. Silva FWH 2.6 Junho/2005, xHarbour 0.99.50 (Simplex), Bcc55, Pelles, xDev, MyMake, Sqllib e MySql. lucgera@terra.com.br São Paulo - SP Quote Link to comment Share on other sites More sharing options...
Geraldo (gbsilva) Posted September 2, 2010 Author Report Share Posted September 2, 2010 Pessoal gostaria da opinião de voces sobre como voces registram qual usuário gravou, modificou ou excluiu um determinado registro. Voces tem outra tabela ou dbf que voces gravam ou um arquivo texto etc. Estou em dúvidas num sistema e preciso de algumas dicas. Grato, Geraldo B. Silva FWH 2.6 Junho/2005, xHarbour 0.99.50 (Simplex), Bcc55, Pelles, xDev, MyMake, Sqllib e MySql. lucgera@terra.com.br São Paulo - SP Quote Link to comment Share on other sites More sharing options...
Ariston Santos Posted September 2, 2010 Report Share Posted September 2, 2010 Eu faço assim: FUNCTION SuaFuncao() nOper := 1 cOper := "Nome do operador // Execusa seus comandos, e: LogReg(nOper,cOper,"Executou determinada tarefa") RETURN NIL **+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+** FUNCTION LogReg(nOperad,cOperad,cAction) LOCAL OldLogDb, aStr, cDbfInfo IF nOperad = 0 RETURN NIL ENDIF PUBLIC nErros, lGoOn OldLogDb := SELECT() cDbfInfo := "" nErros := 0 cDbLog := "LOG"+STRZERO(nOperad,5) aStr := {} AADD( aStr, {"DATA", "D", 10, 00}) AADD( aStr, {"HORA", "C", 05, 00}) AADD( aStr, {"ACAO", "C",1024, 00}) AADD( aStr, {"CODIGO", "N", 04, 00}) AADD( aStr, {"NOME", "C", 45, 00}) cDbfInfo += CheckDbf(aStr, cDbLog, .T.) IF ! FILE(cDbLog+".DBF") DBCREATE(cDbLog+".DBF", aStr) ENDIF IF nErros > 0 cDbfInfo := MEMOREAD("STRERRO.TXT") MsgAlert("Existem erros no arquivo "+cDBase+".DBF"+CRLF+CRLF+cDbfInfo+CRLF+CRLF+"Favor corrigir antes de prosseguir.","Erro de estrutura") SELECT(mDb) RELEASE nErros, lGoOn RETURN aPadrao ENDIF USE &(cDbLog) SHARED NEW SelFile := SELECT() LogFile := (SelFile)->(ALIAS()) WHILE ! &(LogFile)->(RLOCK()) ; ERROREDE() ; END &(LogFile)->(DBAPPEND()) REPLACE &(LogFile)->DATA WITH DATE() REPLACE &(LogFile)->HORA WITH LEFT(TIME(),5) REPLACE &(LogFile)->ACAO WITH cAction REPLACE &(LogFile)->CODIGO WITH nOperad REPLACE &(LogFile)->NOME WITH cOperad &(LogFile)->(DBCLOSEAREA()) SELECT(OldLogDb) RELEASE nErros, lGoOn RETURN NIL **+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+** STATIC FUNCTION FiltraLog(dDat,oLogBrw) IF ! EMPTY(DTOS(dDat)) SET FILTER TO DATA = dDat ELSE SET FILTER TO ENDIF oLogBrw:GoBottom() oLogBrw:UpStable() oLogBrw:Refresh() RETURN .T. **+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+** STATIC FUNCTION ImpLog(oLogBrw) LOCAL oPrn, oFont, nPag, mLarg, nWidt, nSpc, nRow, nCls PRINTER oPrn TO cVndImp NAME OemToAnsi("Log do operador") PREVIEW DEFINE FONT oFont NAME "Arial" SIZE 0, -10 OF oPrn DEFINE FONT oFon2 NAME "Courier New" SIZE 0, -10 OF oPrn nPag := 1 nTab := oPrn:nHorzRes()/20 mLarg := oFont:nHeight nWidt := oFont:nWidth*10 nSpc := (oPrn:nHorzRes()-(2*nTab)) / 90 nRow := 4 nCls := {nTab+(nSpc*01),; nTab+(nSpc*11),; nTab+(nSpc*19) } nCent := nTab+(nSpc*48) oPrn:StartPage() FOR Y := 1 TO 90 oPrn:Say(nRow*mLarg, nTab+(nSpc*Y), "-", oFont) NEXT nRow++ oPrn:Say(nRow*mLarg, nCent, oRaz, oFont, , , ,2) nRow++ oPrn:Say(nRow*mLarg, nCent, mEnd+", N. "+mNmr+" - "+mBro, oFont, , , ,2) nRow++ oPrn:Say(nRow*mLarg, nCent, mCid, oFont, , , ,2) nRow++ oPrn:Say(nRow*mLarg, nCent, mFon, oFont, , , ,2) nRow+=2 FOR Y := 1 TO 90 oPrn:Say(nRow*mLarg, nTab+(nSpc*Y), "-", oFont) NEXT nRow++ oPrn:Say(nRow*mLarg, nCls[1], OemToAnsi("RELATà RIO DE ATIVIDADES"), oFont) nRow++ oPrn:Say(nRow*mLarg, nCls[1], "OPERADOR: "+STRZERO(CODIGO,2)+"-"+ALLTRIM(NOME), oFont) nRow+=2 oPrn:Say( nRow*mLarg, nCls[1], OemToAnsi("DATA"), oFont ) oPrn:Say( nRow*mLarg, nCls[2], OemToAnsi("HORA"), oFont ) oPrn:Say( nRow*mLarg, nCls[3], OemToAnsi("ACAO"), oFont ) nRow+=2 FOR Y := 1 TO 90 oPrn:Say(nRow*mLarg, nTab+(nSpc*Y), "-", oFont) NEXT nRow ++ DbGotop() WHILE ! EOF() oPrn:Say( nRow*mLarg, nCls[1], DTOC(DATA), oFont ) oPrn:Say( nRow*mLarg, nCls[2], HORA, oFont ) cTxt := RTRIM(ACAO) mTtL1:= MLCOUNT(cTxt,70) IF mTtL1 > 1 FOR Y := 1 TO mTtL1-1 oPrn:Say(nRow*mLarg, nCls[3], JUSTIFICA(cTxt,70,Y), oFon2) nRow++ NEXT oPrn:Say(nRow*mLarg, nCls[3],MEMOLINE(cTxt,70,mTtL1), oFon2) ELSE oPrn:Say(nRow*mLarg, nCls[3],MEMOLINE(cTxt,70,mTtL1), oFon2) ENDIF nRow++ IF (nRow*mLarg) >= ( oPrn:nVertRes()-(8*mLarg) ) oPrn:Say(oPrn:nVertRes()-(6*mLarg), nCls[1], "PAG: "+STRZERO(nPag,2), oFont) nRow := 3 nPag ++ oPrn:EndPage() oPrn:StartPage() oPrn:Say(nRow*mLarg, nCls[1], OemToAnsi("RELATà RIO DE ATIVIDADES"), oFont) nRow++ FOR Y := 1 TO 90 oPrn:Say(nRow*mLarg, nTab+(nSpc*Y), "-", oFont) NEXT nRow++ oPrn:Say( nRow*mLarg, nCls[1], OemToAnsi("DATA"), oFont ) oPrn:Say( nRow*mLarg, nCls[2], OemToAnsi("HORA"), oFont ) oPrn:Say( nRow*mLarg, nCls[3], OemToAnsi("ACAO"), oFont ) nRow+=2 FOR Y := 1 TO 90 oPrn:Say(nRow*mLarg, nTab+(nSpc*Y), "-", oFont) NEXT nRow++ ELSE nRow++ ENDIF DbSkip(1) END FOR Y := 1 TO 90 oPrn:Say(nRow*mLarg, nTab+(nSpc*Y), "-", oFont) NEXT oPrn:Say(oPrn:nVertRes()-(6*mLarg), nCls[1], "PAG: "+STRZERO(nPag,2), oFont) oPrn:EndPage() oPrn:Preview() RELEASE FONT oFont, oFon2 DbGotop() oLogBrw:UpStable() oLogBrw:Refresh() RETURN NIL **+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+** STATIC FUNCTION DelLog(DbfLog,oLogBrw) IF MsgNoYes(OemToAnsi("Confirma a exclusÆo definitiva destas informa‡äes?"),OemToAnsi("Aten‡Æo")) &(DbfLog)->(DBGOTOP()) WHIL ! &(DbfLog)->(EOF()) WHILE ! &(DbfLog)->(rlock()) ; ERROREDE() ; END &(DbfLog)->(DBDELETE()) &(DbfLog)->(DBSKIP(1)) END oLogBrw:UpStable() oLogBrw:Refresh() ENDIF RETURN NIL **+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+**+-+** id=code>id=code>Ariston Santos FWPPC / Fwh / xHarbour / Bcc55 / xDev / Workshop Conheça o pacote fivewin: www.arsoft-ap.com.br "Leia a BÃblia diariamente" Quote Link to comment Share on other sites More sharing options...
jcleoner Posted September 2, 2010 Report Share Posted September 2, 2010 Oi Geraldo Eu montei uma tabela no mysql que chamei de logsis tinha usuario = char 8 data = data hora = hora tabela = char 15 chave do registro = char 20 ( ou qualquer identificador do registro ). operação = inc / alt / exc A toda tabela que sofria qualquer atualização rodava essa função Gera_log(wUsuario,Dtoc(Date()),time(),"tabcliente","inc") Funcionava beleza e depois desativei. O custo x beneficio não compensou. Tava ficando maior que a base do próprio sistema e o backup estava demorando cada vez mais. Sei lá, voce pode optar por zerar mensalmente. Fica a dica. Quote Link to comment Share on other sites More sharing options...
Geraldo (gbsilva) Posted September 2, 2010 Author Report Share Posted September 2, 2010 Obrigado pela dica Ariston. José essa foi exatamente a minha dúvida, eu já faço mais ou menos como você falou, mas apenas em algumas tabelas, mas mesmo assim achei o mesmo, vai ficando muito grande. Vou pensar um pouco mais sobre o assunto. Abraços, Geraldo B. Silva FWH 2.6 Junho/2005, xHarbour 0.99.50 (Simplex), Bcc55, Pelles, xDev, MyMake, Sqllib e MySql. lucgera@terra.com.br São Paulo - SP Quote Link to comment Share on other sites More sharing options...
emotta Posted September 2, 2010 Report Share Posted September 2, 2010 Se for DBF esquece, porem se for banco de dados o espaço nao será problema. citação:Obrigado pela dica Ariston. José essa foi exatamente a minha dúvida, eu já faço mais ou menos como você falou, mas apenas em algumas tabelas, mas mesmo assim achei o mesmo, vai ficando muito grande. Vou pensar um pouco mais sobre o assunto. Abraços, Geraldo B. Silva FWH 2.6 Junho/2005, xHarbour 0.99.50 (Simplex), Bcc55, Pelles, xDev, MyMake, Sqllib e MySql. lucgera@terra.com.br São Paulo - SP id=quote>id=quote>EMotta Sistemas Eduardo Motta emotta@gmail.com.br FWH 9.09 - xHARBOUR 1.2.1 Fivewin desde 2000 xHarbour desde 2002 Quote Link to comment Share on other sites More sharing options...
jcleoner Posted September 2, 2010 Report Share Posted September 2, 2010 Oi Eduardo Realmente para banco de dados espaço não é problema, mas isso vai pesando na hora de fazer backups. Quote Link to comment Share on other sites More sharing options...
william Posted September 2, 2010 Report Share Posted September 2, 2010 boa noite , no link abaixo tem um topico interssante sobre isso: http://www.pctoledo.com.br/forum/viewtopic.php?f=4&t=11131 William Xharbour 1.0 - Fwh - Sqlrdd , Mysql 5.0, PHP, WS , Timprime 4.0 , Display 2.0 Quote Link to comment Share on other sites More sharing options...
Vitor Reis Posted September 3, 2010 Report Share Posted September 3, 2010 ola.. eu tenho o log de eventos nos meus prgs.. que grava quem foi o ultimo a mexer no registro ou quem deletou ou incluiu, porem jogo para o dbf.. e fica realmente muito grande, seja dbf ou sql.. o link queo willian passou estive dando uma olhada.. e parece que joga par um txt.. alguem conseguiu entender ou implementar??? outra coisa.. o que é defaut do harbour .. alguem tem conhecimento??? o que eu busco é saber o que o usuario alterou.. e nao somente saber que houve alteracao.. ja pensei nisso mas acho que ficaria lento ficar comparando o que tinha no banco de dados e o que ta alterando... campo a campo.. alguem tem alguma ideia neste sentido??? vitor s.b.c. Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted September 3, 2010 Report Share Posted September 3, 2010 citação: outra coisa.. o que é defaut do harbour .. alguem tem conhecimento??? id=quote>id=quote>Ola Vitor, DEFAULT se usa para dar um valor para variavel como padrão caso ela esteja vazia Exemplo: atualiza() function atualiza(diretorio) default diretorio:="C:\REMESSA" . . . return neste exemplo ao chamar a funcao atualiza nao foi informado o parametro diretorio dai ele vai assumir o default... Abraços Luiz Fernando msn: empresoft@globo.com skype:empresoft empresoft@globo.com FWH 8.04,XHARBOUR 1.1,PELES,XDEV,VLIB,ADS 8.1 FWH 9.12,XHARBOUR 1.2,ADS 9.0 Quote Link to comment Share on other sites More sharing options...
Vitor Reis Posted September 3, 2010 Report Share Posted September 3, 2010 ola luiz.. nao foi isso que perguntei.. no link que o willian passou.. tem uma informacao assim: "Também vale à pena dar uma olhada nas funções nativas de LOG do [x]Harbour. Ainda não usei esse recurso mas parece que está bem estruturada e é algo padrão do sistema." é essas funcoes nativas que eu me refiro.. fiz a pergunta errada... vitor Quote Link to comment Share on other sites More sharing options...
atnsoft Posted September 3, 2010 Report Share Posted September 3, 2010 Geraldo dá uma olhada como eu uso: Exemplo 1: Try Copy File (cDirCol+Varquivo) To (cDirCol+Vsalva) Catch LogFile((cDirCol)+"ERRO.LOG", {"Backup: Arquivo gerado pelo coletor: "+nColetor[nConta]+" inconcistente."}) End Exemplo 2: use (cDirRec)+"TEMPCMD" Shared if NetErr() dbCloseAll() LogFile((cDirCol)+"ERRO.LOG", {"Erro de Rede ao abrir pasta do sistema da Recepção (TEMPCMD)"}) Return NIL endif O aquivo fica assim: ERRO.LOG: 03/09/2010 18:40:53: Arquivo TEMPCMD.DBF não encontrado na pasta C:\SISREC\ id=code>id=code>AtnSoft(Antenor Rabello) - xHarbour 0.99.71 / FwH 7.05 / Verce Quote Link to comment Share on other sites More sharing options...
william Posted September 3, 2010 Report Share Posted September 3, 2010 Boa noite a todos Eu tambem precisei fazer um sistema de auditoria interna no sistema a pedido dos proprietarios. Como eu uso a SQLRDD com Mysql, após estudar todas as opcoes nos forums da Web, para mim a melhor escolha foi: - Em todos os itens criticos do sistema que precisam sofrer auditoria eu gravo num arquivo texto de LOG. - Um exemplo de onde registrar o LOG, seria na Exclusao de Clientes . Seria registrado a DATA , a HORA, o USUARIO e uma descricao do que o usuario mudou . Apos excluir o cliente chame: operador:= "PEDRO MALAZARTE" processo:= "Excluiu o Cliente: Pedro da Silva Santos" registra_log(Operador,processo) Simples assim. Ele gera o arquivo SISTEMA.LOG com todas as informacoes para auditoria. abaixo segue a funcao registra_log() Abraço William Adami FUNCTION registra_log( cOperador,minha_info) LOCAL ret_line := "chr(13)+chr(10)", errfile := "sistema.log" if len(coperador)<15 coperador:=coperador+ space(15-len(coperador)) endif IF !FILE(errfile) errhandle = FCREATE(errfile) FWRITE(errhandle,"Segue lista de processos detectados."+&ret_line.+&ret_line.) FWRITE(errhandle,"Data Hora Operador Processo"+&ret_line.) FWRITE(errhandle,replicate("-",80)+&ret_line.+&ret_line.) ELSE errhandle = FOPEN(errfile,1) length = FSEEK(errhandle,0,2) FSEEK(errhandle,length) ENDIF FWRITE(errhandle,DTOC(DATE())+" "+TIME()+" "+substr(cOperador,1,15)+" "+MINHA_INFO+&ret_line.) FCLOSE(errhandle) RETURN(.T.) Xharbour 1.0 - Fwh - Sqlrdd , Mysql 5.0, PHP, WS , Timprime 4.0 , Display 2.0 Quote Link to comment Share on other sites More sharing options...
Geraldo (gbsilva) Posted September 3, 2010 Author Report Share Posted September 3, 2010 William e Antenor obrigado pelo retorno, vou estudar as dicas. Abraços, Geraldo B. Silva FWH 2.6 Junho/2005, xHarbour 0.99.50 (Simplex), Bcc55, Pelles, xDev, MyMake, Sqllib e MySql. lucgera@terra.com.br São Paulo - SP Quote Link to comment Share on other sites More sharing options...
Vitor Reis Posted September 3, 2010 Report Share Posted September 3, 2010 willian.. vc faz como eu.. mas tambem nao sabe o que foi alterado no cadastro do cliente.. certo? vc sabe quem excluiu ou que alterou.. mas o que alterou.. nao sabe?? é isso que queria.. uma forma facil de saber o que alterou vitor Quote Link to comment Share on other sites More sharing options...
william Posted September 4, 2010 Report Share Posted September 4, 2010 Vitor bom dia, para saber o que foi alterado, vc deve montar a frase que vai ser registrada no log. por exemplo, na alteracao vc alterou o nome PEDRO DOS SANTOS para JOSE DA SILVA. entao a frase que vc deve montar para registrar no log seria: operador:= "PEDRO MALAZARTE" processo:= "Alterou PEDRO DA SILVA para JOSE DA SILVA" registra_log(Operador,processo) ou seja , a informacao que vai ser registrada no log é vc quem monta portanto dá sim para saber o que foi alterado ou qualquer informacao que vc queira registrar. abraço William Xharbour 1.0 - Fwh - Sqlrdd , Mysql 5.0, PHP, WS , Timprime 4.0 , Display 2.0 Quote Link to comment Share on other sites More sharing options...
Vitor Reis Posted September 4, 2010 Report Share Posted September 4, 2010 o problema é ficar comparando campo a campo pra descobrir o que foi alterado.. ja imaginou uma rotina assim vitor Quote Link to comment Share on other sites More sharing options...
vailtom Posted September 5, 2010 Report Share Posted September 5, 2010 citação:o problema é ficar comparando campo a campo pra descobrir o que foi alterado..ja imaginou uma rotina assim id=quote>id=quote>para casos como estes Vitor e muito comum jogar esta rotina de logs dentro do banco como um Trigger (qdo estamos trabalhando com bancos SQL).... Como vantagens destacam-se a velocidade, o fato de serem disparadas automaticamente e dependendo do caso ha ainda a opcao de detectarmos quais campos foram alterados facilmente. Quote Link to comment Share on other sites More sharing options...
Vitor Reis Posted September 5, 2010 Report Share Posted September 5, 2010 essa é uma grande ideia... que pena que ainda nao tenho dominio sobre o sqllib... mas chegarei lá vitor s.b.c. Quote Link to comment Share on other sites More sharing options...
AVInfo Sistemas Posted August 24, 2011 Report Share Posted August 24, 2011 eu simplesmente gravo a consulta diretamente na tabela. Fica mais fácil e rápido. Pra quem usa SQL é mto mais prático. Xharbour 1.2.1 - Fw 10.10 - WS e Pelles tominem@hotmail.com Quote Link to comment Share on other sites More sharing options...
marcio1361303176 Posted August 24, 2011 Report Share Posted August 24, 2011 Eu fiz assim meus amigos. Tenho uma tabela no MYSQL de logs, onde gravo o nome da tabela que sofreu mudanças, e um resumo do que mudou. E controlo por ela, ou seja deixo as 500 ultimas mudanças na tabela. (tem algumas que deixo mais.) Porem realmente vai ficando pesado pra fazer bkp. Dai fiz uma coisa que é assim. Quando ela está com 20.000 registros ou mais eu disparo um comando para limpar os mais antigos por tabela.. Por periodo, e é uma opção que o usuario master term que fazer caso contrario o sistema não deixa elelogar... Resolveu meu problema e me salvou de uma fria faz uns 40 dias. Pois o Cara jurava de pé Junto pela alma da mae dele que não era ele quem tinha baixado a parcela do contas a Receber. Dai ela não Sabia do Registro de Auditoria. Resumindo ele baixou, depois apagou a parcela. Porem ele se esqueceu que o sistema Registra isso no Movimento de Caixa. Dai Justa causa nele.... Márcio :. informaisvrb@gmail.com FWHX 2.6+ SQLLIB + xDev + rpv + MYSQL 5.0 / fwh808+sqllib(atual) Msn.: mastermarvrb@msn.com Editado por - marcio on 24/08/2011 22:03:05 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.