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 ClassEn 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