Tutorial Entity Framework y Linq (Parte 3)

En la Entrada anterior desarrollamos la capa DataAccess de nuestra aplicación en capas, pueden ver la entrada aquí: Parte 2

En la parte 3 desarrollaremos la capa BusinessLayer

Desarrollando la capa BusinessLayer:

Lo primero será agregar 2 clases en la capa BusinessLayer con nombres:

  • FacturaCab_Bus
  • FacturaDet_Bus
La clase FacturaCab_Bus contendrá el siguiente código:

Imports DataAccess
Imports Entities
Public Class FacturaCab_Bus
    Dim data As New FacturaCab_Data
    Public Function RecuperarTodas() As List(Of FacturaCab_Ent)
        Return data.RecuperarTodas()
    End Function

    Public Function BuscarUna(ByVal codigoFactura As Integer) As FacturaCab_Ent
        Return data.BuscarUna(codigoFactura)
    End Function

    Public Function Inserta(ByVal factura As FacturaCab_Ent) As Boolean
        Return data.Inserta(factura)
    End Function

    Public Function Modifica(ByVal factura As FacturaCab_Ent) As Boolean
        Return data.Modifica(factura)
    End Function

    Public Function Elimina(ByVal CodFactura As Integer) As Boolean
        Return data.Elimina(CodFactura)
    End Function
End Class


La clase FacturaDet_Bus contendrá el siguiente código:

Imports DataAccess
Imports Entities
Public Class FacturaDet_Bus
    Dim data As New FacturaDet_Data
    Public Function BuscarUna(ByVal codigoFactura As Integer) As List(Of FacturaDet_Ent)
        Return data.BuscarUna(codigoFactura)
    End Function

    Public Function Inserta(ByVal Detfactura As List(Of FacturaDet_Ent)) As Boolean
        Return data.Inserta(Detfactura)
    End Function

    Public Function Modifica(ByVal Detfactura As List(Of FacturaDet_Ent), ByVal CodFactura As Integer) As Boolean
        Return data.Modifica(Detfactura, CodFactura)
    End Function

    Public Function Elimina(ByVal CodFactura As Integer) As Boolean
        Return data.Elimina(CodFactura)
    End Function
End Class


Lo siguiente será crear nuestra interfaz de usuario en la capa WinUI.


Desarrollando la capa WinUI:

Lo primero será agregar 2 Formularios Windows con nombres:
  • frmFactura_Consulta.vb
  • frmFactura_Mantenimiento.vb
Mas o menos quedaría como las siguientes imágenes


Para la pantalla de Consulta se agregaron:
  • Botón Consultar,
  • Botón Nuevo,
  • Botón Modificar,
  • Botón Eliminar,
  • Botón Salir,
  • DataGridView dgvFacturas

Para la pantalla de mantenimiento, se agregaron:
  • Botón Grabar,
  • Botón Salir,
  • Label IdFactura,
  • Label Fecha,
  • Label Codigo Cliente,
  • Label Valor Total Factura,
  • TextBox IdFactura,
  • DateTimePicker dtpFecha,
  • TextBox CodCliente,
  • TextBox ValorTotal,
  • DataGridView dgvDetalleFact
En el designer del datagridview abrir el "datagridview task" y agregar datasource apuntando hacia la clase FacturaDet_Ent

Ahora en la pantalla de Consulta agregar el siguiente código, no olvidar crear los eventos respectivos de los botones:

