sistema de almacén visual basic

Upload: washington-espirilla-torres

Post on 18-Oct-2015

50 views

Category:

Documents


0 download

TRANSCRIPT

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")} ''