Ayuda - guardar historial de lo que hace un usuario [C#]

Iniciado por crifesma, 1 Septiembre 2010, 17:08 PM

0 Miembros y 1 Visitante están viendo este tema.

crifesma

Buenos días.

les comento estoy haciendo un programa en visual studio professional 2010 C#.
el cual es para hacer facturas y recibos. tiene un login para varios usuarios (los cuales se registran antes y quedan guardados en una tabla de una base de datos de sql).

no es una aplicación cliente servidor, las personas que se trabajarían en el programa entrar por la red local al pc que tiene el programa y lo ejecutarían.

mi duda es, como hago para guardar en una tabla en la misma base de datos el historial de lo que hace cada usuario, guardando usuario, fecha y actividad. Y al hacer esto y si están dos usuario no hacer un doble asiento en la base. como hago para solo guardar cada uno. me dijeron que con un currentthread pero no se nada sobre esa clase ni método.

si me pudieran dar un ejemplo, sea de como guardar el historial o de como utilizar ese método de esa clase me gustaría mucho.

les agradezco de antemano.

raul338

Para mantener el historial, Crea una tabla "Historial" y en todas las otras tablas creas triggers que llenen la tabla Historial. Asi te queda guardado siempre y no desde la aplicacion :)

Y para que puedas identificar el historial de cada usuario, tienes que guardar tambien algun id de la conexion o algo (o hacer procedimientos almacenados por cada insert/update/delete que guarde junto al nombre de usuario :))

[D4N93R]

Hola,

El problema es que ya la aplicación está hecha, y no te sabría dar una buena respuesta ya que no se como está programada. Me podrías decir si usas Stored Procedures o Queries directamente?

Si usas Stored procedures, tienes que alterarlos para que acepten el usuario, entonces creas una tabla en donde, dentro del Stored procedure escribes el cambio que se hizo.

Si usas Queries, creas la misma tabla, pero tendrías que usar triggers.

Info sobre triggers: http://msdn.microsoft.com/en-us/library/ms189799.aspx

Saludos!

crifesma

#3
no creo que me hice entender.

tengo un programa padre (container) el cual tiene un menu del cual se accede a recibos de diferentes empresas, yo quiero que cuando uno haga click para entrar a una de esas empresas se me guarde que usuario entro y que día y hora. yo realmente se hacerlo pero si tengo 2 usuarios grabo como si los dos usuario entraran en el mismo recibo.

este es el codigo de el fom login para identificar los 2 usuarios que admite.


Código (csharp) [Seleccionar]
private void Aceptar_Click(object sender, EventArgs e)
       {
           DataRow[] fila1 = principalDataSet.Usuarios.Select("Usuario LIKE '" + textBox1.Text + "'");
           if (fila1.Length > 0)
           {
             
               foreach (DataRow dr in fila1)
               {
                   usuario = dr["Usuario"].ToString();
                   contraseña = dr["contraseña"].ToString();            
               }
           }
           
           if (textBox1.Text == usuario)
           {
               if (textBox5.Text == contraseña)
               {
                   if (((Principal)this.MdiParent).usuario1 == "")
                   {
                       ((Principal)this.MdiParent).usuario1 = textBox1.Text;
                   }
                   else
                   {
                       ((Principal)this.MdiParent).usuario2 = textBox1.Text;
                   }

                   ((Principal)this.MdiParent).usuarioHabilitado(true);
                   this.Close();
               }
               else
               {
                   MessageBox.Show("La contraseña esta errada");
               }
           }
           else
           {
               MessageBox.Show("El usuario no Existe");
           }
       }

       private void Cancelar_Click(object sender, EventArgs e)
       {
           this.Close();
       }        

       private void usuariosBindingNavigatorSaveItem_Click_1(object sender, EventArgs e)
       {
           this.Validate();
           this.usuariosBindingSource.EndEdit();
           this.tableAdapterManager.UpdateAll(this.principalDataSet);
       }

raul338

Cita de: crifesma en  1 Septiembre 2010, 18:02 PM
yo quiero que cuando uno haga click para entrar a una de esas empresas se me guarde que usuario entro y que día y hora. yo realmente se hacerlo pero si tengo 2 usuarios grabo como si los dos usuario entraran en el mismo recibo.

Ps..... deberias guardar un solo usuario no?

En ese codigo que pusiste no hay nada referido a "Historial"....

