none
VALIDACION CAPA DE NEGOCIO RRS feed

  • Pregunta

  • Hola, buenas tardes, estoy realizando un sistema winform de 4 capas, pero tengo duda que se valida en la capa de presentación y que en la capa de negocio.

    Deseo saber si la validación de campos vacíos, validación de datatable, validación de claves (si la ingresada en el sistema coincide con la almacenada en la bd) en que capa van.

    A continuación escribo los métodos que utilizo en las diferentes capas:

    CAPA DE DATOS

    public DataTable ValidarUsuario(EntidadSesion objEntidadSesion)
    {
           try
          {
                  AbrirConexion();
                   if (conexion.State == ConnectionState.Open)
                  {
                        dt = new DataTable();
                        ds = new DataSet();
                        cmSql = new SqlCommand("procValidarUsuarioSistema", conexion);
                        cmSql.CommandType = CommandType.StoredProcedure;
                        cmSql.Parameters.AddWithValue("@usuario", objEntidadSesion.Usuario);
                        adapter = new SqlDataAdapter(cmSql);
                        adapter.Fill(ds, "TbUsuarioSistema");
                        dt = ds.Tables["TbUsuarioSistema"];
                  }
           }
          catch
          {
              MessageBox.Show("ERROR AL VALIDAR AL USUARIO DEL SISTEMA.", "Advertencia", MessageBoxButtons.OK,                               MessageBoxIcon.Error);
            }
            finally
            {
                  CerrarConexion();
            }
            return dt;
     }


    CAPA DE NEGOCIO

     public DataTable ValidarUsuario(EntidadSesion objEntidadSesion)

     {
            return objNegocioSesion.ValidarUsuario(objEntidadSesion);
     }


    CAPA DE PRESENTACION

      //ESTE METODO VA DENTRO DE UN BOTON                                                   

     private void ValidarUsuario()
    {

          objEntidadSesion.Usuario = txtUsuario.Text;
          objEntidadSesion.Password = txtClave.Text;


            if (objEntidadSesion.Usuario == string.Empty && objEntidadSesion.Password == string.Empty)
            {
                  MessageBox.Show("DIGITE USUARIO Y CLAVE.", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Error);
             }
            else if (objEntidadSesion.Usuario != string.Empty && objEntidadSesion.Password == string.Empty)
            {
                  MessageBox.Show("DIGITE LA CLAVE.", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Error);
             }
             else if (objEntidadSesion.Usuario == string.Empty && objEntidadSesion.Password != string.Empty)
             {
                   MessageBox.Show("DIGITE EL USUARIO.", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Error);
             }
            else  if (objEntidadSesion.Usuario != string.Empty && objEntidadSesion.Password != string.Empty)
           {
                 DataTable dt = objNegocioSesion.ValidarUsuario(objEntidadSesion);
                   if (dt.Rows.Count > 0)
                  {
                        foreach (DataRow dr in dt.Rows)
                        {
                              string clave = dr["clave"].ToString();
                              nombresUsuario = dr["Nombre"].ToString();
                              apellidosUsuario = dr["Apellido"].ToString();

                               usuario = dr["usuario"].ToString();
                               if (clave == objEntidadSesion.Password)
                               {
                                   string mensaje = "BIENVENIDO " + nombresUsuario.ToUpper() + " " + apellidosUsuario.ToUpper();
                                }
                         }
                   }
                   else
                   {
                         MessageBox.Show("USUARIO NO SE ENCUENTRA REGISTRADO.", "Advertencia", MessageBoxButtons.OK,                                    MessageBoxIcon.Error);
                    }
             }

     Deseo saber si las validaciones realizadas en este metodo van ahi o en la capa de negocio.

    Cualquier ayuda estare muy agradecido. 

    martes, 3 de noviembre de 2015 19:42

Respuestas

  • >>pero tengo duda que se valida en la capa de presentación y que en la capa de negocio.

    la realidad es que deberia ser en ambas

    por lo general las validacioens de tipos de datos, rangos, etc se validan en el cliente

    validaciones mas complejas que requieren acceso a la db se realizan en la capa de negocio

    >>Deseo saber si la validación de campos vacíos

    capa de presentacion

    >>validación de datatable

    que es una validacion de datatable ?

    >>validación de claves (si la ingresada en el sistema coincide con la almacenada en la bd)

    capa de negocio

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta JCORBETTO lunes, 23 de noviembre de 2015 2:04
    martes, 3 de noviembre de 2015 20:03
  • yo tengo l costumbre de las validaciones de campos requeridos, longitudes de texto de los campos, validaciones de tipo de datos tal como en un campo de tipo numerico no metas una cadena o validar fechas correctas... Todo ese tipo va en Presentación.

    luego luego l resto de validaciones las aplicaria en negocio ya que dependen de un proceso de negocio como tal. Por ejemplo que el importe de una venta sea superior a x o lo que sea ...


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta JCORBETTO lunes, 23 de noviembre de 2015 2:04
    martes, 3 de noviembre de 2015 20:06
    Moderador
  • >>A continuación escribo los métodos que utilizo en las diferentes capas:

    en la capa de presentacion porque no usas el evento Validating del textbox para verificar si se completa el campo

    no necesitas tantos if, tampoco tantas combinatorias, si se carga el password no depende de algun otro control

    private void textbox1_Validating(...)
    {
    	if(textbox1.Text == "")
    	{
    		Errorprovider1.SetError(textbox1, "El campo es obligatorio");
    		e.Cancel = true;
    	}
    	
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta JCORBETTO jueves, 12 de noviembre de 2015 1:58
    martes, 3 de noviembre de 2015 20:06
  • hola

    la pregunta seria, si solo vas a validar un usuario porque usas un datatable ? no seria correcto

    usa objetos, defines una clase del tipo

    public class Usuario{
    
       public string Nombre{get;set;}
    
       public string Apellido{get;set;}
    
       public string clave {get;set;}
    
    }

    y le pasas esta al metodo

    bool paso = objNegocioSesion.ValidarUsuario(usuario);

    el metodo de validacion deberia devolver un true/false si pasa la autenticacion  y no devolver la intancia

    Login – Usando Password con Hash

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta JCORBETTO jueves, 12 de noviembre de 2015 1:58
    martes, 3 de noviembre de 2015 20:38
  • Hola JCORBETTO,

    Deberías separar las cosas:

    • Por un lado es validar la existencia de un usuario en la base de datos
    • Por otro lado es obtener mas información del usuario logeado

    Ambos casos podrían escribirse en dos métodos que va desde la capa de datos a la de negocios y entrega la información solicitada a la capa de presentación. 

    En la capa de presentación deberías tener lo siguiente:

    if (existeUsuario(txtUsuario.text, txtContraseña.Text))
    {
            /*Usuario registrado*/
            txtUsuarioConectado.Text = ObtenerUsuario(txtUsuario.text);
    }
    else
    {
            /*Usuario no registrado*/
    }

    Cada método tiene una responsabilidad única, el primero valida la existencia y el segundo retorna datos del usuario logeado. Queda claro que los métodos se llamarán y retornarán datos según lo que requieres, lo que muestro es sólo un ejemplo de como deberías abordar este caso.


    martes, 3 de noviembre de 2015 21:24
  • >>utilizo un datatable porque aparte de validar si existe el nombre de usuario y el password, también consulto el nombre y el apellido

    el tema es que son responsabilidades muy diferentes

    una cosa es el login, alli solo validas si pasa o no con el usuario y password proporcionado

    si pasa entonces recien alli recuperas los datos de la persona y no antes

    por otro lado lo que planteas no justifica usar datatable, podrias usar un datareader y volcar los datos a la instancia de la una clase, de esta forma trabajar orientado a objetos, imagino has leido algo sobre POO

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 4 de noviembre de 2015 6:45

Todas las respuestas

  • >>pero tengo duda que se valida en la capa de presentación y que en la capa de negocio.

    la realidad es que deberia ser en ambas

    por lo general las validacioens de tipos de datos, rangos, etc se validan en el cliente

    validaciones mas complejas que requieren acceso a la db se realizan en la capa de negocio

    >>Deseo saber si la validación de campos vacíos

    capa de presentacion

    >>validación de datatable

    que es una validacion de datatable ?

    >>validación de claves (si la ingresada en el sistema coincide con la almacenada en la bd)

    capa de negocio

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta JCORBETTO lunes, 23 de noviembre de 2015 2:04
    martes, 3 de noviembre de 2015 20:03
  • yo tengo l costumbre de las validaciones de campos requeridos, longitudes de texto de los campos, validaciones de tipo de datos tal como en un campo de tipo numerico no metas una cadena o validar fechas correctas... Todo ese tipo va en Presentación.

    luego luego l resto de validaciones las aplicaria en negocio ya que dependen de un proceso de negocio como tal. Por ejemplo que el importe de una venta sea superior a x o lo que sea ...


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta JCORBETTO lunes, 23 de noviembre de 2015 2:04
    martes, 3 de noviembre de 2015 20:06
    Moderador
  • >>A continuación escribo los métodos que utilizo en las diferentes capas:

    en la capa de presentacion porque no usas el evento Validating del textbox para verificar si se completa el campo

    no necesitas tantos if, tampoco tantas combinatorias, si se carga el password no depende de algun otro control

    private void textbox1_Validating(...)
    {
    	if(textbox1.Text == "")
    	{
    		Errorprovider1.SetError(textbox1, "El campo es obligatorio");
    		e.Cancel = true;
    	}
    	
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta JCORBETTO jueves, 12 de noviembre de 2015 1:58
    martes, 3 de noviembre de 2015 20:06
  • respecto a la capa de negocio no deberias mantener la conexion abierta, se supone que uses el using

    algo como explico aqui

    [WinForms] Edición Empleados

    analiza la capa de datos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 3 de noviembre de 2015 20:08
  • Hola leandro, gracias por reponder, al consultar sobre validacion de datatable es si hay registros en el mismo por ejemplo:

     DataTable dt = objNegocioSesion.ValidarUsuario(objEntidadSesion);
     if (dt.Rows.Count > 0)
     {
              foreach (DataRow dr in dt.Rows)
              {
                     string clave = dr["clave"].ToString();
                     nombresUsuario = dr["Nombre"].ToString();
                      apellidosUsuario = dr["Apellido"].ToString();

                      usuario = dr["usuario"].ToString();
                       if (clave == objEntidadSesion.Password)
                       {
                            string mensaje = "BIENVENIDO " + nombresUsuario.ToUpper() + " " +                                                                      apellidosUsuario.ToUpper();
                        }
                    }
               }
               else
               {
                     MessageBox.Show("USUARIO NO SE ENCUENTRA REGISTRADO.", "Advertencia",                                                    MessageBoxButtons.OK,                                    MessageBoxIcon.Error);
              }

    esta parte de codigo en que capa iria?

    martes, 3 de noviembre de 2015 20:17
  • hola

    la pregunta seria, si solo vas a validar un usuario porque usas un datatable ? no seria correcto

    usa objetos, defines una clase del tipo

    public class Usuario{
    
       public string Nombre{get;set;}
    
       public string Apellido{get;set;}
    
       public string clave {get;set;}
    
    }

    y le pasas esta al metodo

    bool paso = objNegocioSesion.ValidarUsuario(usuario);

    el metodo de validacion deberia devolver un true/false si pasa la autenticacion  y no devolver la intancia

    Login – Usando Password con Hash

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta JCORBETTO jueves, 12 de noviembre de 2015 1:58
    martes, 3 de noviembre de 2015 20:38
  • Gracias Leandro por responder, utilizo un datatable porque aparte de validar si existe el nombre de usuario y el password, también consulto el nombre y el apellido del usuario conectado para mostrar un mensaje en el form padre, como es el siguiente:

    USUARIO CONECTADO: LUIS PEREZ

    Por eso utilizo datatable, la consulta sql que utilizo es:

    SELECT clave, nombres, apellidos FROM TbUsuarioSistema WHERE Usuario = @usuario;  

    Después de eso valido si el datatable esta vació o no, mi pregunta es si esta validación va en la capa de negocio o presentación   

    martes, 3 de noviembre de 2015 21:07
  • Hola JCORBETTO,

    Deberías separar las cosas:

    • Por un lado es validar la existencia de un usuario en la base de datos
    • Por otro lado es obtener mas información del usuario logeado

    Ambos casos podrían escribirse en dos métodos que va desde la capa de datos a la de negocios y entrega la información solicitada a la capa de presentación. 

    En la capa de presentación deberías tener lo siguiente:

    if (existeUsuario(txtUsuario.text, txtContraseña.Text))
    {
            /*Usuario registrado*/
            txtUsuarioConectado.Text = ObtenerUsuario(txtUsuario.text);
    }
    else
    {
            /*Usuario no registrado*/
    }

    Cada método tiene una responsabilidad única, el primero valida la existencia y el segundo retorna datos del usuario logeado. Queda claro que los métodos se llamarán y retornarán datos según lo que requieres, lo que muestro es sólo un ejemplo de como deberías abordar este caso.


    martes, 3 de noviembre de 2015 21:24
  • >>utilizo un datatable porque aparte de validar si existe el nombre de usuario y el password, también consulto el nombre y el apellido

    el tema es que son responsabilidades muy diferentes

    una cosa es el login, alli solo validas si pasa o no con el usuario y password proporcionado

    si pasa entonces recien alli recuperas los datos de la persona y no antes

    por otro lado lo que planteas no justifica usar datatable, podrias usar un datareader y volcar los datos a la instancia de la una clase, de esta forma trabajar orientado a objetos, imagino has leido algo sobre POO

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 4 de noviembre de 2015 6:45