Вы находитесь на странице: 1из 38

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 Campo user_login user_password nombre activo administrar reportes Tipo de Datos Texto(50) Texto(255) Texto(255) Si/No Si/No Si/No Descripcin Nombre de inicio de sesin Contrasea del usuario Nombre del usuario Si est activo Si puede administrar el sistema Si puede ver reportes

articulos Nombre del Campo id_articulo articulo localizacion grupo unidad_medida existencia cant_min costo_promedio Tipo de Datos Texto(50) Texto(255) Texto(255) Texto(255) Texto(255) Nmero(Doble) Nmero(Doble) Nmero(Doble) Descripcin Id del artculo Nombre del artculo Ubicacin en el almacn Grupo del articulo Unidad de medida Existencia Existencia mnima Costo promedio

entradas Nombre del Campo id_entrada fecha_registro fecha_entrada proveedor folio_factura fecha_factura user_login Tipo de Datos Autonumrico Fecha/Hora Fecha/Hora Texto(255) Texto(50) Fecha/Hora Texto(50) Descripcin Id de la entrada Fecha de registro en el sistema Fecha de la entrada en el almacen Nombre del proveedor Folio de la factura de compra Fecha de la factura Usuario que registra la entrada

entradas_detalle Nombre del Campo id_entrada_detalle id_entrada id_articulo cantidad precio_compra iva Tipo de Datos Autonumrico Nmero Texto(50) Nmero(Doble) Nmero(Doble) Nmero(Doble) Descripcin Id del detalle de la entrada Id de la entrada Id del artculo Cantidad que entra al almacn Precio de compra (segun factura) Impuesto que cobra el proveedor (en porcentaje)

salidas Nombre del Campo id_salida Tipo de Datos Autonumrico Descripcin Id de la salida

fecha_registro fecha_salida responsable user_login

Fecha/Hora Fecha/Hora Texto(255) Texto(50)

Fecha de registro en el sistema Fecha de la salida Responsable de la salida Usuario que registra la salida

salidas_detalle Nombre del Campo id_salida_detalle id_salida id_articulo cantidad Tipo de Datos Autonumrico Nmero Texto(50) Nmero(Doble) Descripcin Id del detalle de la salida Id de la salida Id del artculo 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 Almacn
Diseo de la pantalla
Empezaremos 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: Objeto Propiedad Name Label Text Name Valor lblFechaEntrada Fecha Entrada: dtpFechaEntrada

DateTimePicker

Format CustomFormat Name

Custom dd/MM/yyyy lblFechaFactura Fecha Factura: dtpFechaFactura Custom dd/MM/yyyy lblFolioFactura Folio Factura: txtFolioFactura lblNombreProveedor Nombre del Proveedor: txtNombreProveedor lblIdArticulo Articulo: txtIdArticulo lblCantidad Cantidad: txtCantidad lblPrecioCompra Precio: txtPrecioCompra btnAgregar

Label

Text Name

DateTimePicker

Format CustomFormat Name

Label TextBox

Text Name Name

Label Text TextBox Name Name Label Text TextBox Name Name Label Text TextBox Name Name Label Text TextBox Button Name Name

Text Name Button Text Name Button Text Name FullRowSelect ListView GridLines HideSelection

Agregar btnGrabar Grabar btnCancelar Cancelar lvEntrada True True False

Programacin
Directivas Imports:
Imports System.Data Imports 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": Declaraciones


Dim 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")} ''<termina la deficinicn de la tabla temporal generaColumnas() mostrarEntrada()

En el botn Salir (btnSalir) escribimos esto:


Me.Close()

Para efectos de aprendizaje basico me asegur de no poner funcionalidad demasiado complicada. Lo que tratamos de desarrollar es un sistema de almacn sencillo, no se trata de desarrollar un sistema comercial cero errores, tratamos de sentar las bases tcnicas para, en un futuro, lograr un gran sistema de almacn con toda la funcionalidad comercial. Aqui un ejemplo de la pantalla funcionando:

