Diseño de Clases
DISEÑO DE LAS CLASES BASICAS PARA LA APLICACIÓN DE INVENTARIOS Para el desarrollo de nuestra aplicación iniciaremos esta semana indicando el funcionamiento de las clases básicas que utilizaremos en el proceso de facturación. Estas clases son: ClsBase MontoEscrito TotalesFacturas
¿Cuánto Sabes? En el colegio hay dos actividades complement arias: un grupo de teatro, que se reúne cada 4 días para ensayar, y un equipo que elabora una revista, y se reúne cada 5 días. ¿Cada cuántos días coinciden los dos grupos? Si el día 30 de octubre coincidieron , ¿Cuándo lo volverán a hacer?
Antes de iniciar el proceso de la creación de clases realizaremos rápidamente el diseño de nuestro prototipo de formulario para la facturación.
Como ustedes observan vamos a iniciar con el diseño de nuestra grilla de detalles. Esta constara de: DgvDetalles - Nombre de la grilla LblMonto – Nombre de la etiqueta donde se insertara el valor del total en letras LblSubtotal – en esta etiqueta se calculara la suma de los subtotales LblIva – En esta etiqueta se calculara el porcentaje del iva de la tabla de detalles LblTotal – En esta etiqueta aparecerá el resultado del subtotal mas el iva
Elaborado por Ing. Gustavo Alberto Atehortúa Rico Visita mi pagina web: www.cvtvchannel.com
Página 1
Inicialmente en nuestro proyecto comenzamos con la clase ClsBase simplemente como la conexión a la base de datos. Ahora Imports System Imports System.Data Imports System.Data.OleDb Public Class ClsBase Public StrCadena As String = _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\Facturacion\DbMegaproyectos.mdb;" & _ "Persist Security Info=False " Private CnMegaproyectos As New OleDbConnection(StrCadena)
Private Sub LoadTextBox(ByVal dgv As DataGridView, ByVal ds As DataSet, ByVal nameTab As String, ByVal numcol As Int16, ByVal NameColumn As String, ByVal widthCol As Int16, ByVal frmt As String, ByVal align As Integer) Try ' formatear grilla 'alineacion de caracteres bottonLeft = 256, bottonCenter=512 BottonRigth=1024 Dim DgvTextBox As New DataGridViewTextBoxColumn Dim dt As DataTable = ds.Tables(nameTab) With DgvTextBox .DataPropertyName = dt.Columns(numcol).ColumnName .HeaderText = NameColumn .Width = widthCol .DefaultCellStyle.Format = frmt .DefaultCellStyle.Alignment = align End With dgv.Columns.Add(DgvTextBox) Catch ex As Exception MessageBox.Show(ex.Message & " !!Error!! al cargar format de text box clase ClsBase") End Try End Sub Private Function LoadDataset(ByVal ds As DataSet, ByVal nomTab As String, ByVal strSelect As String) As DataSet Try Dim Cmd As New OleDb.OleDbCommand(strSelect, CnMegaproyectos) Dim Da As New OleDbDataAdapter(Cmd) Da.Fill(ds, nomTab) Catch ex As Exception MessageBox.Show(ex.Message & " !!Error!! al cargar data set clase ClsBase") End Try Return ds End Function Private Sub LoadComboBox(ByVal dgv As DataGridView, ByVal ds As DataSet, ByVal nameTab As String, ByVal numCol As Int16, ByVal ds2 As DataSet, ByVal dispMemb As String, ByVal valMemb As String, ByVal TitColumn As String, ByVal widthCol As Int16) Try Dim DgvComboBox As New DataGridViewComboBoxColumn Dim dt As DataTable = ds.Tables(nameTab) With DgvComboBox .DataPropertyName = dt.Columns(numCol).ColumnName .DataSource = ds2 .DisplayMember = dispMemb .ValueMember = valMemb .Width = widthCol
Elaborado por Ing. Gustavo Alberto Atehortúa Rico Visita mi pagina web: www.cvtvchannel.com
Página 2
.DropDownWidth = 400 .HeaderText = TitColumn End With dgv.Columns.Add(DgvComboBox) Catch ex As Exception MessageBox.Show(ex.Message & " !!Error!! al cargar combo box clase ClsBase") End Try End Sub Public Sub LoadColumnasDgFacturasDet(ByVal dg As DataGridView, ByVal ds As DataSet, ByVal dsArtic As DataSet) Try Dim strSelect As String = "SELECT * FROM TbFacturasClientesDet WHERE FacturaClienteDetID=0" Dim cmd As New OleDb.OleDbCommand(strSelect, CnMegaproyectos) Dim da As New OleDbDataAdapter(cmd) LoadDataset(dsArtic, "TbArticulos", "SELECT TbArticulos.ArticuloID, TbArticulos.Descripcion, TbArticulos.UnidadMedida, TbArticulos.LineaID, TbArticulos.Precio FROM TbArticulos ORDER BY TbArticulos.Descripcion") ds.Clear() da.Fill(ds, "TbFacturasClientesDet") dg.AutoGenerateColumns = False dg.Columns.Clear() dg.DataSource = ds dg.DataMember = "TbFacturasClientesDet" LoadComboBox(dg, ds, "TbFacturasClientesDet", 2, dsArtic, "TbArticulos.Descripcion", "TbArticulos.ArticuloID", "Descripcion", 400) LoadTextBox(dg, ds, "TbFacturasClientesDet", 3, "Unidad", 80, "", 256) LoadTextBox(dg, ds, "TbFacturasClientesDet", 4, "Cantidad", 90, "###,###", 1024) LoadTextBox(dg, ds, "TbFacturasClientesDet", 5, "Precio", 110, "###,###", 1024) LoadTextBox(dg, ds, "TbFacturasClientesDet", 9, "SubTotal", 110, "###,###", 1024) LoadTextBox(dg, ds, "TbFacturasClientesDet", 7, "% Iva", 80, "", 1024) Catch ex As Exception MessageBox.Show(ex.Message & " !!Error!! al cargar Columnas de la grilla detalles clase ClsBase") End Try End Sub Public Function CargarArticulos() As DataSet Dim ds As New DataSet Try Dim strSelect As String = "SELECT * FROM TbArticulos" Dim cmd As New OleDb.OleDbCommand(strSelect, CnMegaproyectos) Dim da As New OleDbDataAdapter(cmd) da.Fill(ds, "TbArticulos") Catch ex As Exception MessageBox.Show(ex.Message & " !!Error!! al cargar articulos clase ClsBase") End Try Return ds End Function Public Function CargarArticulos(ByVal id As Long) As DataSet Dim ds As New DataSet Try Dim strSelect As String = "SELECT * FROM TbArticulos WHERE ArticuloID = " & id Dim cmd As New OleDb.OleDbCommand(strSelect, CnMegaproyectos) Dim da As New OleDbDataAdapter(cmd) da.Fill(ds, "TbArticulos") Catch ex As Exception MessageBox.Show(ex.Message & " !!Error!! al cargar articulos clase ClsBase") End Try Return ds End Function
Elaborado por Ing. Gustavo Alberto Atehortúa Rico Visita mi pagina web: www.cvtvchannel.com
Página 3
Public Sub MoverCamposArticulosGrillaFactCliDet(ByVal dg As DataGridView, ByVal fila As Int16, ByVal columna As Int16, ByVal id As Long) Try ' las posiciones que aparecen son dentro de la grilla definida por nosotros en el metodo loadcolumnas dg facturas det y siempre se inicia en 0
Dim ds As New DataSet ds = CargarArticulos(id) dg.Item(1, fila).Value = ds.Tables("TbArticulos").Rows(0).Item("UnidadMedida") dg.Item(3, fila).Value = ds.Tables("TbArticulos").Rows(0).Item("Precio") dg.Item(5, fila).Value = ds.Tables("TbArticulos").Rows(0).Item("PorcentajeIva") If Not IsDBNull(dg.Item(0, fila).Value) Then CalcularGrillaFactCliDet(dg, fila, columna) End If Catch ex As Exception MessageBox.Show(ex.Message & " !!Error!! al mover campos articulos grillas") End Try End Sub ' este metodo me permite realizar los calculos (Ejemplo: subtotal de la columna 4 es igual a cantidad de la 2 por el precio de la 3
Public Sub CalcularGrillaFactCliDet(ByVal dg As DataGridView, ByVal Fila As Int16, ByVal Columna As Int16) Try If IsDBNull(dg.Item(2, Fila).Value) Then Exit Sub dg.Item(4, Fila).Value = dg.Item(2, Fila).Value * dg.Item(3, Fila).Value Catch ex As Exception MessageBox.Show(ex.Message & " !!Error!! calculos de grilla") End Try End Sub Public Function TotalizarGrillaFactCliDet(ByVal dg As DataGridView) As TotalesFacturas Dim oTotales As New TotalesFacturas If Not dg.Rows.Count > 0 Then Return oTotales Dim filaw As DataGridViewRow oTotales.TotalIva = 0 oTotales.PorcIva = 0 oTotales.TotalFactura = 0 oTotales.TotalDescuento = 0 For Each filaw In dg.Rows() ' suma de subtotales If Not IsDBNull(filaw.Cells(4).Value) Then oTotales.TotalFactura += filaw.Cells(4).Value If Not IsDBNull(filaw.Cells(5).Value) Then If filaw.Cells(5).Value > 0 Then oTotales.PorcIva = filaw.Cells(5).Value End If End If End If 'If Not IsDBNull(filaw.Cells(6).Value) Then ' If filaw.Cells(6).Value > 0 Then ' oTotales.PorcDescuento = filaw.Cells(6).Value ' oTotales.TotalDescuento += filaw.Cells(4).Value * (oTotales.PorcDescuento / 100) ' End If 'End If Next oTotales.TotalIva = oTotales.TotalFactura - (oTotales.TotalFactura / (1 + (oTotales.PorcIva / 100))) Return oTotales End Function
End Class Elaborado por Ing. Gustavo Alberto Atehortúa Rico Visita mi pagina web: www.cvtvchannel.com
Página 4
Este es un programa descargado de internet que convierte el valor escrito en letras Option Strict Off Option Explicit On Public Class MontoEscrito Public Function NroEnLetras(ByVal curNumero As Double, Optional ByRef blnO_Final As Boolean = True) As String 'Devuelve un número expresado en letras. 'El parámetro blnO_Final se utiliza en la recursión para saber si se debe colocar 'la "O" final cuando la palabra es UN(O) Dim dblCentavos As Double Dim lngContDec As Integer Dim lngContCent As Integer Dim lngContMil As Integer Dim lngContMillon As Integer Dim strNumLetras As String Dim strNumero As Object Dim strDecenas As Object Dim strCentenas As Object Dim blnNegativo As Boolean Dim blnPlural As Boolean If Int(curNumero) = 0.0# Then strNumLetras = "CERO" End If 'UPGRADE_WARNING: Array has a new behavior. Click for more: 'mshelp://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1041"' 'UPGRADE_WARNING: Couldn't resolve default property of object strNumero. Click for more: 'mshelp://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"' strNumero = New Object() {vbNullString, "UN", "DOS", "TRES", "CUATRO", "CINCO", "SEIS", "SIETE", "OCHO", "NUEVE", "DIEZ", "ONCE", "DOCE", "TRECE", "CATORCE", "QUINCE", "DIECISEIS", "DIECISIETE", "DIECIOCHO", "DIECINUEVE", "VEINTE"} 'UPGRADE_WARNING: Array has a new behavior. Click for more: 'mshelp://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1041"' 'UPGRADE_WARNING: Couldn't resolve default property of object strDecenas. Click for more: 'mshelp://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"' strDecenas = New Object() {vbNullString, vbNullString, "VEINTI", "TREINTA", "CUARENTA", "CINCUENTA", "SESENTA", "SETENTA", "OCHENTA", "NOVENTA", "CIEN"} 'UPGRADE_WARNING: Array has a new behavior. Click for more: 'mshelp://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1041"' 'UPGRADE_WARNING: Couldn't resolve default property of object strCentenas. Click for more: 'mshelp://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"' strCentenas = New Object() {vbNullString, "CIENTO", "DOSCIENTOS", "TRESCIENTOS", "CUATROCIENTOS", "QUINIENTOS", "SEISCIENTOS", "SETECIENTOS", "OCHOCIENTOS", "NOVECIENTOS"} If curNumero < 0.0# Then blnNegativo = True curNumero = System.Math.Abs(curNumero) End If If Int(curNumero) <> curNumero Then dblCentavos = System.Math.Abs(curNumero - Int(curNumero)) curNumero = Int(curNumero) End If
Elaborado por Ing. Gustavo Alberto Atehortúa Rico Visita mi pagina web: www.cvtvchannel.com
Página 5
Do While curNumero >= 1000000.0# lngContMillon = lngContMillon + 1 curNumero = curNumero - 1000000.0# Loop Do While curNumero >= 1000.0# lngContMil = lngContMil + 1 curNumero = curNumero - 1000.0# Loop Do While curNumero >= 100.0# lngContCent = lngContCent + 1 curNumero = curNumero - 100.0# Loop If Not (curNumero > 10.0# And curNumero <= 20.0#) Then Do While curNumero >= 10.0# lngContDec = lngContDec + 1 curNumero = curNumero - 10.0# Loop End If If lngContMillon > 0 Then If lngContMillon >= 1 Then 'si el número es >1000000 usa recursividad strNumLetras = NroEnLetras(lngContMillon, False) If Not blnPlural Then blnPlural = (lngContMillon > 1) lngContMillon = 0 End If 'UPGRADE_WARNING: Couldn't resolve default property of object strNumero(lngContMillon). Click for more: 'mshelp://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"' strNumLetras = Trim(strNumLetras) & strNumero(lngContMillon) & " MILLON" & IIf(blnPlural, "ES ", " ") End If If lngContMil > 0 Then If lngContMil >= 1 Then 'si el número es >100000 usa recursividad strNumLetras = strNumLetras & NroEnLetras(lngContMil, False) lngContMil = 0 End If 'UPGRADE_WARNING: Couldn't resolve default property of object strNumero(lngContMil). Click for more: 'mshelp://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"' strNumLetras = Trim(strNumLetras) & strNumero(lngContMil) & " MIL " End If If lngContCent > 0 Then If lngContCent = 1 And lngContDec = 0 And curNumero = 0.0# Then strNumLetras = strNumLetras & "CIEN" Else 'UPGRADE_WARNING: Couldn't resolve default property of object strCentenas(). Click for more: 'mshelp://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"' strNumLetras = strNumLetras & strCentenas(lngContCent) & " " End If End If If lngContDec >= 1 Then If lngContDec = 1 Then 'UPGRADE_WARNING: Couldn't resolve default property of object strNumero(). Click for more: 'mshelp://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"' strNumLetras = strNumLetras & strNumero(10) Else 'UPGRADE_WARNING: Couldn't resolve default property of object strDecenas(). Click for more: 'mshelp://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"' strNumLetras = strNumLetras & strDecenas(lngContDec)
Elaborado por Ing. Gustavo Alberto Atehortúa Rico Visita mi pagina web: www.cvtvchannel.com
Página 6
End If If lngContDec >= 3 And curNumero > 0.0# Then strNumLetras = strNumLetras & " Y " End If Else If curNumero >= 0.0# And curNumero <= 20.0# Then 'UPGRADE_WARNING: Couldn't resolve default property of object strNumero(). Click for more: 'mshelp://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"' strNumLetras = strNumLetras & strNumero(curNumero) If curNumero = 1.0# And blnO_Final Then strNumLetras = strNumLetras & "O" End If If dblCentavos > 0.0# Then strNumLetras = Trim(strNumLetras) & " CON " & Format(CShort(dblCentavos * 100.0#), "00") & "/100" End If NroEnLetras = strNumLetras Exit Function End If End If If curNumero > 0.0# Then 'UPGRADE_WARNING: Couldn't resolve default property of object strNumero(). Click for more: 'mshelp://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"' strNumLetras = strNumLetras & strNumero(curNumero) If curNumero = 1.0# And blnO_Final Then strNumLetras = strNumLetras & "O" End If End If If dblCentavos > 0.0# Then strNumLetras = strNumLetras & " PESOS CON " & Format(CShort(dblCentavos * 100.0#), "00") & "/100" Else strNumLetras = strNumLetras ' & " PESOS " End If NroEnLetras = IIf(blnNegativo, "(" & strNumLetras & ")", strNumLetras) End Function
End Class
Elaborado por Ing. Gustavo Alberto Atehortúa Rico Visita mi pagina web: www.cvtvchannel.com
Página 7
Aquí debemos definir las propiedades, atributos de la clase.
Public Class TotalesFacturas ' definicion de los atributos de la clase Private _PorcIva As Double Private _TotalIva As Double Private _TotalFactura As Double Private _TotalAnuladas As Double Private _TotalIvaAnuladas As Double Private _TotalDescuento As Double Private _PorcDescuento As Double Private _TotalEfectivo As Double Private _TotalCheques As Double Private _TotalPendientePago As Double #Region "constructor sin parametros y con parametros, recarga de metodos" Public Sub New() End Sub Public Sub New(ByVal totalIva As Double, ByVal totalFactura As Double, ByVal porcIva As Double, ByVal totalAnuladas As Double, ByVal totalIvaAnuladas As Double, ByVal totalDescuento As Double, ByVal porcDescuento As Double, ByVal totalEfectivo As Double, ByVal totalCheques As Double, ByVal totalPendientePago As Double) _TotalIva = totalIva _TotalFactura = totalFactura _PorcIva = porcIva _TotalAnuladas = totalAnuladas _TotalIvaAnuladas = totalIvaAnuladas _TotalDescuento = totalDescuento _PorcDescuento = porcDescuento _TotalEfectivo = totalEfectivo _TotalCheques = totalCheques _TotalPendientePago = totalPendientePago End Sub #End Region ' definicion de las propiedades de la clase Public Property PorcIva() As Double Get Return _PorcIva End Get Set(ByVal value As Double) _PorcIva = value End Set End Property Public Property TotalIva() As Double Get Return _TotalIva End Get Set(ByVal value As Double) _TotalIva = value End Set End Property Public Property TotalFactura() As Double Get Return _TotalFactura End Get Set(ByVal value As Double) _TotalFactura = value End Set End Property
Elaborado por Ing. Gustavo Alberto Atehortúa Rico Visita mi pagina web: www.cvtvchannel.com
Página 8
Public Property TotalAnuladas() As Double Get Return _TotalAnuladas End Get Set(ByVal value As Double) _TotalAnuladas = value End Set End Property Public Property TotalIvaAnuladas() As Double Get Return _TotalIvaAnuladas End Get Set(ByVal value As Double) _TotalIvaAnuladas = value End Set End Property Public Property TotalDescuento() As Double Get Return _TotalDescuento End Get Set(ByVal value As Double) _TotalDescuento = value End Set End Property Public Property PorcDescuento() As Double Get Return _PorcDescuento End Get Set(ByVal value As Double) _PorcDescuento = value End Set End Property Public Property TotalEfectivo() As Double Get Return _TotalEfectivo End Get Set(ByVal value As Double) _TotalEfectivo = value End Set End Property Public Property TotalCheques() As Double Get Return _TotalCheques End Get Set(ByVal value As Double) _TotalCheques = value End Set End Property Public Property TotalPendientePago() As Double Get Return _TotalPendientePago End Get Set(ByVal value As Double) _TotalPendientePago = value End Set End Property
End Class
Elaborado por Ing. Gustavo Alberto Atehortúa Rico Visita mi pagina web: www.cvtvchannel.com
Página 9
Public Class FrmFacturacion Private oClase As New ClsBase Private DsDetalles As New DataSet Private DsArticulos As New DataSet Private Fila As Integer Private columna As Integer Private oTotales As New TotalesFacturas Private Procesar As Boolean
Private Sub FrmFacturacion_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load DsArticulos = oClase.CargarArticulos() oClase.LoadColumnasDgFacturasDet(DgvDetalles, DsDetalles, DsArticulos) End Sub
Private Sub DgFacturaDet_CellEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DgvDetalles.CellEnter Fila = e.RowIndex columna = e.ColumnIndex End Sub Private Sub DgFacturaDet_CellValidated(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DgvDetalles.CellValidated Dim oClase As New ClsBase If Fila <> e.RowIndex Or columna <> e.ColumnIndex Then MessageBox.Show("Error en Indices Revisar") : Exit Sub oClase.CalcularGrillaFactCliDet(DgvDetalles, Fila, columna) oTotales = oClase.TotalizarGrillaFactCliDet(DgvDetalles) Dim oMonto As New MontoEscrito LblMonto.Text = oMonto.NroEnLetras(oTotales.TotalFactura - oTotales.TotalDescuento, True) & " Pesos" LblSubTotal.Text = Format((oTotales.TotalFactura), "$###,###,###") LblDescuento.Text = Format(oTotales.TotalDescuento, "$###,###,###") LblTotal.Text = Format(oTotales.TotalFactura - oTotales.TotalDescuento, "$###,###,###") LblTotalIva.Text = Format(oTotales.TotalIva, "$###,###,###") If DgvDetalles.RowCount > 0 Then BtnEliminarFila.Visible = True Else BtnEliminarFila.Visible = False End If End Sub Private Sub DgvDetalles_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DgvDetalles.EditingControlShowing If Not TypeOf e.Control Is DataGridViewComboBoxEditingControl Then Procesar = False Return Else Procesar = True End If ' Referenciamos el control TextBox subyacente en la celda actual. ' Dim cellComboBox As DataGridViewComboBoxEditingControl = TryCast(e.Control, DataGridViewComboBoxEditingControl)
Elaborado por Ing. Gustavo Alberto Atehortúa Rico Visita mi pagina web: www.cvtvchannel.com
Página 10
' Añadimos un controlador de evento. ' 'AddHandler cellComboBox.SelectedValueChanged, _ 'AddressOf SelectedValueChanged AddHandler cellComboBox.SelectedIndexChanged, AddressOf SelectedIndexChanged End Sub Private Sub SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) ' Referenciamos el control ComboBox ' Dim combo As ComboBox = DirectCast(sender, ComboBox) If combo.SelectedIndex <> -1 Then Try Dim oClase As New ClsBase oClase.MoverCamposArticulosGrillaFactCliDet(DgvDetalles, Fila, columna, combo.SelectedValue) Catch ex As Exception End Try End If ' Eliminamos el controlador de eventos RemoveHandler combo.SelectedValueChanged, AddressOf SelectedIndexChanged End Sub Private Sub BtnEliminarFila_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnEliminarFila.Click If DgvDetalles.SelectedRows.Count > 0 AndAlso Not DgvDetalles.SelectedRows(0).Index = DgvDetalles.Rows.Count - 1 Then DgvDetalles.Rows.RemoveAt(DgvDetalles.SelectedRows(0).Index) End If End Sub
End Class
Elaborado por Ing. Gustavo Alberto Atehortúa Rico Visita mi pagina web: www.cvtvchannel.com
Página 11