domingo, 15 de septiembre de 2013

Para este ejemplo, tomaremos como base el proyecto anterior y comensaremos a modificar unicamente a las clases del proyecto AccesoDato, en los demas proyectos no sera necesario realizar cambio alguno. Esto es una de las ventajas de trabajar en capas.
Los cambios seran en la clase conexion.cs

using System;
namespace AccesoDato
{
  public sealed class conexion
  {
    public static string LeerCC
    {
      get { return "Server=localhost; Port=3306; User Id=root; password=123; Persist Security Info=True; database=agenda"; }
    }
  }
}

En la clase adDistrito.cs

using System;
using System.Collections.Generic;
using MySql.Data.MySqlClient;

namespace AccesoDato
{
  public sealed class adDistrito
  {
    public static bool Grabar(Entidades.Distrito pEntidad)
    {
      using (var cn = new MySqlConnection(conexion.LeerCC))
      {
        // Contamos cuantos distritos existen segun el coddistrito o nomdistrito
        using (var cmd = new MySqlCommand(@"select ifnull(count(coddistrito),0) from distritos where coddistrito=@cod or nomdistrito=@nom;", cn))
        {
          cmd.Parameters.AddWithValue("cod", pEntidad.coddistrito);
          cmd.Parameters.AddWithValue("nom", pEntidad.nomdistrito);

          cn.Open();
          // Ejecutamos el comando y verificamos si el resultado es mayor a cero actualizar, caso contrario insertar
          if (Convert.ToInt32(cmd.ExecuteScalar()) > 0)
          {
            // Si es mayor a cero, quiere decir que existe al menos un registro con los datos ingresados
            // Entonces antes de actualizar, hacer las siguientes comprobaciones
            if (pEntidad.coddistrito == 0)
              throw new Exception("El distrito ya esta registrado en el sistema, verifique los datos por favor!...");

            // Verifica si ya existe un registro con el mismo nombre del distrito
            cmd.CommandText = @"select ifnull(count(coddistrito),0) from distritos where coddistrito<>@cod and nomdistrito=@nom;";
            if (Convert.ToInt32(cmd.ExecuteScalar()) > 0)
              throw new Exception("No se puede grabar un valor duplicado, verifique los datos por favor!...");

            // Si las comprobaciones anteriores resultaron ser falsa, entonces actualizar
            cmd.CommandText = @"update distritos set nomdistrito=@nom where coddistrito=@cod;";
          }
          else
            cmd.CommandText = @"insert into distritos (nomdistrito) values (@nom);";

          // Ejecutamos el comando que puede ser para update o insert
          return Convert.ToBoolean(cmd.ExecuteNonQuery());
        }
      }
    }

    public static bool Eliminar(Entidades.Distrito pEntidad)
    {
      using (var cn = new MySqlConnection(conexion.LeerCC))
      {
        // Contar la cantidad de amigos que existe en un determinado distrito
        using (var cmd = new MySqlCommand(@"select ifnull(count(codamigo),0) from amigos where coddistrito=@cod;", cn))
        {
          cmd.Parameters.AddWithValue("cod", pEntidad.coddistrito);

          cn.Open();
          // Si es mayor a cero, quiere decir que existen amigos en dicho distrito que intentamos eliminar
          if (Convert.ToInt32(cmd.ExecuteScalar()) > 0)
            throw new Exception("No es posible eliminar el registro, ya que éste se encuentra en uso...");

          cmd.CommandText = "delete from distritos where coddistrito=@cod;";
          return Convert.ToBoolean(cmd.ExecuteNonQuery());
        }
      }
    }