Sistema de Almacn Visual Basic (Parte 4)

Reporte de Entradas
Diseo de la pantalla
Para comenzar, le daremos diseo al formulario "frmEntradasLista" el cual nos servir para mostrar un listado de las entradas que se hayan registrado, la apariencia debe de quedar mas o menos as:

Se agregaron tres Button, un ListView y un Label, las propiedades estn descritas en la siguiente tabla: Objeto Propiedad Name Button Text Name Button Text Name Button Text ListView Name Salir lvEntradas Mostrar btnSalir Nueva btnMostrar Valor btnNueva

FullRowSelect GridLines HideSelection Name Label Text

True True False lblMensaje Doble clic para imprimir.

Ahora procedemos con el diseo del reporte de entradas, lo primero que haremos ser crear un DataSet el cual nos servir para el posterior diseo del reporte. Agregamos un nuevo objeto del tipo DataSet y le asignamos el nombre dsRptEntrada como se muestra:

Le damos diseo para que quede como se muestra: El DataSet aparece vaco, debemos agregar un DataTable y darle el diseo para que quede como se muestra en la imagen. De entre las propiedades que debemos destacar es que el tipo de datos de los campos cantidad, precio_compra e iva son System.Double. Los tipos de datos para los campos id_articulo y articulo son System.String.

Una vez terminado el diseo del DataSet agregamos un Reporte, pero utilizaremos un asistente, aqui muestro con imagenes todo el proceso:

Selecionamos que nuestro origen de datos es un objeto:

En la siguiente ventana, expanda todo y ubique el DataSet que acaba de crear anteriormente, como se muestra a continuacin:

Luego, escriba un nombre para el DataSet (propiedad Name), se recomienda poner el

mismo que puso anteriormente:

Arrastre los campos que desea mostrar en el reporte a la seccin Values como se muestra en la imagen:

Desactive la operacin Sum:

Seleccione un formato (apariencia):

Elija a su gusto:

Agregue el encabezado y el pi del reporte:

Agregue los parametros prmFechaEntrada, prmFechaFactura, prmFolioFactura y prmProveedor

Ejemplo de como agregar un parametro (Repitalo con los dems):

Agregue cuatro TextBox al encabezado y organicelos ordenadamente:

Arrastre los parametros creados enfrente de los TextBox:

Agrege una columna al reporte:

Puede darle diseo al reporte, hagalo a su gusto, aqui se muestra algo muy bsico:

Agregaremos una funcin para calcular el total:

En seguida se muestra como hacerla:

Agregaremos un nuevo formulario llamado frmVerReporte al cual agregaremos un control ReportViewer al cual estableceremos una propiedad Modifiers=Public (En la ventana de propiedades), aqui se muestra una imagen:

Hasta aqui todo ha sido diseo, ahora escribiremos el cdigo que hace todo posible:

Ahora agregamos los siguientes procedimientos:


Protected Sub generarColumnas() lvEntradas.Clear() lvEntradas.View = View.Details lvEntradas.Columns.Add("Folio ", 40, HorizontalAlignment.Left) lvEntradas.Columns.Add("Fecha Entrada", 85, HorizontalAlignment.Left)