Imports BusinessLayer
Imports Entities
Public Class frmFactura_Consulta
    Dim busCab As New FacturaCab_Bus
    Dim busDet As New FacturaDet_Bus
    Dim _factura As New FacturaCab_Ent
    Private Sub btnConsultar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConsultar.Click
        If Me.dgvFacturas.SelectedRows.Count = 0 Then
            MessageBox.Show("No ha seleccionado alguna fila", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        Else
            For Each fila In Me.dgvFacturas.SelectedRows
                _factura = fila.DataBoundItem
            Next

            Dim frm As New frmFactura_Mantenimiento
            frm.setCabFactura(_factura)
            frm.setDetFactura(busDet.BuscarUna(_factura.IdFactura))
            frm.Show()
        End If
    End Sub

    Private Sub frmFactura_Consulta_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        dgvFacturas.DataSource = busCab.RecuperarTodas
    End Sub

    Private Sub btnNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNuevo.Click
        Dim frm As New frmFactura_Mantenimiento
        frm.modo = "Grabar"
        frm.Show()
    End Sub

    Private Sub btnModificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnModificar.Click
        If Me.dgvFacturas.SelectedRows.Count = 0 Then
            MessageBox.Show("No ha seleccionado alguna fila", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End If

        For Each fila In Me.dgvFacturas.SelectedRows
            _factura = fila.DataBoundItem
        Next

        Dim frm As New frmFactura_Mantenimiento
        frm.setCabFactura(_factura)
        frm.setDetFactura(busDet.BuscarUna(_factura.IdFactura))
        frm.modo = "Modificar"
        frm.Show()
    End Sub

    Private Sub btnEliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEliminar.Click
        If Me.dgvFacturas.SelectedRows.Count = 0 Then
            MessageBox.Show("No ha seleccionado alguna fila", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End If

        For Each fila In Me.dgvFacturas.SelectedRows
            _factura = fila.databounditem
        Next

        If busCab.Elimina(_factura.IdFactura) And busDet.Elimina(_factura.IdFactura) Then
            MessageBox.Show("Eliminado con exito")
        Else
            MessageBox.Show("No se pudo eliminar")
        End If
    End Sub

    Private Sub btnSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalir.Click
        Me.Close()
    End Sub
End Class

En la pantalla de Mantenimiento agregar el siguiente código, no olvidar crear los eventos respectivos de los botones:

Imports Entities
Imports BusinessLayer
Public Class frmFactura_Mantenimiento
    'Public Property FactCab As FacturaCab_Ent
    Dim _factCab As New FacturaCab_Ent
    Dim _factDet As New List(Of FacturaDet_Ent)

    Dim busCab As New FacturaCab_Bus
    Dim busDet As New FacturaDet_Bus

    Public modo As String

    Private Sub frmFactura_Mantenimiento_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Select Case modo
            Case "Grabar"
                Me.btnGrabar.Text = "Grabar"
            Case "Modificar"
                Me.btnGrabar.Text = "Modificar"
            Case Else
                Me.btnGrabar.Visible = False
        End Select
    End Sub



    Public Sub setCabFactura(ByVal Cabecera As FacturaCab_Ent)
        txtIdFact.Text = Cabecera.IdFactura.ToString
        txtCodCliente.Text = Cabecera.CodCliente
        dtpFecha.Value = Cabecera.FechaFact
        txtValorTotal.Text = Cabecera.ValorFact.ToString

        _factCab = Cabecera
    End Sub

    Public Sub getCabFactura()
        _factCab.IdFactura = Convert.ToInt32(txtIdFact.Text)
        _factCab.FechaFact = dtpFecha.Value
        _factCab.CodCliente = txtCodCliente.Text
        _factCab.ValorFact = Convert.ToDouble(txtValorTotal.Text)
    End Sub

    Public Sub setDetFactura(ByVal Detalle As List(Of FacturaDet_Ent))
        dgvDetalleFact.DataSource = Detalle
        _factDet = Detalle
    End Sub

    Public Sub getDetFactura()
        For Each row In dgvDetalleFact.Rows
            If Not row.DataBoundItem Is Nothing Then
                _factDet.Add(row.DataBoundItem)
            End If
        Next
    End Sub

#Region "Metodos Privados"
    Public Sub Grabar()
        getCabFactura()
        getDetFactura()
        If (busCab.Inserta(_factCab) And busDet.Inserta(_factDet)) Then
            MessageBox.Show("Grabado exitosamente!", "Aviso")
        Else
            MessageBox.Show("No se grabó", "Error")
        End If
    End Sub

    Public Sub Modifica()
        getCabFactura()
        getDetFactura()

        If (busCab.Modifica(_factCab) And busDet.Modifica(_factDet, _factCab.IdFactura)) Then
            MessageBox.Show("Actualizado exitosamente!", "Aviso")
        Else
            MessageBox.Show("No se actualizó", "Error")
        End If
    End Sub

#End Region

    Private Sub btnGrabar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGrabar.Click
        If modo = "Grabar" Then
            Grabar()
        ElseIf modo = "Modificar" Then
            Modifica()
        End If
    End Sub

    Private Sub btnSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalir.Click
        Me.Close()
    End Sub
End Class


Por último, agregar un Archivo de Configuraciones "App.config" al proyecto WinUI y copiar el connectionString que posee el "App.config" del proyecto DataAccess. Es una linea como esta:



Listo, ahora compila tu solución y ejecutala.

Tendrás una aplicación en capas con Entity Framework y Linq, con las siguientes capacidades:

  • Consultar,
  • Grabar,
  • Modificar,
  • Eliminar.

Este es el Fin del tutorial, recuerden que esto es un ejemplo de lo más básico pero puede servir de guía o ejemplo para nuestros futuros desarrollos.

La fuente se las dejo en mi skydrive el siguiente link: 

http://usheethe.com/dVPT


Comentarios o sugerencias serán bienvenidos.

Comentarios

  1. Excelente explicacion, entendi al 100. Buena onda por el tuto.

    ResponderEliminar
  2. Gracias por tu aporte y esfuerzo, estaba buscando algo asi sencillo y al grano. espero que sigas publicando cosas como esta. agradezco la amabilidad de poner tus codigos.

    ResponderEliminar
  3. Te consulto recomiendas trabajar en capas con EF ? Es que el proyecto que yo llevo, tengo dentro de este varias soluciones, el modelo, contabilidad y la factura, me da problemas la conexion si a veces, que me recomiendas nuevamente te consulto.

    ResponderEliminar

Publicar un comentario