PD: Luego deberias aprender mas cosas..... estas guardando contraseñas en texto plano! No deberias informar "contraseña erronea" porque te pueden romper la aplicacion y tu estas dando pistas con eso !!!
Lee sobre SQL Injection despues

.mokk.

Y si pones que si uno este ya conectado el otro no pueda conectarse ?

O tu dices sobre usuarios diferentes ?

crifesma

Cita de: raul338 en  1 Septiembre 2010, 18:20 PM
Cita de: crifesma en  1 Septiembre 2010, 18:02 PM
yo quiero que cuando uno haga click para entrar a una de esas empresas se me guarde que usuario entro y que día y hora. yo realmente se hacerlo pero si tengo 2 usuarios grabo como si los dos usuario entraran en el mismo recibo.

Ps..... deberias guardar un solo usuario no?

En ese codigo que pusiste no hay nada referido a "Historial"....

PD: Luego deberias aprender mas cosas..... estas guardando contraseñas en texto plano! No deberias informar "contraseña erronea" porque te pueden romper la aplicacion y tu estas dando pistas con eso !!!
Lee sobre SQL Injection despues

es un programa que hago para mi empresa, el registro mas que todo es para que el compañero no se meta con la cuenta de uno a hacer cosas y que al equivocarse le echen la culpa a uno.

por eso las pongo en texto plano. no creo que el compañero se ponga a a dedicar un buen tiempo buscando cual es mi contraseña. aunque el consejo sobre la informacion esta bien, en ves de eso pondré usuario o clave errada.

no e puesto nada de guardar el historial porque debo saber como hacerlo antes de ponerlo.

2 usuarios porque tenemos 2 pc y en muchas ocasiones la gente que nos pagan viene de a dos para hacer dos recibos de empresas diferentes entonces hay que esperar que el otro termine para seguir. me parece no muy eficiente. se que hay mejores formas de hacer el programa como un cliente servidor. es mi primer programa entonces comenzare con algo sencillo.

no supe explicar en una parte, como se cual de los dos usuarios si están activos fue el que activo el botón para ingresar a un recibo.

Cita de: .mokk. en  1 Septiembre 2010, 18:29 PM
Y si pones que si uno este ya conectado el otro no pueda conectarse ?

O tu dices sobre usuarios diferentes ?

como comente antes es para que el trabajo se mas eficiente ya que somos dos personas.

raul338

Y bueno, entonces desde la aplicacion usa un archivo de texto como Historial, Dijiste que sabias hacerlo, pon la forma y te ayudaremos para que no tenga ese detalle de que "parece q las 2 hicieron lo mismo" (o algo asi)

La bd es Sql no ? QUe la aplicacion escriba en la tabla Historial tambien, por cada cosa que hace :)

crifesma

esta son las funciones para registrar usuario 1 o 2 (esta funcion esta en el form padre).

las variables usario1 y usuario2 estan instanciadas al principio del mismo form como variables publicas, para que desde el form (hijo) login se le anexe el nombre del usuario (como pudieron ver en el primer codigo que puse).

Código (csharp) [Seleccionar]

public void seguiUsuario1(string fecha, string actividad)
        {
            conexion = new SqlConnection(@"Data Source=|DataDirectory"
                +"|\\Principal.sdf");
           
            conexion.Open();

            SqlCommand query = new SqlCommand("Insert into SeguimientoUsuarios" +
            "(Usuario,Fecha,Actividad) Values('" + usuario1 + "','" + fecha + "','"
                + actividad + "');", conexion);
        }
        public void seguiUsuario2(string fecha, string actividad)
        {
            conexion = new SqlConnection(@"Data Source=|DataDirectory"
                + "|\\Principal.sdf");

            conexion.Open();

            SqlCommand query = new SqlCommand("Insert into SeguimientoUsuarios" +
            "(Usuario,Fecha,Actividad) Values('" + usuario2 + "','" + fecha + "','"
                + actividad + "');", conexion);
        }


lo que no se es como indicarle cual de las dos funciones utilice el programa cuando hagan click en un boton ya que no se como identificar las acciones de cada usuario. por eso al final dije que como puedo hacer para saber cual de los dos usuarios izo click en el boton. con un usuario seria mucho mas facil  :P pero relamente quiero hacer lo asi.

[D4N93R]

Una pregunta, Esta aplicación que estás haciendo va en un ambiente productivo, es decir, va a funcionar dentro de una empresa?