lvEntradas.Columns.Add("Fecha Factura", 85, HorizontalAlignment.Left) lvEntradas.Columns.Add("Folio Factura", 85, HorizontalAlignment.Left) lvEntradas.Columns.Add("Proveedor", 200, HorizontalAlignment.Left) End Sub Protected Sub mostrarEntradas() Dim cnn As New OleDbConnection(CnnStr) Try cnn.Open() Dim cmd As New OleDbCommand() cmd.Connection = cnn cmd.CommandText = "select * from entradas" Dim dr As OleDbDataReader = cmd.ExecuteReader() Dim i As Integer = 0 lvEntradas.Items.Clear() While (dr.Read()) ''mostramos los datos lvEntradas.Items.Add(dr("id_entrada").ToString()) lvEntradas.Items(i).SubItems.Add(String.Format("{0:dd/MM/yyyy}", dr("fecha_entrada"))) lvEntradas.Items(i).SubItems.Add(String.Format("{0:dd/MM/yyyy}", dr("fecha_factura"))) lvEntradas.Items(i).SubItems.Add(dr("folio_factura").ToString()) lvEntradas.Items(i).SubItems.Add(dr("proveedor").ToString()) i += 1 End While dr.Close() Catch ex As Exception Throw (ex) Finally cnn.Close() End Try End Sub Protected Sub mostrarReporte(ByVal idEntrada As Integer) Dim cnn As New OleDbConnection(CnnStr) Try cnn.Open() If Not File.Exists(RptEntrada) Then Throw (New Exception(String.Format("No existe el archivo: {0}", RptEntrada))) End If ''AHORA MOSTRAMOS EL REPORTE Dim cmd As New OleDbCommand() cmd.Connection = cnn cmd.CommandText = "select d.*,a.articulo " + " from entradas_detalle d,articulos a " + " where a.id_articulo=d.id_articulo and id_entrada=@idEntrada" cmd.Parameters.Add("@idEntrada", OleDbType.Integer).Value = idEntrada Dim dsReporte As New DataSet() Dim da As New OleDbDataAdapter(cmd) da.Fill(dsReporte, "rptEntrada") If (dsReporte.Tables("rptEntrada").Rows.Count = 0) Then Throw (New Exception("No hay Datos")) End If Dim frm As New frmVerReporte frm.reportViewer1.LocalReport.DataSources.Clear() frm.reportViewer1.LocalReport.Dispose() frm.reportViewer1.Reset() frm.reportViewer1.LocalReport.DataSources. Add(New ReportDataSource("dsRptEntrada", dsReporte.Tables("rptEntrada"))) frm.reportViewer1.LocalReport.ReportPath = RptEntrada ''parametros ''List<ReportParameter> param = new List<ReportParameter>() Dim param As New List(Of ReportParameter) Dim cmdDet As New OleDbCommand("select * from entradas " + " where id_entrada=@idEntrada", cnn) cmdDet.Parameters.Add("@idEntrada", OleDbType.Integer).Value = idEntrada

Dim dr As OleDbDataReader = cmdDet.ExecuteReader() If (dr.Read()) Then ''folio_factura Dim pFolioFactura As New ReportParameter() pFolioFactura.Name = "prmFolioFactura" pFolioFactura.Values.Add(dr("folio_factura").ToString()) param.Add(pFolioFactura) ''fecha_entrada Dim pFechaEntrada As New ReportParameter() pFechaEntrada.Name = "prmFechaEntrada" pFechaEntrada.Values.Add(dr("fecha_entrada").ToString()) param.Add(pFechaEntrada) ''fecha_factura Dim pFechaFactura As New ReportParameter() pFechaFactura.Name = "prmFechaFactura" pFechaFactura.Values.Add(dr("fecha_factura").ToString()) param.Add(pFechaFactura) ''proveedor Dim pProveedor As New ReportParameter() pProveedor.Name = "prmProveedor" pProveedor.Values.Add(dr("proveedor").ToString()) param.Add(pProveedor) End If dr.Close() ''agregamos los parametros a la coleccion frm.reportViewer1.LocalReport.SetParameters(param) frm.reportViewer1.RefreshReport() frm.ShowDialog() cnn.Close() Catch ex As Exception Throw (ex) Finally cnn.Close() End Try End Sub

Agregamos sl siguiente cdigo en el Form_Load:


Try generarColumnas() mostrarEntradas() Catch ex As Exception MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try

Luego, agregamos el siguiente cdigo (Para el evento Doble Clic del ListView):
Private Sub lvEntradas_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles lvEntradas.DoubleClick Try If (lvEntradas.SelectedItems.Count <> 0) Then Dim _FolioEntrada As Integer = Convert.ToInt32(lvEntradas.SelectedItems(0).Text) mostrarReporte(_FolioEntrada) End If Catch ex As Exception MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub

