Sistema de Almacén Visual Basic
-
Upload
washington-espirilla-torres -
Category
Documents
-
view
52 -
download
0
Transcript of Sistema de Almacén Visual Basic
Sistema de Almacn Visual Basic (Parte 1)Creamos nuestro proyecto:
Organizamos nuestro proyecto:
Ahora agregamos varios formularios y un modulo como se ve en la imagen:
En el siguiente ejercicio disearemos la base de datos.
Creacin de la Base de datos
Creamos una base de datos con Microsoft Access, con las siguientes tablas:users
Nombre del CampoTipo de DatosDescripcin
user_loginTexto(50)Nombre de inicio de sesin
user_passwordTexto(255)Contrasea del usuario
nombreTexto(255)Nombre del usuario
activoSi/NoSi est activo
administrarSi/NoSi puede administrar el sistema
reportesSi/NoSi puede ver reportes
articulos
Nombre del CampoTipo de DatosDescripcin
id_articuloTexto(50)Id del artculo
articuloTexto(255)Nombre del artculo
localizacionTexto(255)Ubicacin en el almacn
grupoTexto(255)Grupo del articulo
unidad_medidaTexto(255)Unidad de medida
existenciaNmero(Doble)Existencia
cant_minNmero(Doble)Existencia mnima
costo_promedioNmero(Doble)Costo promedio
entradas
Nombre del CampoTipo de DatosDescripcin
id_entradaAutonumricoId de la entrada
fecha_registroFecha/HoraFecha de registro en el sistema
fecha_entradaFecha/HoraFecha de la entrada en el almacen
proveedorTexto(255)Nombre del proveedor
folio_facturaTexto(50)Folio de la factura de compra
fecha_facturaFecha/HoraFecha de la factura
user_loginTexto(50)Usuario que registra la entrada
entradas_detalle
Nombre del CampoTipo de DatosDescripcin
id_entrada_detalleAutonumricoId del detalle de la entrada
id_entradaNmeroId de la entrada
id_articuloTexto(50)Id del artculo
cantidadNmero(Doble)Cantidad que entra al almacn
precio_compraNmero(Doble)Precio de compra (segun factura)
ivaNmero(Doble)Impuesto que cobra el proveedor (en porcentaje)
salidas
Nombre del CampoTipo de DatosDescripcin
id_salidaAutonumricoId de la salida
fecha_registroFecha/HoraFecha de registro en el sistema
fecha_salidaFecha/HoraFecha de la salida
responsableTexto(255)Responsable de la salida
user_loginTexto(50)Usuario que registra la salida
salidas_detalle
Nombre del CampoTipo de DatosDescripcin
id_salida_detalleAutonumricoId del detalle de la salida
id_salidaNmeroId de la salida
id_articuloTexto(50)Id del artculo
cantidadNmero(Doble)Cantidad que sale
Una vez que diseamos nuestras tablas, las relacionamos. Las relaciones deben de quedar as:
Especificaciones tcnicas:
Todos los nombres de los campos son con minsculas. Esto no afecta en la programacin, pero deseamos poder llevar un estndar en todo lo que vayamos desarrollando.
Deber respetar los tipos de datos, eso nos evitar posibles errores en tiempo de ejecucin.
Sistema de Almacn Visual Basic (Parte 3)
Entradas al AlmacnDiseo de la pantallaEmpezaremos diseando la pantalla de entradas (formulario frmEntrada), la apariencia debe de quedar mas o menos as:
A continuacion una tabla descriptiva con los nombres de los objetos:ObjetoPropiedadValor
LabelNamelblFechaEntrada
TextFecha Entrada:
DateTimePickerNamedtpFechaEntrada
FormatCustom
CustomFormatdd/MM/yyyy
LabelNamelblFechaFactura
TextFecha Factura:
DateTimePickerNamedtpFechaFactura
FormatCustom
CustomFormatdd/MM/yyyy
LabelNamelblFolioFactura
TextFolio Factura:
TextBoxNametxtFolioFactura
LabelNamelblNombreProveedor
TextNombre del Proveedor:
TextBoxNametxtNombreProveedor
LabelNamelblIdArticulo
TextArticulo:
TextBoxNametxtIdArticulo
LabelNamelblCantidad
TextCantidad:
TextBoxNametxtCantidad
LabelNamelblPrecioCompra
TextPrecio:
TextBoxNametxtPrecioCompra
ButtonNamebtnAgregar
TextAgregar
ButtonNamebtnGrabar
TextGrabar
ButtonNamebtnCancelar
TextCancelar
ListViewNamelvEntrada
FullRowSelectTrue
GridLinesTrue
HideSelectionFalse
ProgramacinDirectivas Imports:Imports System.DataImports System.Data.OleDb
Ponemos elcdigo de "modMain.vb":Module modMain ''Proveedor para Access 2007-2010 (.accdb): ''Microsoft.ACE.OLEDB.12.0 ''Proveedor para 99-2003 .(mdb): ''Microsoft.Jet.OLEDB.4.0 Public CnnStr As String = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source={0};Persist Security Info=False", "D:\DOCS\tyrodeveloper\Blogger\almacenVB\almacen.mdb") Public RptEntrada As String = "D:\DOCS\tyrodeveloper\Blogger\almacenVB\almacenVB\Reportes\rptEntrada.rdlc" Public RptSalida As String = "D:\DOCS\tyrodeveloper\Blogger\almacenVB\almacenVB\Reportes\rptSalida.rdlc"End Module
Vamos al cdigo del formulario "frmEntrada.vb":
DeclaracionesDim tmpEntrada As New DataTable
Ahora escribiremos el cdigo de las funciones y procedimientos: Protected Sub generaColumnas() lvEntrada.Clear() lvEntrada.View = View.Details lvEntrada.Columns.Add("", 0, HorizontalAlignment.Left) lvEntrada.Columns.Add("Id ", 100, HorizontalAlignment.Left) lvEntrada.Columns.Add("Producto", 240, HorizontalAlignment.Left) lvEntrada.Columns.Add("Cantidad", 60, HorizontalAlignment.Right) lvEntrada.Columns.Add("Precio", 60, HorizontalAlignment.Right) lvEntrada.Columns.Add("Total", 80, HorizontalAlignment.Right) End Sub Protected Sub mostrarEntrada() Try Dim varIVA As Double = 0 Dim varTOTAL As Double = 0 lvEntrada.Items.Clear() Dim i As Integer = 0 For i = 0 To tmpEntrada.Rows.Count - 1 Step 1 lvEntrada.Items.Add(tmpEntrada.Rows(i)("id").ToString()) lvEntrada.Items(i).SubItems.Add(tmpEntrada.Rows(i)("id_articulo").ToString()) lvEntrada.Items(i).SubItems.Add(tmpEntrada.Rows(i)("articulo").ToString()) lvEntrada.Items(i).SubItems.Add(String.Format("{0:N}", Convert.ToDouble(tmpEntrada.Rows(i)("cantidad")))) lvEntrada.Items(i).SubItems.Add(String.Format("{0:C}", Convert.ToDouble(tmpEntrada.Rows(i)("precio_compra")))) lvEntrada.Items(i).SubItems.Add(String.Format("{0:C}", (Convert.ToDouble(tmpEntrada.Rows(i)("precio_compra")) * Convert.ToDouble(tmpEntrada.Rows(i)("cantidad"))))) varTOTAL += Convert.ToDouble(tmpEntrada.Rows(i)("precio_compra")) * Convert.ToDouble(tmpEntrada.Rows(i)("cantidad")) varIVA += (Convert.ToDouble(tmpEntrada.Rows(i)("cantidad")) * Convert.ToDouble(tmpEntrada.Rows(i)("precio_compra"))) - ((Convert.ToDouble(tmpEntrada.Rows(i)("cantidad")) * Convert.ToDouble(tmpEntrada.Rows(i)("precio_compra"))) / (1.16)) Next catch ex as Exception MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub Protected Function agregarArticulo() As Boolean Dim cnn As New OleDbConnection(CnnStr) Dim row As DataRow Try Dim varId As String = "" Dim varNombre As String = "" cnn.Open() Dim strSQL As String = "select articulo from articulos " + "where id_articulo=@id" Dim cmd As New OleDbCommand(strSQL, cnn) cmd.Parameters.Add("@id", OleDbType.VarChar, 50).Value = txtIdArticulo.Text Dim dr As OleDbDataReader = cmd.ExecuteReader() If (dr.Read()) Then varId = txtIdArticulo.Text varNombre = dr("articulo").ToString() ''agregamos la venta a la tabla temporal row = tmpEntrada.NewRow() row("id_articulo") = varId row("articulo") = varNombre row("cantidad") = CDbl(txtCantidad.Text) row("precio_compra") = CDbl(txtPrecioCompra.Text) row("iva") = 0.16 tmpEntrada.Rows.Add(row) Else Throw (New Exception("El articulo no existe")) End If dr.Close() Return True Catch ex As Exception Throw (ex) Finally cnn.Close() End Try End Function Protected Function grabarEntrada() As Boolean Dim cnn As New OleDbConnection(CnnStr) Try cnn.Open() Dim tran As OleDbTransaction = cnn.BeginTransaction() Dim cmd As New OleDbCommand() cmd.Connection = cnn cmd.Transaction = tran ''insertamos el registro de la Entrada Try cmd.CommandText = "insert into entradas(fecha_entrada,fecha_factura,folio_factura,proveedor,user_login) " + " values (@fechaEntrada,@fechaFactura,@folioFactura,@nombreProveedor,@userLogin)" ''params cmd.Parameters.Add("@fechaEntrada", OleDbType.Date).Value = New DateTime(dtpFechaEntrada.Value.Year, dtpFechaEntrada.Value.Month, dtpFechaEntrada.Value.Day) cmd.Parameters.Add("@fechaFactura", OleDbType.Date).Value = New DateTime(dtpFechaFactura.Value.Year, dtpFechaFactura.Value.Month, dtpFechaFactura.Value.Day) cmd.Parameters.Add("@folioFactura", OleDbType.VarChar, 50).Value = txtFolioFactura.Text cmd.Parameters.Add("@nombreProveedor", OleDbType.VarChar, 50).Value = txtNombreProveedor.Text cmd.Parameters.Add("@userLogin", OleDbType.VarChar, 50).Value = "admin" cmd.ExecuteNonQuery() cmd.Parameters.Clear() ''Limpiar params ''obtenemos el folio Dim _FolioEntrada As Integer = 0 cmd.CommandText = "select @@identity" _FolioEntrada = Convert.ToInt32(cmd.ExecuteScalar()) ''insertamos el detalle de la entrada Dim i As Integer = 0 For i = 0 To tmpEntrada.Rows.Count - 1 Step 1 Dim _IdArticulo As String = Convert.ToString(tmpEntrada.Rows(i)("id_articulo")) Dim _Cantidad As Double = Convert.ToDouble(tmpEntrada.Rows(i)("cantidad")) Dim _IVA As Double = Convert.ToDouble(tmpEntrada.Rows(i)("iva")) Dim _PrecioCompra As Double = Convert.ToDouble(tmpEntrada.Rows(i)("precio_compra")) Dim _CostoPromedio As Double = 0 ''insertamos el articulo cmd.CommandText = "insert into entradas_detalle(id_entrada,id_articulo,cantidad,precio_compra,iva) " + "values(@folioEntrada,@idArticulo,@cantidad,@precioCompra,@IVA)" cmd.Parameters.Add("@folioEntrada", OleDbType.Integer).Value = _FolioEntrada cmd.Parameters.Add("@idArticulo", OleDbType.VarChar, 50).Value = _IdArticulo cmd.Parameters.Add("@cantidad", OleDbType.Double).Value = _Cantidad cmd.Parameters.Add("@precioCompra", OleDbType.Double).Value = _PrecioCompra cmd.Parameters.Add("@IVA", OleDbType.Double).Value = _IVA cmd.ExecuteNonQuery() cmd.Parameters.Clear() ''Limpiar params ''actualizamosexistencias cmd.CommandText = "update articulos set " + " existencia=existencia + @cantidad" + " where id_articulo=@idArticulo" cmd.Parameters.Add("@cantidad", OleDbType.Double).Value = _Cantidad cmd.Parameters.Add("@idArticulo", OleDbType.VarChar, 50).Value = _IdArticulo cmd.ExecuteNonQuery() cmd.Parameters.Clear() ''Limpiar params ''establecemos el costo promedio cmd.CommandText = "select avg(precio_compra) " + " from entradas_detalle " + " where id_articulo=@idArticulo" cmd.Parameters.Add("@idArticulo", OleDbType.VarChar, 50).Value = _IdArticulo _CostoPromedio = Convert.ToDouble(cmd.ExecuteScalar()) cmd.Parameters.Clear() ''Limpiar params cmd.CommandText = "update articulos set " + " costo_promedio=@costo" + " where id_articulo=@idArticulo" cmd.Parameters.Add("@cantidad", OleDbType.Double).Value = _CostoPromedio cmd.Parameters.Add("@idArticulo", OleDbType.VarChar, 50).Value = _IdArticulo cmd.ExecuteNonQuery() cmd.Parameters.Clear() ''Limpiar params Next ''finalizamos la transaccion tran.Commit() MessageBox.Show("Entrada grabada correctamente", "Informacin del Sistema", MessageBoxButtons.OK, MessageBoxIcon.Information) Catch ex As Exception tran.Rollback() Throw (ex) End Try Return True Catch ex As Exception Throw (ex) Finally cnn.Close() End Try End Function
Ahora damos doble clic sobre el botn Agregar (btnAgregar) y escribimos el siguiente cdigo: Try If (agregarArticulo()) Then mostrarEntrada() End If Catch ex As Exception MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try
Ahora, agregaremos el cdigo para grabar la entrada, hacemos doble clic sobre el botn Grabar (btnGrabar) y escribimos el siguiente cdigo: Try ''validaciones If (txtFolioFactura.Text = "") Then Throw (New Exception("Falta folio de factura")) End If If (txtNombreProveedor.Text = "") Then Throw (New Exception("Falta nombre del provedor")) End If If (lvEntrada.Items.Count = 0) Then Throw (New Exception("No hay elementos")) End If ''grabar If (grabarEntrada()) Then Me.Close() End If Catch ex As Exception MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try
El cdigo que pondremos en el Form_Load es el siguiente: ''>Definimos la tabla para las ventas Temporales Dim idColumn As New DataColumn("id", GetType(Integer)) idColumn.Unique = True idColumn.AutoIncrement = True idColumn.AutoIncrementSeed = 1 idColumn.AutoIncrementStep = 1 tmpEntrada.Columns.Add(idColumn) ''declaramos el resto de los campos tmpEntrada.Columns.Add("id_articulo", GetType(String)) tmpEntrada.Columns.Add("articulo", GetType(String)) tmpEntrada.Columns.Add("cantidad", GetType(Double)) tmpEntrada.Columns.Add("precio_compra", GetType(Double)) tmpEntrada.Columns.Add("iva", GetType(Double)) ''agregamos un primary key tmpEntrada.PrimaryKey = New DataColumn() {tmpEntrada.Columns("id")} ''= varCantidad) Then ''agregamos la venta a la tabla temporal Dim row As DataRow = tmpEntrada.NewRow() row("id_articulo") = varId row("articulo") = varNombre row("cantidad") = varCantidad tmpEntrada.Rows.Add(row) Else Throw (New Exception("No hay suficientes existencias")) End If Else Throw (New Exception("el articulono existe")) End If dr.Close() cnn.Close() Return (True) Catch ex As Exception Throw (ex) End Try End Function Protected Function grabarSalida() As Boolean Dim cnn As New OleDbConnection(CnnStr) Try cnn.Open() Dim tran As OleDbTransaction = cnn.BeginTransaction() Dim cmd As New OleDbCommand() cmd.Connection = cnn cmd.Transaction = tran ''insertamos el registro de la Entrada Try cmd.CommandText = "insert into " + "salidas(fecha_salida,responsable,user_login) " + " values (@fechaSalida,@responsable,@userLogin)"
cmd.Parameters.Add("@fechaSalida", OleDbType.Date).Value = New Date(dtpFechaSalida.Value.Year, dtpFechaSalida.Value.Month, dtpFechaSalida.Value.Day) cmd.Parameters.Add("@responsable", OleDbType.VarChar, 50).Value = txtResponsable.Text cmd.Parameters.Add("@userLogin", OleDbType.VarChar, 50).Value = "admin" cmd.ExecuteNonQuery() cmd.Parameters.Clear() ''obtenemos el folio Dim _FolioSalida As Integer = 0 cmd.CommandText = "select @@identity" _FolioSalida = Convert.ToInt32(cmd.ExecuteScalar()) ''insertamos el detalle de laentrada Dim i As Integer For i = 0 To tmpEntrada.Rows.Count - 1 Step 1 Dim _IdArticulo As String = Convert.ToString(tmpEntrada.Rows(i)("id_articulo")) Dim _Cantidad As Double = Convert.ToDouble(tmpEntrada.Rows(i)("cantidad")) ''insertamos el articulo cmd.CommandText = "insert into " + "salidas_detalle(id_salida,id_articulo,cantidad) " + "values(@folioSalida,@idArticulo,@cantidad)" cmd.Parameters.Add("@folioSalida", OleDbType.Integer).Value = _FolioSalida cmd.Parameters.Add("@idArticulo", OleDbType.VarChar, 50).Value = _IdArticulo cmd.Parameters.Add("@cantidad", OleDbType.Double).Value = _Cantidad cmd.ExecuteNonQuery() cmd.Parameters.Clear() ''actualizamosexistencias cmd.CommandText = "update articulos set " + " existencia=existencia - @cantidad" + " where id_articulo=@idArticulo" cmd.Parameters.Add("@cantidad", OleDbType.Integer).Value = _Cantidad cmd.Parameters.Add("@idArticulo", OleDbType.VarChar, 50).Value = _IdArticulo cmd.ExecuteNonQuery() cmd.Parameters.Clear() Next ''finalizamos la transaccion tran.Commit() cnn.Close() MessageBox.Show("Salida grabada correctamente", "Informacin del Sistema", MessageBoxButtons.OK, MessageBoxIcon.Information) Return (True) Catch errEntrada As OleDbException tran.Rollback() Throw (errEntrada) Return (False) End Try Catch ex As Exception Throw (ex) Finally cnn.Close() End Try End Function
Ahora damos doble clic sobre el botn Agregar (btnAgregar) y escribimos el siguiente cdigo: Try If agregarArticulo() Then mostrarEntrada() End If Catch ex As Exception MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try
Ahora, agregaremos el cdigo para grabar la entrada, hacemos doble clic sobre el botn Grabar (btnGrabar) y escribimos el siguiente cdigo: Try ''validaciones If (lvSalida.Items.Count = 0) Then Throw (New Exception("No hay elementos")) End If If (txtResponsable.Text = "") Then Throw (New Exception("Falta el Responsable")) End If If (grabarSalida()) Then Me.Close() End If Catch ex As Exception MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try
El cdigo que pondremos en el Form_Load es el siguiente: ''>Definimos la tabla para las salida Temporal Dim idColumn As New DataColumn("id", GetType(Integer)) idColumn.Unique = True idColumn.AutoIncrement = True idColumn.AutoIncrementSeed = 1 idColumn.AutoIncrementStep = 1 tmpEntrada.Columns.Add(idColumn) ''declaramos el resto de los campos tmpEntrada.Columns.Add("id_articulo", GetType(String)) tmpEntrada.Columns.Add("articulo", GetType(String)) tmpEntrada.Columns.Add("cantidad", GetType(Double)) ''agregamos un primary key tmpEntrada.PrimaryKey = New DataColumn() {tmpEntrada.Columns("id")} ''