Mostrar mensajes con jQuery UI - Asp.net

domingo, 24 de febrero de 2013

Esperen todos estén bien, antes de empezar el ejemplo de este articulo me tomo unas cuantas lineas para mencionarles a todos los que leen mi blog que por motivos de trabajo y estudio no estaré haciendo artículos muy seguido como lo he hecho casi siempre(tratare de que sea al menos uno al mes), esto no quiere decir que me descuidare del blog para nada en mis tiempos libres tratare de seguir poniendo ejemplos y respondiendo cualquier duda que tengan.

Bien en este articulo veremos algo sencillo pero seguro a mas de alguno le sirve, y es que siempre que desarrollamos aplicaciones web tenemos la necesidad de mostrar mensajes al usuario y muy frecuentemente mostramos este tipo de mensajes en los famosos alert de javascript , pero seguro a muchos esta ventana les parecerá poco atractiva incluso muy sencilla, pues bien ahora haciendo uso de un plugin de jQuery llamado jQuery UI veremos la manera de mostrar mensajes en una ventana con diseños muy bonitos y que al usuario le parecerá mas agradable.

Veremos como hacerlo al lado del cliente y al lado del servidor.

Veamos primero como hacerlo al lado del cliente
        function MostrarMensaje(mensaje, titulo) {

            var ventana = $('
' + mensaje + '
'); ventana.dialog({ modal: true, buttons: { "OK": function () { $(this).dialog("close"); } }, show: "fold", hide: "scale", }); } $(document).ready(function () { $('#btnenviar2').click(function () { var nombre = $('#<%=txtnombre.ClientID%>').val(); var edad = $('#<%=txtedad.ClientID%>').val(); var mensaje = "Hola" + " " + nombre + " " + "tu tienes" + " " + edad + " " + "años de edad"; MostrarMensaje(mensaje, "Saludos"); }); });


Tenemos una función MostrarMensaje() que recibe 2 parámetros que sera el titulo que queremos que se muestre en la venta y el mensaje que queremos mostrar y dentro de esta tenemos algunas características, que podemos configurar de este pluging en este caso le agregamos un botón que al hacer click cierra la ventana y le agregamos algunos efectos (en la web del plugin pueden encontrar las diferentes propiedades que se pueden aplicar al pluging). Esta función nos servirá para mostrar el mensaje del lado del cliente como del lado del servidor

Ahora para mostrar el mensaje desde el servidor usamos el evento click del botón html en este caso un input llamado btnenviar2, y dentro de este capturamos los datos de las cajas de texto y  llamamos a la función MostrarMensaje() y le pasamos estos datos.

Ahora veamos como mostrar el mensaje desde el servidor.
        protected void btnenviar_Click(object sender, EventArgs e)

        {

            string mensaje = string.Format("Hola {0} tu tienes {1} años de edad",txtnombre.Text, txtedad.Text);

            string script = string.Format("MostrarMensaje('{0}', '{1}')", mensaje, "Saludos");

            ScriptManager.RegisterStartupScript(this, typeof(Page), "MostrarMensaje", script, true);

        }


Para mostrar el mensaje desde el lado del servidor lo que tenemos que hacer es dentro del evento click del botón  llamar la función javascript MostrarMensaje() y pasarle los parámetros y para eso hacemos uso del método ScriptManager.RegisterStartupScrip que sirve para registrar código javascript al lado del servidor.



Capturas

Descargar Proyecto

Filtrar Datos de Reporte - Crystal Report

jueves, 3 de enero de 2013

Primeramente les deseo feliz año 2013 a todos los lectores de mi blog espero que este año este lleno de muchas bendiciones para todos.

Quiero empezar este año con un ejemplo que es muy común y necesario a la hora de hacer reportes con crystal report, y es que cuando creamos reportes en ocasiones tenemos la necesidad de filtrar los datos por medio de uno o varios campos.

 El ejemplo sera uno simple para que puedan entenderlo, la base de datos que usare para el ejemplo solo cuenta con 2 tablas Categoría y Articulo.


base de datos

Creamos un dataset(DsReporte) y agregamos 2 datatable que representaran las 2 tablas de la base de datos ademas le agregamos los campos correspondiente de cada tabla y también indicamos el tipo de dato de cada campo. Importante que cada datatable tiene que llamarse como el nombre de la tabla en la base de datos y ademas tener los mismos campos y mismo tipo de dato que tienen en la base de datos.

dataset 


tipo de dato 


Creamos el reporte usando el dataset que creamos(el reporte mostrara todos los articulos de nuestra base de datos).

crear reporte


Ahora crearemos el código que usaremos para llenar el dataset y mostrar los datos en el reporte así que agregamos una clase(modulo en el caso de vb) llamada Datos y agregamos el siguiente codigo.
        public static DataTable CargarCategoria()
        {
            using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
            {
                DataTable dt = new DataTable();
                string query = "SELECT * FROM Categoria";
                SqlCommand cmd = new SqlCommand(query, cnn);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
                return dt;
            }
        }

        public static DsReporte CargarArticulos()
        {
            DsReporte ds = new DsReporte();
            using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
            {
                string query = "SELECT * FROM Articulo";
                SqlCommand cmd = new SqlCommand(query, cnn);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(ds, "Articulo");
                return ds;
            }
        }

        public static DsReporte FiltrarArticulos(int categoria)
        {
            DsReporte ds = new DsReporte();
            using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
            {
                string query = "SELECT * FROM Articulo WHERE CatId=@cat";
                SqlCommand cmd = new SqlCommand(query, cnn);
                cmd.Parameters.AddWithValue("@cat", categoria);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(ds, "Articulo");
                return ds;
            }
        }
    Public Function CargarCategoria() As DataTable
        Using cnn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())
            Dim dt As New DataTable()
            Dim query As String = "SELECT * FROM Categoria"
            Dim cmd As New SqlCommand(query, cnn)
            Dim da As New SqlDataAdapter(cmd)
            da.Fill(dt)
            Return dt
        End Using
    End Function

    Public Function CargarArticulos() As DsReporte
        Dim ds As New DsReporte()
        Using cnn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())
            Dim query As String = "SELECT * FROM Articulo"
            Dim cmd As New SqlCommand(query, cnn)
            Dim da As New SqlDataAdapter(cmd)
            da.Fill(ds, "Articulo")
            Return ds
        End Using

    End Function

    Public Function FiltrarArticulos(ByVal categoria As Integer) As DsReporte
        Dim ds As New DsReporte()
        Using cnn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())
            Dim query As String = "SELECT * FROM Articulo WHERE CatId=@cat"
            Dim cmd As New SqlCommand(query, cnn)
            cmd.Parameters.AddWithValue("@cat", categoria)
            Dim da As New SqlDataAdapter(cmd)
            da.Fill(ds, "Articulo")
            Return ds
        End Using
    End Function
