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
La clase FacturaDet_Bus contendrá el siguiente código:
Lo siguiente será crear nuestra interfaz de usuario en la capa WinUI.
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:
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.


Excelente explicacion, entendi al 100. Buena onda por el tuto.
ResponderEliminarGracias 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.
ResponderEliminarTe 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