    public static List Leer(string dato)
    {
      // Crea un obj. lista de tipo Distrito
      var lista = new List();
      // Crear el objeto de conexion
      using (var cn = new MySqlConnection(conexion.LeerCC))
      {
        // crear el comando
        using (var cmd = new MySqlCommand("select coddistrito, nomdistrito from distritos where nomdistrito like Concat(@nom, '%');", cn))
        {
          //Asignar valores a los parametros
          cmd.Parameters.AddWithValue("nom", dato);

          // Abrir el objeto de conexion
          cn.Open();
          using (var dr = cmd.ExecuteReader())
          {
            while (dr.Read())
            {
              // Crea un objeto del distrito
              var oDistrito = new Entidades.Distrito();
              oDistrito.coddistrito = Convert.ToInt32(dr[dr.GetOrdinal("coddistrito")]);
              oDistrito.nomdistrito = Convert.ToString(dr[dr.GetOrdinal("nomdistrito")]);
              // El objeto distrito es agregado a la lista
              lista.Add(oDistrito);
              oDistrito = null;
            }
          }

          // Retorna una lista de datos
          return lista;
        }
      }
    }
  }
}


En la clase adAmigo.cs

using System;
using System.Collections.Generic;
using MySql.Data.MySqlClient;

namespace AccesoDato
{
  public sealed class adAmigo
  {
    public static bool Grabar(Entidades.Amigo pEntidad)
    {
      using (var cn = new MySqlConnection(conexion.LeerCC))
      {
        // Contamos cuantos amigos existen segun el codamigo o nombre
        using (var cmd = new MySqlCommand(@"select ifnull(count(codamigo),0) from amigos where codamigo=@cod or dni=@dni;", cn))
        {
          //Asignar valores a los parametros
          cmd.Parameters.AddWithValue("cod", pEntidad.codamigo);
          cmd.Parameters.AddWithValue("cdis", pEntidad.edistrito.coddistrito);
          cmd.Parameters.AddWithValue("nom", pEntidad.nombre);
          cmd.Parameters.AddWithValue("dni", pEntidad.dni);
          cmd.Parameters.AddWithValue("fn", pEntidad.fecnac);
          cmd.Parameters.AddWithValue("sex", pEntidad.sexo);
          cmd.Parameters.AddWithValue("dir", pEntidad.direccion);
          cmd.Parameters.AddWithValue("telef", pEntidad.telefono);

          cn.Open();
          // Ejecutamos el comando y verificamos si el resultado es mayor a cero actualizar, caso contrario insertar
          if (Convert.ToInt32(cmd.ExecuteScalar()) > 0)
          {
            // Si es mayor a cero, quiere decir que existe al menos un registro con los datos ingresados
            // Entonces antes de actualizar, hacer las siguientes comprobaciones
            if (pEntidad.codamigo == 0)
              throw new Exception("El amigo(a) ya esta registrado en el sistema, verifique los datos por favor!...");

            // Verifica si ya existe un registro con el mismo nombre del distrito
            cmd.CommandText = @"select ifnull(count(codamigo),0) from amigos where codamigo<>@cod and dni=@dni;";
            if (Convert.ToInt32(cmd.ExecuteScalar()) > 0)
              throw new Exception("No se puede grabar un valor duplicado, verifique los datos por favor!...");

            // Si las comprobaciones anteriores resultaron ser falsa, entonces actualizar
            cmd.CommandText = @"update amigos set coddistrito=@cdis, nombre=@nom, dni=@dni, fecnac=@fn, sexo=@sex, direccion=@dir, telefono=@telef where codamigo=@cod;";
          }
          else
            cmd.CommandText = @"insert into amigos (coddistrito, nombre, dni, fecnac, sexo, direccion, telefono) values (@cdis, @nom, @dni, @fn, @sex, @dir, @telef);";

          // Ejecutamos el comando que puede ser para update o insert
          return Convert.ToBoolean(cmd.ExecuteNonQuery());
        }
      }
    }

    public static bool Eliminar(Entidades.Amigo pEntidad)
    {
      using (var cn = new MySqlConnection(conexion.LeerCC))
      {
        // Como nadie depende de esta entidad (amigos) no habra comprobaciones de dependencia
        using (var cmd = new MySqlCommand(@"delete from amigos where codamigo=@cod;", cn))
        {
          cmd.Parameters.AddWithValue("cod", pEntidad.codamigo);

          cn.Open();
          // Ejecuta el comando
          return Convert.ToBoolean(cmd.ExecuteNonQuery());
        }
      }
    }

