Adolfo wrote:Holas a todos..
Estoy en la necesidad de tener un log del uso del sistema que especifique donde estubo el usuario dentro de la aplicacion.
Poseo los siguientes datos.
Nombre de la Estacion
Usuario de la Estacion
Usuario de mi aplicacion
Fecha
Hora
Y necesito saber ademas, modulo ( Procedure, funcion ) donde Entro/Salio y su hora... algo asi como para controlar que cosas hizo un usuario en un determinado programa. Puede ser con DBF o SQL.
Cualquier idea u opinion sera bienvenida...
Gracias de antemano.
Desde Chile
Adolfo
Yo utilizo esta funci贸n. Es 'cutre' est谩 orientada para depurar lo que codifico pero me da muy buen resultado:
Eemplos de uso:
Traza( 0, "C:\TEMP\", "LOG.TXT" )
Traza( 1, "lo que me de la gana", "valor de la variable nCaso=", nCaso )
/* ***************************************** */
#include "FiveWin.ch"
#include "fileio.ch"
#include "Set.ch"
#include "common.ch"
STATIC lGraba 聽:= .T.
STATIC cPath 聽 := ""
STATIC cFitxer := ""
FUNCTION Traza( nAccion, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O )
Local cPathFitx := ""
Local hfichero 聽:= 0
Local cLiteral 聽:= ""
Local cFormatdate := ""
DEFAULT A TO ""
DEFAULT B TO ""
/* Inicializa valores para la grabaci贸n de las trazas.
聽 聽-------------------------------------------------*/
If nAccion = 0
聽 聽 cPath = A
聽 聽 cFitxer = B
聽 聽 IF cFitxer <> "SINTRAZA.TXT"
聽 聽 聽 聽 lGraba 聽:= .T.
聽 聽 聽 聽 Traza(1, "Started.")
聽 聽 EndIf
/* Graba las trazas.
聽 聽---------------*/
ElseIf nAccion = 1 .and. lGraba
聽 聽 DEFAULT C TO ""
聽 聽 DEFAULT D TO ""
聽 聽 DEFAULT E TO ""
聽 聽 DEFAULT F TO "" 聽 聽 聽 聽 聽 聽 聽//37
聽 聽 DEFAULT G TO ""
聽 聽 DEFAULT H TO ""
聽 聽 DEFAULT I TO ""
聽 聽 DEFAULT J TO ""
聽 聽 DEFAULT K TO ""
聽 聽 DEFAULT L TO ""
聽 聽 DEFAULT M TO ""
聽 聽 DEFAULT N TO ""
聽 聽 DEFAULT O TO ""
聽 聽 cFormatdate := set( _SET_DATEFORMAT , "dd-mm-yy" )
聽 聽 cPathFitx = cPath + cFitxer
聽 聽 /*cLiteral = dtoc(Date()) + "/" + Time() + ;
聽 聽 聽 聽 聽 聽 聽 聽If( At(":", ProcName(5) ) > 0, "/" + ProcName(6),"") + ;
聽 聽 聽 聽 聽 聽 聽 聽If( At(":", ProcName(4) ) > 0, "/" + ProcName(5),"") + ;
聽 聽 聽 聽 聽 聽 聽 聽If( At(":", ProcName(3) ) > 0, "/" + ProcName(4),"") + ;
聽 聽 聽 聽 聽 聽 聽 聽If( At(":", ProcName(2) ) > 0, "/" + ProcName(3),"") + ;
聽 聽 聽 聽 聽 聽 聽 聽If( At(":", ProcName(1) ) > 0, "/" + ProcName(2) + Str(ProcLine(2),4,0),"") + ;
聽 聽 聽 聽 聽 聽 聽 聽"/" + ProcName(1) + "<>" + Str(ProcLine(1),4,0) + "->" + ;
聽 聽 聽 聽 聽 聽 聽 聽cValToChar(A) + cValToChar(B) + cValToChar(C) + cValToChar(D) + cValToChar(E) + ;
聽 聽 聽 聽 聽 聽 聽 聽cValToChar(F) + cValToChar(G) + cValToChar(H) + cValToChar(I) + cValToChar(J) + ;
聽 聽 聽 聽 聽 聽 聽 聽cValToChar(K) + cValToChar(L) + cValToChar(M) + cValToChar(N) + cValToChar(O)+ CRLF*/
聽 聽 cLiteral = dtoc(Date()) + "/" + Time() + ProcName(1) + "<>" + Str(ProcLine(1),4,0) + "->" + ;
聽 聽 聽 聽 聽 聽 聽 聽cValToChar(A) + cValToChar(B) + cValToChar(C) + cValToChar(D) + cValToChar(E) + ;
聽 聽 聽 聽 聽 聽 聽 聽cValToChar(F) + cValToChar(G) + cValToChar(H) + cValToChar(I) + cValToChar(J) + ;
聽 聽 聽 聽 聽 聽 聽 聽cValToChar(K) + cValToChar(L) + cValToChar(M) + cValToChar(N) + cValToChar(O)+ CRLF
聽 聽 hfichero =fopen(cPathFitx, FO_READWRITE + FO_SHARED)
聽 聽 If Ferror() != 0
聽 聽 聽 聽 hfichero =fcreate(cPathFitx,FC_NORMAL)
聽 聽 Endif
聽 聽 If Ferror() != 0 聽 聽 聽 聽 聽 聽 聽 //74
聽 聽 聽 聽 traza(0, cfilepath( Arg( 0 ) ), "AMPA32.TXT" )
聽 聽 聽 聽 traza(1, ProcName(2), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 "--Error al grabar el fichero: " + cPathFitx + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 CRLF + "Gravado en:" + cfilepath( Arg( 0 ) ) + "AMPA32.TXT" )
聽 聽 聽 聽 Traza(1, ProcName(1) + "<>" + A, B, C, D, E, F, G, H, I, J, K, L, M, N, O )
聽 聽 聽 聽 ? "Error al grabar el fichero: " + cPathFitx + CRLF + "Gravado en:" + ;
聽 聽 聽 聽 聽 cfilepath( Arg( 0 ) ) + "AMPA32.TXT"
聽 聽 聽 else
聽 聽 聽 聽 fseek(hfichero, 0, FS_END)
聽 聽 聽 聽 fwrite(hfichero, cLiteral )
聽 聽 聽 聽 fclose(hfichero)
聽 聽 Endif
聽 聽 set( _SET_DATEFORMAT , cFormatDate )
/* Detiene la grabaci贸n de trazas.
聽 聽-----------------------------*/
ElseIf nAccion = 2
聽 聽 Traza(1, "Stop.")
聽 聽 lGraba 聽:= .F.
/* Reinicia la grabaci贸n de trazas.
聽 聽------------------------------*/
ElseIf nAccion = 3
聽 聽 lGraba 聽:= .T.
/* Devuelve una array de dos elementos con el cPath y el cFitxer.
聽 聽------------------------------------------------------------*/
ElseIf nAccion = 4
聽 聽 Return { cPath, cFitxer }
/* Borra el fichero de trazas.
聽 聽-------------------------*/
ElseIf nAccion = 5
聽 聽 cPathFitx = cPath + cFitxer
聽 聽 If File(cPathFitx)
聽 聽 聽 聽 ferase( cPathFitx )
聽 聽 EndIf
EndIf
return .T.
*eof: TRAZA.PRG
/* ***************************************** */