El cdigo para el botn btnNueva:


Dim frm As New frmEntrada frm.StartPosition = FormStartPosition.CenterScreen frm.ShowDialog()

El cdigo para el botn btnMostrar:


Try mostrarEntradas() Catch ex As Exception MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try

El cdigo para el botn btnSalir


Me.Close()

Aqui un ejemplo de la pantalla funcionando:

Aqui un ejemplo del reporte:

Sistema de Almacn Visual Basic (Parte 5)

Salidas del Almacn


Diseo de la pantalla
Empezaremos diseando la pantalla de salidas (formulario frmSalida), la apariencia debe de quedar mas o menos as:

A continuacion una tabla descriptiva con los nombres de los objetos: Objeto Propiedad Name Label Text Name DateTimePicker Format CustomFormat Name Label Text TextBox Name Name Label Text TextBox Name Name Label Text TextBox Name Cantidad: txtCantidad Articulo: txtIdArticulo lblCantidad Responsable de la Salida: txtResponsable lblIdArticulo Fecha Salida: dtpFechaSalida Custom dd/MM/yyyy lblResponsable Valor lblFechaSalida

Name Button Text Name Button Text Name Button Text Name FullRowSelect ListView GridLines HideSelection

btnAgregar Agregar btnGrabar Grabar btnCancelar Cancelar lvSalida True True False

Programacin
La parte de la programacin es la mas enredada. Voy a considerar que el lector es un novato con nociones bastante bsicas e insuficientes como para comprender la estructura de la programacin C#. Recomiendo al lector poner mucha atencin a los pasos que aqui se describan y no omitir nada, leer y re-leer hasta que haya comprendido lo que tiene que hacer.

Declaramos las siguientes directivas:


Imports Imports Imports Imports System.Data System.Data.OleDb Microsoft.Reporting.WinForms System.IO

Escribiremos el cdigo de las funciones y procedimientos:


Protected Sub generaColumnas() With lvSalida .Clear() .View = View.Details .Columns.Add("", 0, HorizontalAlignment.Left) .Columns.Add("Id ", 100, HorizontalAlignment.Left) .Columns.Add("Producto", 240, HorizontalAlignment.Left) .Columns.Add("Cantidad", 60, HorizontalAlignment.Right) End With