    public static List Leer(string dato)
    {
      // Crea un obj. lista de tipo Amigo
      var lista = new List();
      // Crear el objeto de conexion
      using (var cn = new MySqlConnection(conexion.LeerCC))
      {
        // crear el comando
        using (var cmd = new MySqlCommand("select codamigo, nomdistrito, nombre, dni, fecnac, sexo, direccion, telefono from distritos inner join amigos on distritos.coddistrito = amigos.coddistrito where nombre like Concat(@nom, '%');", cn))
        {
          //Asignar valores a los parametros
          cmd.Parameters.AddWithValue("nom", dato);

          // Abrir el objeto de conexion
          cn.Open();
          using (var dr = cmd.ExecuteReader())
          {
            while (dr.Read())
            {
              // Crea un objeto del distrito
              var oDistrito = new Entidades.Distrito();
              var oAmigo = new Entidades.Amigo();
              oAmigo.codamigo = Convert.ToInt32(dr[dr.GetOrdinal("codamigo")]);

              // Aqui obtenemos el nombre del distrito para luego ser enviado al objeto amigo
              oDistrito.nomdistrito = Convert.ToString(dr[dr.GetOrdinal("nomdistrito")]);
              oAmigo.edistrito = oDistrito;

              oAmigo.nombre = Convert.ToString(dr[dr.GetOrdinal("nombre")]);
              oAmigo.dni = Convert.ToString(dr[dr.GetOrdinal("dni")]);
              oAmigo.fecnac = Convert.ToDateTime(dr[dr.GetOrdinal("fecnac")]);
              oAmigo.sexo = Convert.ToString(dr[dr.GetOrdinal("sexo")]);
              oAmigo.direccion = Convert.ToString(dr[dr.GetOrdinal("direccion")]);
              oAmigo.telefono = Convert.ToString(dr[dr.GetOrdinal("telefono")]);
              // El objeto amigo es agregado a la lista
              lista.Add(oAmigo);
              // marcamos a los objetos creamos como nulos
              oDistrito = null;
              oAmigo = null;
            }
          }

          // Retorna una lista de datos
          return lista;
        }
      }
    }
  }
}


NOTA: para trabajar con MySQL debemos de instalar el conector .Net de MySQL.

Descargar

sábado, 14 de septiembre de 2013

En internet podemos encontrar un enorme conglomerado de información sobre la programación en N capas, el objetivo de este curso es, mostrarte como realizar dicha programación usando como lenguaje de programación Visual C# y base de datos en SQL Server. Ahora veamos un gráfico de cómo interactúan las capas.

Capa de datos (Data Tier): será el repositorio de datos, es decir el servidor de datos en donde estará almacenada la base de datos y sus tablas (entidades).
Capa de entidades (Domain – Entity Layer): aquí estará cada una de las tablas (entidades) de la base de datos convertidas en clases con sus respectivas propiedades. Esta capa será común para las demás capas (presentación, negocio y acceso a datos), es decir interactuara con ellas.
Capa de acceso a datos (DAL – Data Access Layer): esta capa será la encargada de implementar toda las sentencias y consultas sql, pudiendo también hacer uso de los procedimientos almacenados que pueda tener la base de datos. Interactuara con la capa de datos, entidades y la capa de lógica de negocio.
Capa de lógica de negocio (BLL – Business Logic Layer): en esta capa se implementara todas las reglas del negocio, es decir lo que se debe de cumplir antes de llevar a cabo alguna acción. Interactuara con las capas de presentación, acceso a datos y con las entidades.
Capa de presentación (UI – User Interface): esta es la capa que implementa toda la interfaz grafica (formularios) que interactúa directamente con el usuario final (mostrando o recopilando información), capa de lógica de negocio y entidades.
NOTA: cada una de estas capas pueden tener diferentes “nombres” según bibliografías consultadas.

Paso 1: crear la base de datos en el servidor SQL, la base de datos se llamara Agenda y sus entidades serán Distritos y Amigos.

use Master
go
-- Buscamos la base de datos agenda, si no esta vacia, eliminarla
if db_id ('agenda') is not null
       drop database agenda
go