El metodo CargarCategoria() obtiene todos los datos de la tabla categoría en un datatable.
El metodo CargarArticulos() llena el dataset con los datos de la tabla articulos.
El metodo FiltrarArticulos() también llena el dataset con los datos de la tabla artículos pero a diferencia del anterior este los llena aplicando un filtro que en este caso es por medio del campo CatId.

Ahora programaremos el código que tendrá nuestro Form.
        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.DataSource = Datos.CargarCategoria();
            comboBox1.DisplayMember = "CatNombre";
            comboBox1.ValueMember = "CatId";
            comboBox1.SelectedIndex = -1;

            DsReporte datos = Datos.CargarArticulos();

            CrpReporte report = new CrpReporte();
            report.SetDataSource(datos);
            crystalReportViewer1.ReportSource = report;

        }

        private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
        {
            DsReporte datos = Datos.FiltrarArticulos(Convert.ToInt32(comboBox1.SelectedValue));

            CrpReporte report = new CrpReporte();
            report.SetDataSource(datos);
            crystalReportViewer1.ReportSource = report;
        }
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ComboBox1.DataSource = Datos.CargarCategoria()
        ComboBox1.DisplayMember = "CatNombre"
        ComboBox1.ValueMember = "CatId"
        ComboBox1.SelectedIndex = -1

        Dim da As DsReporte = Datos.CargarArticulos()

        Dim report As New CrpReporte()
        report.SetDataSource(da)
        CrystalReportViewer1.ReportSource = report
    End Sub

    Private Sub ComboBox1_SelectionChangeCommitted(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectionChangeCommitted
        Dim da As DsReporte = Datos.FiltrarArticulos(Convert.ToInt32(ComboBox1.SelectedValue))

        Dim report As New CrpReporte()
        report.SetDataSource(da)
        CrystalReportViewer1.ReportSource = report
    End Sub
En el evento Load cargamos las categorias en un combobox y tambien cargamos en el reporte todos los artículos.
En el evento SelectionChangeCommitted del combobox cargamos los datos en el reporte dependiendo la categoría seleccionada en el combobox, asi cada vez que el usuario seleccione una categoría del combobox los datos del reporte solo mostraran los artículos que pertenecen a la categoría seleccionada.

Capturas


Eso es todo espero les sirva mucho saludos desde El Salvador...

Descargar Proyecto C#

Descargar Proyecto VB.Net

Usar JavaScript con Controles Asp.Net

miércoles, 28 de noviembre de 2012

En esta ocasión veremos como usar javascript en controles asp.net.

Veremos un ejemplo sencillo donde se ara una suma o resta dependiendo de la opcion del usuario.

El diseño de la aplicacion es la siguiente.

Diseño

Como veran el diseño es sencillo el usuario ingresara datos en los 2 textbox y luego mediante un dropdowlist elegirá si realiza una suma o resta y mostraremos el resultado en un label.

Veamos el código.
function Operacion() 
{
        //capturar valores
        var dato1 = document.getElementById('<%=TextBox1.ClientID%>').value;
        var dato2 = document.getElementById('<%=TextBox2.ClientID%>').value;
        var opcion = document.getElementById('<%=DropDownList1.ClientID%>').value;
        //comprobar que los datros sean numericos
        if (!isNaN(dato1) && !isNaN(dato2)) 
        {
             //si selecciono suma realizo suma
             if (opcion == "Sumar") 
             {
                  var resul = parseFloat(dato1) + parseFloat(dato2);
                  document.getElementById('<%=Label1.ClientID%>').innerHTML = resul;
             }
             //si no realiza resta
             else 
             {
                  var resul = parseFloat(dato1) - parseFloat(dato2);
                  document.getElementById('<%=Label1.ClientID%>').innerHTML = resul;
             }
        }
        else 
        {
            alert('ingrese numero');
        }

}

function Limpiar() 
{
      document.getElementById('<%=TextBox1.ClientID%>').value = '';
      document.getElementById('<%=TextBox2.ClientID%>').value = '';
      document.getElementById('<%=Label1.ClientID%>').innerHTML = '';
}
Como verán tenemos 2 funciones la primera Operación() es la que se encarga de realizar la operación seleccionada por el usuario, en la primera parte del código capturamos los valores introducidos en los textbox y la opcion seleccionada en el dropdowlist, comprobamos si los datos introducidos son numéricos y luego evaluamos si el usuario selecciono la suma o resta y hacemos la operación para cada opcion y mostramos el resultado en un label.
La segunda función Limpiar() como pueden imaginarse lo único que hace es limpiar los datos. Ahora para llamar las funciones desde los botones tenemos el siguiente código.
<asp:button id="Button1" onclientclick="Operacion(); return false;" runat="server" text="Calcular" />

<asp:button id="Button2" onclientclick="Limpiar(); return false;" runat="server" text="Limpiar" />
Usamos la propiedad OnclientClick para llamar la función javascript, incluimos el return false para evitar que el botón  haga postback

Captura

Eso seria todo espero les sea de utilidad.

Descargar Ejemplo

Microsoft Community Contributor(MCC)



En esta ocasión quiero compartir con ustedes la noticia agradable que he sido reconocido como Microsoft Community Contributor(MCC) gracias a  los pequeños aportes que hago a los foros de MSDN.

Así que quiero darles las gracias a esta hermosa comunidad  MSDN que gracias a ella a lo largo de estos meses he aprendido mucho y a sido una gran herramienta para poder mejorar mis conocimientos sobre .Net espero seguir aportando para poder responder sus dudas.

Gracias a todos.
 Saludos.

Desarrollo en Capas .Net (Parte 4) - Capa Presentacion

miércoles, 31 de octubre de 2012

En el articulo anterior desarrollamos nuestra capa de negocio

 Pueden ver el articulo aquí Desarrollo en Capas .Net (Parte 3) - Capa de Negocio

La capa presentación(presentation) es la que ve el usuario (también se la denomina "capa de usuario"), presenta el sistema al usuario, le comunica la información y captura la información del usuario en un mínimo de proceso (realiza un filtrado previo para comprobar que no hay errores de formato).

En este ultimo articulo es donde veremos como se comunican las diferentes capas entre si.

capas


Diseño de la aplicación.

Diseño


Cargar Alumnos y Materias.
 
        //cargo alumnos en combobox
        private void CargarAlumnos()
        {
            cbxalumnos.DataSource = AlumnoBL.CargarAlumnos();
            cbxalumnos.ValueMember = "AluId";
            cbxalumnos.DisplayMember = "AluNombre";
        }

        private void FrmAlumno_Load(object sender, EventArgs e)
        {
            CargarAlumnos();

            //cargo materias en combobox
            cbxmaterias.DataSource = MateriaBL.CargarMaterias();
            cbxmaterias.ValueMember = "MatId";
            cbxmaterias.DisplayMember = "MatNombre";

        }
Tenemos un método CargarAlumnos() que lo que hace es cargos el nombre de todos los alumnos en un combobox este método lo llamaremos luego de actualizar o agregar un nuevo alumno para que los datos del combobox se actualicen y en el evento load del formulario también cargamos todas las materias en otro combobox.

Agregar o Actualizar Alumno.
 
       //Variable global que prepresenta al alumno seleccionado
       Alumno alum = null;

        private void btnguardar_Click(object sender, EventArgs e)
        {
            //compruebo las validaciones
            if (!ValidacionesAlumno())
                return;

            // si el cliente se ha seleccionado lo actualizo, sino se crea uno nuevo
            if(alum == null)
                alum = new Alumno();

            alum.AluNombre = txtnombre.Text;
            alum.AluApellido = txtapellido.Text;
            alum.AluEdad = Convert.ToInt16(txtedad.Text);
            alum.AluDireccion = txtdireccion.Text;

            alum = AlumnoBL.Save(alum);
            MessageBox.Show("Se agrego o Actulizo el Alumno con Id:" +alum.AluId);
            CargarAlumnos();
            Limpiar();
        }
Tenemos una variable global que representa un alumno, luego la capa de negocio validad si la entidad(Alumno) existe o no por medio del id y en base a esto se ejecuta la operación correspondiente a cada caso, también en el código encontramos los métodos ValidacionesAlumno() que lo que hace es validar que los datos de la entidad Alumno sean los correctos, CargarAlumnos() luego de agregar o actualizar un alumno vuelve a cargar los alumnos y Limpiar() que limpia los datos de los textbox.

Agregar Nota.
 
        private void btnguardarnota_Click(object sender, EventArgs e)
        {
            //compruebo las validaciones
            if (!ValidacionesNotas())
                return;

            //creo una nota nueva
            Nota not = new Nota();
            not.AluId = Convert.ToInt32(cbxalumnos.SelectedValue);
            not.MatId = Convert.ToInt32(cbxmaterias.SelectedValue);
            not.NotNota = Convert.ToDecimal(txtnota.Text);

            //si nota para la materia no existe se crea si no muestra mensaje que ya existe
            if (!NotaBL.CreateNota(not))
            {
                MessageBox.Show("Se agrego la Nota con Id:" + not.NotId);
                Limpiar();
            }
            else
                MessageBox.Show("Ya Existe una Nota del Alumno para la Materia:" + cbxmaterias.Text);
        }
La capa de negocio se encarga de validar si ya existe una nota para una materia de un alumno si no existe la agrega y si existe muestra un mensaje que ya existe una nota para la materia, dentro del codigo encontramos los metodos ValidacionesNotas() que lo que hace que los datos para agregar una nota sean correctos y Limpiar() limpia los datos de los textbox.

Editar Notas.
 
        //variable global de entidad nota
        Nota not = new Nota();

        private void btnguardar_Click(object sender, EventArgs e)
        {
            //compruebo validaciones
            if (!ValidacionesNota())
                return;

            not.NotId = Convert.ToInt32(txtidnota.Text);
            not.AluId = Convert.ToInt32(txtidalumno.Text);
            not.MatId = Convert.ToInt32(txtidmateria.Text);
            not.NotNota = Convert.ToDecimal(txtnota.Text);

            //si nota existe la actualizo
            if (NotaBL.UpdateNota(not))
            {
                MessageBox.Show("Se actualizo la nota con Id:" + not.NotId);
                CargarGrilla();
                Limpiar();
            }
            else
                MessageBox.Show("No se pudo actualizar la nota");           
        }
La capa de negocio se encarga de validar si la nota existe por medio del id, si existe actualiza el registro si no muestra mensaje que no se puede actualizar, en el código encontramos los métodos ValidacionesNota() valida que los datos para agregar una nota sean correctos, CargarGrilla() carga todas las notas de un alumno en un datagridview y Limpiar() limpia los datos de los textbox.

Capturas


Conclusión
A lo largo de los 4 artículos hemos visto como desarrollar un proyecto en capas en .net usando entity framework, si bien el ejemplo puede ser un poco sencillo pero puede servir de guía o ejemplo para nuestros futuros desarrollos.

Descargar Proyecto C#

Descargar Proyecto VB.Net

Desarrollo en Capas .Net (Parte 3) - Capa de Negocio

jueves, 25 de octubre de 2012

En el articulo anterior desarrollamos nuestra capa de datos.

 Pueden ver el articulo aquí. Desarrollo en Capas .Net (Parte 2) - Capa de Datos

La capa de negocio(BussinesLayer) se comunicara con la capa de presentación, para recibir las solicitudes y presentar los resultados, y con la capa de datos  para almacenar o recuperar datos de la base de datos.

Algo que seguro a mas de uno les traerá molestias de esta capa de negocio sera que la mayoría de las operaciones  serán un pasamano, ya que esta retorna las operaciones de la capa de datos y las devolverá en la capa de presentación, pero no siempre sera así en otros casos se vera la importancia de esta capa sobre todo en aplicaciones complejas.

Empecemos agregando una clase llamada AlumnoBL.
    public class AlumnoBL
    {
        public static List<Alumno> CargarAlumnos()
        {
            return AlumnoDAL.CargarAlumnos();
        }

        public static Alumno IdAlumno(int id)
        {
            return AlumnoDAL.IdAlumno(id);
        }

        public static Alumno Save(Alumno alum)
        {
            if (AlumnoDAL.Existe(alum.AluId))
                return AlumnoDAL.UpdateAlumno(alum);
            else
                return AlumnoDAL.CreateAlumno(alum);          
        }
    }  
Dentro de la clase tenemos los siguientes métodos.
CargarAlumnos() Este método retorna  todos los registros de la tabla Alumno.
IdAlumno() Este metodo retorna los datos de un alumno por medio del id.
Save() Este método valida si el registro existe por medio del id y dependiendo de esto actualiza o agrega un registro.

Ahora agreguemos una clase llamada MateriaBL.
 
    public class MateriaBL
    {
        public static List<Materia> CargarMaterias()
        {
            return MateriaDAL.CargarMaterias();
        }
    } 
Dentro de esta clase solo tenemos un método CargarMaterias() que lo único que hace es retornar todos los registros de la tabla materia.

Ahora agreguemos una clase llamada NotaBL.
 
    public class NotaBL
    {
        public static Nota IdNota(int id)
        {
            return NotaDAL.IdNota(id);
        }

        public static bool CreateNota(Nota not)
        {
            if (NotaDAL.Existe(not.AluId, not.MatId))
                return true;
            else
            {
                NotaDAL.CreateNota(not);
                return false;
            }
        }

        public static bool UpdateNota(Nota not)
        {
            if (NotaDAL.Existe(not.AluId, not.MatId))
            {
                NotaDAL.UpdateNota(not);
                return true;
            }
            else
            {
                return false;
            }
        }
    } 
Dentro de esta clase encontramos los siguientes métodos.
IdNota() Este método lo que hace es retornar los datos datos de un registro por medio del id.
CreateNota() Este método valida si un registro existe por medio del id del alumno y el id de la materia si existe retorna true, y si no existe crea el registro y retorna false. Validamos si el registro no existe para que un alumno solo pueda agregar una nota por materia..
UpdateNota() Este método igual que el anterior valida si el registro existe por medio del id del alumno y id de la materia solo que si el registro existe actualizamos el registro y retornamos true, y si no existe retornamos false.

Ahora agreguemos una clase llamada NotaAlumnoBL.
 
    public class NotaAlumnoBL
    {
        public static  List<NotaAlumno> CargarNotas()
        {
            return NotaAlumnoDAL.CargarNotas();
        }

        public static  List<NotaAlumno> NotasAlumno(int id)
        {
            return NotaAlumnoDAL.NotasAlumno(id);
        }
    } 
Dentro de esta clase encontramos los siguientes métodos.
CargarNotas() este método retorna todos los registros de la tabla nota.
NotasAlumno() este método retorna todas las notas de un alumno es por eso que hacemos uso del id del alumno para solo devolver solo las notas de un alumno.

Importante que dentro de cada clase que agregamos a nuestra capa de negocio(BussinesLayer) necesitamos  agregar referencias hacia las capas DataAcces Entities.
using DataAcces;
using Entities; 

Eso seria todo en nuestra capa de negocio(BussinesLayer) al final nuestro proyecto quedara de la siguiente manera.

Proyecto


Descargar Proyecto C#

Descargar Proyecto VB.Net

En el próximo y ultimo articulo desarrollaremos nuestra capa de presentación.
Desarrollo en Capas .Net (Parte 4) - Capa Presentacion

Desarrollo en Capas .Net (Parte 2) - Capa de Datos

domingo, 21 de octubre de 2012

En el articulo anterior  creamos nuestro modelo EDMX de nuestra base de datos y también creamos nuestras clases entidades  y las dividimos en una capa aparte llamada Entities.

Pueden ver el primer articulo aquí.
Desarrollo en Capas .Net(Parte 1)

 Pues bien en este segundo articulo desarrollaremos el código que tendrá nuestra capa de datos(DataAcces).

En la capa de datos(DataAcces) es donde tendremos todas las query a nuestra base de datos.

Antes de empezar a programar en nuestra capa de datos  primero agregaremos una clase llamada NotaAlumno en nuestra capa Entities(ya veremos para que nos servira).
   
public class NotaAlumno
{
    public int NotId { get; set; }
    public string AluNombre { get; set; }
    public string MatNombre { get; set; }
    public decimal NotNota { get; set; }
}
Entonces nuestra capa Entities nos quedara de la siguiente manera.

Entities


Como pueden observar nuestra capa Entities tendrá nuestras clases entidades que generamos en el articulo anterior y la nueva clase que acabamos de agregar.

Ahora si empecemos con el código que tendrá nuestra capa de datos(DataAcces) lo que aremos es que por cada clase entidad agregaremos una clase a nuestra capa de datos(DataAcces)  y dentro de estas tendremos las diferentes query a nuestra base de datos.

Agreguemos la primera clase que se llamara AlumnoDAL.
    public class AlumnoDAL
    {
        public static List<Alumno> CargarAlumnos()
        {
            using (EstudiantesEntities bd = new EstudiantesEntities())
            {
                return bd.Alumno.ToList();
            }
        }

        public static bool Existe(int id)
        {
            using (EstudiantesEntities bd = new EstudiantesEntities())
            {
                var query = (from al in bd.Alumno where al.AluId == id select al).Count();
                if (query == 0)
                    return false;
                else
                    return true;
            }
        }

        public static Alumno IdAlumno(int id)
        {
            Alumno alum = new Alumno();
            using (EstudiantesEntities bd = new EstudiantesEntities())
            {
                var query = (from al in bd.Alumno
                             where al.AluId == id
                             select al).Single();

                alum.AluId = query.AluId;
                alum.AluNombre = query.AluNombre;
                alum.AluApellido = query.AluApellido;
                alum.AluEdad = query.AluEdad;
                alum.AluDireccion = query.AluDireccion;
            }
            return alum;
        }

        public static Alumno CreateAlumno(Alumno alum)
        {
            using (EstudiantesEntities bd = new EstudiantesEntities())
            {
                Alumno al = new Alumno();
                al.AluNombre = alum.AluNombre;
                al.AluApellido = alum.AluApellido;
                al.AluEdad = alum.AluEdad;
                al.AluDireccion = alum.AluDireccion;
                bd.Alumno.Add(al);
                bd.SaveChanges();
                alum.AluId = al.AluId;
            }
            return alum;
        }

        public static Alumno UpdateAlumno(Alumno alum)
        {
            using (EstudiantesEntities bd = new EstudiantesEntities())
            {
                var query = (from al in bd.Alumno
                             where al.AluId == alum.AluId
                             select al).Single();

                query.AluNombre = alum.AluNombre;
                query.AluApellido = alum.AluApellido;
                query.AluEdad = alum.AluEdad;
                query.AluDireccion = alum.AluDireccion;
                bd.SaveChanges();
            }
            return alum;
        }
        
    }
Dentro de esta clase tenemos una serie de métodos que ahorita explicare.
CargarAlumnos() Este método lo único que hace es retornar todos los registros de la tabla Alumno.
Existe() Este método se encarga de comprobar si un alumno existe por medio del id retorna false si no existe y true si ya existe.
IdAlumno() Este método lo que hace es retornar los datos de un alumno también por medio del id.
CreateAlumno() Este método agrega un nuevo alumno a nuestra base de datos y luego de agregarlo retornamos la entidad osea el alumno agregado.
UpdateAlumno() Este método actualiza un alumno utilizamos el id para actualizar los datos y luego también retornamos la entidad osea el alumno actualizado.

Ahora agreguemos una clase llamada NotaDal.
    public class NotaDal
    {
        public static bool Existe(int idalum, int idmat)
        {
            using (EstudiantesEntities bd = new EstudiantesEntities())
            {
                var query = (from not in bd.Nota where not.AluId == idalum && not.MatId == idmat select not).Count();
                if (query == 0)
                    return false;
                else
                    return true;
            }
        }

        public static Nota IdNota(int id)
        {
            Nota not = new Nota();
            using (EstudiantesEntities bd = new EstudiantesEntities())
            {
                var query = (from n in bd.Nota
                             where n.NotId == id 
                             select n).Single();

                not.NotId = query.NotId;
                not.AluId = query.AluId;
                not.MatId = query.MatId;
                not.NotNota = query.NotNota;
            }
            return not;
        }

        public static Nota CreateNota(Nota not)
        {
            using (EstudiantesEntities bd = new EstudiantesEntities())
            {
                Nota n = new Nota();
                n.AluId = not.AluId;
                n.MatId = not.MatId;
                n.NotNota = not.NotNota;
                bd.Nota.Add(n);
                bd.SaveChanges();
                not.NotId = n.NotId;
            }
            return not;
        }

        public static Nota UpdateNota(Nota not)
        {
            using (EstudiantesEntities bd = new EstudiantesEntities())
            {
                var query = (from n in bd.Nota
                             where n.NotId == not.NotId 
                             select n).Single();

                query.AluId = not.AluId;
                query.MatId = not.MatId;
                query.NotNota = not.NotNota;
                bd.SaveChanges();
            }
            return not;
        }
    }
Dentro de esta clase encontramos los siguientes métodos.
Existe() Este método se encargara de comprobar si una nota ya existe por medio del id del alumno y el id de la materia este método nos ayudara para que un alumno solo pueda agregar una nota por materia.
IdNota() Este método lo que hace es retornar los datos datos de un registro por medio del id.
CreateNota()  Este método agrega un registro a la tabla nota  y luego  retornamos la entidad osea el registro agregado.
UpdateNota() Este método actualiza una nota utilizamos el id para actualizar los datos y luego también retornamos la entidad osea el registro actualizado.

Ahora agreguemos una clase llamada MateriaDal.
.
    public class MateriaDal
    {
        public static List<Materia> CargarMaterias()
        {
            using (EstudiantesEntities bd = new EstudiantesEntities())
            {
                return bd.Materia.ToList();
            }
        }
    }
Dentro de esta clase solo tenemos un método CargarMaterias() que lo único que hace es retornar todos los registros de la tabla materia.

Ahora agreguemos una clase llamada NotaAlumnoDal.
    public class NotaAlumnoDal
    {
        public static List<NotaAlumno> CargarNotas()
        {
            using (EstudiantesEntities bd = new EstudiantesEntities())
            {
                var query = from not in bd.Nota
                            select new NotaAlumno
                            {
                                NotId = not.NotId,
                                AluNombre = not.Alumno.AluNombre,
                                MatNombre = not.Materia.MatNombre,
                                NotNota = not.NotNota
                            };
                return query.ToList();
            }
        }

        public static List<NotaAlumno> NotasAlumno(int id)
        {
            using (EstudiantesEntities bd = new EstudiantesEntities())
            {
                var query = from not in bd.Nota
                            where not.AluId == id
                            select new NotaAlumno
                            {
                                NotId = not.NotId,
                                AluNombre = not.Alumno.AluNombre,
                                MatNombre = not.Materia.MatNombre,
                                NotNota = not.NotNota
                            };

                return query.ToList();
            }
        }
    }
Dentro de esta clase encontramos los siguientes métodos.
CargarNotas() este método retorna todos los registros de la tabla nota.
NotasAlumno() este método retorna todas las notas de un alumno es por eso que hacemos uso del id del alumno para solo devolver solo las notas de un alumno.
En esta clase  hicimos uso de la clase que agregamos a nuestra capa Entities llamada NotaAlumno si se fijan en la query que hacemos a la tabla nota hacemos uso de las propiedades de la clase para en vez de que nos muestre el id del alumno y la materia nos muestre el nombre del alumno y de la materia, haciendo también uso de las propiedades de navegación que existen ente las tablas.

Importante que dentro de cada clase que agregamos a nuestra capa de datos(DataAcces) necesitamos el espacio de nombres Entities para poder hacer uso de nuestras clases entidades.
using Entities;

Eso seria todo en nuestra capa de datos, al final nuestro proyecto nos quedara de la siguiente manera.

Proyecto

Resumiendo lo que hicimos agregamos 4 clases(DAL) a nuestra capa de datos(DataAcces) una por cada clase entidad y dentro de estas tenemos las diferentes query hacia la base de datos.

Descargar Proyecto C#

Descargar Proyecto VB.Net

En el próximo articulo desarrollaremos el código de nuestra capa de negocio(BussinesLayer).
Desarrollo en Capas .Net (Parte 3) - Capa de Negocio