End Sub Protected Sub mostrarEntrada() Try lvSalida.Items.Clear() Dim i As Integer = 0 For i = 0 To tmpEntrada.Rows.Count - 1 Step 1 With lvSalida .Items.Add(tmpEntrada.Rows(i)("id").ToString()) .Items(i).SubItems.Add(tmpEntrada.Rows(i)("id_articulo").ToString()) .Items(i).SubItems.Add(tmpEntrada.Rows(i)("articulo").ToString()) .Items(i).SubItems.Add(String.Format("{0:N}", Convert.ToDouble(tmpEntrada.Rows(i)("cantidad")))) End With Next Catch ex As Exception Throw (ex) End Try End Sub Protected Function agregarArticulo() As Boolean Dim cnn As New OleDbConnection(CnnStr) Try Dim varId As String = "" Dim varNombre As String = "" Dim varExistencia As Double = 0 Dim varCantidad As Double = CDbl(txtCantidad.Text) cnn.Open() Dim strSQL As String = "select articulo,existencia,id_articulo " + " from articulos " + " where id_articulo=@idArticulo" Dim cmd As New OleDbCommand(strSQL, cnn) cmd.Parameters.Add("@idArticulo", OleDbType.VarChar, 50).Value = txtIdArticulo.Text Dim dr As OleDbDataReader = cmd.ExecuteReader() If (dr.Read()) Then varId = dr("id_articulo").ToString() varNombre = dr("articulo").ToString() varExistencia = Convert.ToDouble(dr("existencia")) If (varExistencia >= 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")} ''<termina la deficinicn de la tabla temporal generaColumnas() mostrarEntrada()

En el botn Salir (btnSalir) escribimos esto:


Me.Close()

Aqui un ejemplo de la pantalla funcionando:

Sistema de Almacn Visual Basic (Parte 6)

Reporte de Salidas
Diseo de la pantalla
Para comenzar, le daremos diseo al formulario "frmSalidasLista" el cual nos servir para mostrar un listado de las salidas que se hayan registrado, la apariencia debe de quedar mas o menos as:

Se agregaron tres Button, un ListView y un Label, las propiedades estn descritas en la siguiente tabla: Objeto Propiedad Name Button Text Name Button Text Name Button Text Name FullRowSelect ListView GridLines HideSelection Name Label Text Doble clic para imprimir. True False lblMensaje Salir lvSalidas True Mostrar btnSalir Nueva btnMostrar Valor btnNueva

Ahora procedemos con el diseo del reporte de salidas, este proceso se muestra en la parte 4 de este tutorial, el cual deber quedar mas o menos as:

Directivas Imports:
Imports System.Data Imports System.Data.OleDb

Imports Microsoft.Reporting.WinForms Imports System.IO

Ahora agregamos los siguientes procedimientos:


Protected Sub generarColumnas() With lvSalidas .Clear() .View = View.Details .Columns.Add("Folio ", 40, HorizontalAlignment.Left) .Columns.Add("Salida", 85, HorizontalAlignment.Left) .Columns.Add("Responsable", 200, HorizontalAlignment.Left) End With End Sub Protected Sub mostrarSalidas() Dim cnn As New OleDbConnection(CnnStr) Try cnn.Open() Dim cmd As New OleDbCommand() cmd.Connection = cnn cmd.CommandText = "select * from salidas" Dim dr As OleDbDataReader = cmd.ExecuteReader() Dim i As Integer = 0 lvSalidas.Items.Clear() While (dr.Read()) ''mostramos los datos With lvSalidas .Items.Add(dr("id_salida").ToString()) .Items(i).SubItems.Add(String.Format("{0:dd/MM/yyyy}", dr("fecha_salida"))) .Items(i).SubItems.Add(dr("responsable").ToString()) End With i += 1 End While dr.Close() Catch ex As Exception Throw (ex) Finally cnn.Close() End Try End Sub Protected Sub mostrarReporte(ByVal idSalida As Integer) Dim cnn As New OleDbConnection(CnnStr) Try cnn.Open() If Not File.Exists(RptSalida) Then Throw (New Exception(String.Format("No existe el archivo: {0}", RptEntrada))) End If ''AHORA MOSTRAMOS EL REPORTE Dim cmd As New OleDbCommand() cmd.Connection = cnn cmd.CommandText = "select d.*,a.articulo " + " from salidas_detalle d,articulos a " + " where a.id_articulo=d.id_articulo " + " and id_salida=@idSalida" cmd.Parameters.Add("@idSalida", OleDbType.Integer).Value = idSalida Dim dsReporte As New DataSet() Dim da As New OleDbDataAdapter(cmd) da.Fill(dsReporte, "rptSalida") If (dsReporte.Tables("rptSalida").Rows.Count = 0) Then Throw (New Exception("No hay Datos")) End If Dim frm As New frmVerReporte frm.reportViewer1.LocalReport.DataSources.Clear()

frm.reportViewer1.LocalReport.Dispose() frm.reportViewer1.Reset() frm.reportViewer1.LocalReport. DataSources.Add(New ReportDataSource("dsRptSalida", dsReporte.Tables("rptSalida"))) frm.reportViewer1.LocalReport.ReportPath = RptSalida ''parametros ''List<ReportParameter> param = new List<ReportParameter>() Dim param As New List(Of ReportParameter) Dim cmdDet As New OleDbCommand("select * " + "from salidas where id_salida=@idSalida", cnn) cmdDet.Parameters.Add("@idSalida", OleDbType.Integer).Value = idSalida Dim dr As OleDbDataReader = cmdDet.ExecuteReader() If (dr.Read()) Then ''id_Salida Dim pIdSalida As New ReportParameter() pIdSalida.Name = "prmIdSalida" pIdSalida.Values.Add(dr("id_salida").ToString()) param.Add(pIdSalida) ''fecha_Salida Dim pFechaEntrada As New ReportParameter() pFechaEntrada.Name = "prmFechaSalida" pFechaEntrada.Values.Add(dr("fecha_salida")) param.Add(pFechaEntrada) ''responsable Dim pResponsable As New ReportParameter() pResponsable.Name = "prmResponsable" pResponsable.Values.Add(dr("responsable").ToString()) param.Add(pResponsable) End If dr.Close() ''agregamos los parametros a la coleccion frm.reportViewer1.LocalReport.SetParameters(param) frm.reportViewer1.RefreshReport() frm.ShowDialog() cnn.Close() Catch ex As Exception Throw (ex) Finally cnn.Close() End Try End Sub

Agregamos sl siguiente cdigo en el Form_Load:


Try generarColumnas() mostrarSalidas() Catch ex As Exception MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try

Luego, agregamos el siguiente cdigo:


Private Sub lvSalidas_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles lvSalidas.DoubleClick Try If (lvSalidas.SelectedItems.Count <> 0) Then Dim _FolioSalida As Integer = Convert.ToInt32(lvSalidas.SelectedItems(0).Text) mostrarReporte(_FolioSalida) End If Catch ex As Exception

MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub

El cdigo para el botn btnNueva:


Dim frm As New frmSalida frm.StartPosition = FormStartPosition.CenterScreen frm.ShowDialog()

El cdigo para el botn btnMostrar:


Try mostrarSalidas() Catch ex As Exception MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try

El cdigo para el botn btnSalir


Me.Close()

Aqui un ejemplo de la pantalla funcionando:

Aqui un ejemplo del reporte:

Hasta este punto ya hemos desarrollado la funcionalidad bsica. En la siguiente parte haremos que aparesca una pantalla pricipal desde la que mandaremos llamar las que hasta hoy hemos desarrollado.

Sistema de Almacn Visual Basic (Parte 7)

Pantalla principal

Le daremos diseo al formulario frmPrincipal agregando un MenuStrip, un ToolStrip y estableciendo su pripiedad IsMdiContainer = true para que quede de la siguiente manera:

A continuacin una tabla que describe los objetos:

Objeto MenuStrip

Propiedad Name Name ToolStripMenuItem Text Name ToolStripMenuItem Text Name ToolStripMenuItem Text Name ToolStripMenuItem Text Name ToolStripMenuItem Text

Valor mnuPrincipal mnuArchivo Archivo mnuAyuda Ayuda mnuEntradas Entradas mnuSalidas Salidas mnuSalir Salir del Sistema barPrincipal btnEntradas Entradas ImageAndText ImageAboveText (A su gusto) btnSalidas Salidas ImageAndText ImageAboveText (A su gusto)

ToolStrip

Name Name Text ToolStripButton DisplayStyle TextImageRelation Image Name Text ToolStripButton DisplayStyle TextImageRelation Image

Name Text ToolStripButton DisplayStyle TextImageRelation Image

btnSalir Salir ImageAndText ImageAboveText (A su gusto)

Ahora crearemos los siguientes procedimientos:


Protected Sub Salidas() Dim frm As New frmSalidaLista frm.MdiParent = Me frm.Show() End Sub Protected Sub Entradas() Dim frm As New frmEntradaLista frm.MdiParent = Me frm.Show() End Sub

Ahora solo resta poner el cdigo en cada uno de los botones y mens, los ponemos de uno por uno, dando doble clic sobre cada uno, iniciamos con mnuEntradas: Entradas() Seguimos con mnuSalidas: Salidas() Asi lo hacemos tambin con los botones btnEntradas y btnSalidas

Aqui un ejemplo de la pantalla funcionando:

Hemos terminado este tutorial, espero que les sea de utilidad... Dios los Bendiga

Вам также может понравиться