-- Creamos la base de datos
create database agenda;
go
use agenda;
go

-- Crear las tablas
create table distritos(
coddistrito int primary key identity(1,1),
nomdistrito nvarchar(50) NULL);
go

create table amigos(
codamigo int primary key identity(1,1),
coddistrito int not null references distritos(coddistrito) on update cascade on delete cascade,
nombre nvarchar(50) not null,
dni nvarchar(8) not null,
fecnac smalldatetime,
sexo nvarchar(10) not null,
direccion nvarchar(100),
telefono nvarchar(50));
go

Paso 2: Ejecutar Visual Studio y crear una solución en blanco con el nombre J4ckware (o el que ud. Desee).


A esta solución en blanco, agregar un nuevo proyecto con el nombre de Presentación. Este proyecto representara a la capa de presentación, será la encargada de presentar datos o recibir datos del usuario final que interactuará con esta capa.


Continuara la lección en un archivo PDF, además del codigo fuente..

Descargar:
Leccion completa en PDF
Codigo fuente del curso

miércoles, 22 de junio de 2011

Debido a que los enlaces de descarga de las lecciones pasaron a mejor vida... dejo un nuevo enlace en donde encontraran todas las lecciones publicadas en un solo archivo comprimido, incluyendo el nuevo certificado de seguridad.

Atte,
J4ckware™

Descargar lecciones
Descargar leccion 019
Codigo fuente

domingo, 18 de abril de 2010

A pedido de muchos de mis seguidores, aqui la lección 030 v1.1 explicada paso a paso. Para poder abrir esta lección deberá de instalar el nuevo certificado de seguridad.

En la próxima lección implementaremos los reportes de nuestro sistema.

Nota: No olvidar instalar el nuevo certificado de seguridad J4ckware 2010 en tu sistema, para poder abrir esta lección.

Descargar Lección
Mirror 1

miércoles, 29 de abril de 2009

En esta entrega se ha terminado de implementar los formularios correspondiente a: Compras y Ventas de los productos.

En el formulario ventas también se ha implementado la opcion de imprimir. Alli se ha creado un reporte utilizando CrytalReports, adicionalmente se ha añadido los parametros a dicho reporte como el cliente, tipo de documento, serie, numero.

También se ha corregido un pequeño descuido que he cometido en la tabla Ventas, especialmente el campo NroDoc cuyo tamaño es 6, debería y debe ser 7.

NOTA:
Debido a los reiterativos problemas con las lecciones que por alguna "extraña" razon terminan dañandose, he decidido subirlos a dos servidores. En ambos servidores son los mismos archivos.

Descargar
Mirror 1
Mirror 2

viernes, 20 de febrero de 2009

En esta lección desarrollaremos los formularios productos/Articulos y el formulario que corresponde a proveedores. En los TableAdapter de productos y proveedores crearemos tres procedimientos almacenados para Registrar, Actualizar y Eliminar registros de las resectivas tablas.

Nota: Si ya tienes instalado el certificado de seguridad J4ckware en tu sistema ya no es necesario volver a instalarlo.

Descargar Lección

viernes, 30 de enero de 2009

En esta segunda parte de nuestro sistema de control, se ha desarrollado todo lo que concierne al formulario Clientes, es decir, en este formulario se podrán realizar operaciones como agregar nuevos clientes, actualizar los datos de los clientes existentes, así como también eliminar clientes. Todas estas operaciones se realizaran por medio de procedimientos almacenados.

Además hemos agregado una clase a nuestro proyecto llamado Generales, en donde se ha implementado dos métodos que servirá para poder escribir solo números en algunas cajas de texto o solo monedas en otras cajas de textos.

También estamos controlando que exista una sola instancia del formulario Cliente, es decir, si ya tenemos una ventana abierta de este formulario, no permitir que se cree otra hasta que no se cierre la que tenemos visible. Esta acción se ha controlado mediante una variable booleana.

Nota: Si ya tienes instalado el certificado de seguridad J4ckware en tu sistema ya no es necesario volver a instalarlo.

Descargar Lección
Descargar Video
Subscribe to RSS Feed Follow me on Twitter!