Sei sulla pagina 1di 32

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:

Sistema de Almacn Visual Basic (Parte 2)

Creacin de la Base de datos


Creamos una base de datos con Microsoft Access, con las siguientes tablas:

users

Nombre del Campo

Tipo de Datos

Descripcin

user_login

Texto(50)

Nombre de inicio de sesin

user_password

Texto(255)

Contrasea del usuario

nombre

Texto(255)

Nombre del usuario

activo

Si/No

Si est activo

administrar

Si/No

Si puede administrar el sistema

reportes

Si/No

Si puede ver reportes

Nombre del Campo

articulos
Tipo de Datos Descripcin

id_articulo

Texto(50)

Id del artculo

articulo

Texto(255)

Nombre del artculo

localizacion

Texto(255)

Ubicacin en el almacn

grupo

Texto(255)

Grupo del articulo

unidad_medida

Texto(255)

Unidad de medida

existencia

Nmero(Doble)

Existencia

cant_min

Nmero(Doble)

Existencia mnima

costo_promedio

Nmero(Doble)

Costo promedio

Nombre del Campo

entradas
Tipo de Datos Descripcin

id_entrada

Autonumrico

Id de la entrada

fecha_registro

Fecha/Hora

Fecha de registro en el sistema

fecha_entrada

Fecha/Hora

Fecha de la entrada en el
almacen

proveedor

Texto(255)

Nombre del proveedor

folio_factura

Texto(50)

Folio de la factura de compra

fecha_factura

Fecha/Hora

Fecha de la factura

user_login

Texto(50)

Usuario que registra la entrada

entradas_detalle

Nombre del Campo

Tipo de Datos

Descripcin

id_entrada_detalle

Autonumrico

Id del detalle de la entrada

id_entrada

Nmero

Id de la entrada

id_articulo

Texto(50)

Id del artculo

cantidad

Nmero(Doble)

Cantidad que entra al almacn

precio_compra

Nmero(Doble)

Precio de compra (segun factura)

iva

Nmero(Doble)

Impuesto que cobra el proveedor


(en porcentaje)

salidas
Nombre del Campo

Tipo de Datos

Descripcin

id_salida

Autonumrico

Id de la salida

fecha_registro

Fecha/Hora

Fecha de registro en el sistema

fecha_salida

Fecha/Hora

Fecha de la salida

responsable

Texto(255)

Responsable de la salida

user_login

Texto(50)

Usuario que registra la salida

salidas_detalle
Nombre del Campo

Tipo de Datos

Descripcin

id_salida_detalle

Autonumrico

Id del detalle de la salida

id_salida

Nmero

Id de la salida

id_articulo

Texto(50)

Id del artculo

cantidad

Nmero(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 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

Valor

Name

lblFechaEntrada

Text

Fecha Entrada:

Name

dtpFechaEntrada

Format

Custom

CustomFormat

dd/MM/yyyy

Name

lblFechaFactura

Text

Fecha Factura:

Name

dtpFechaFactura

Format

Custom

CustomFormat

dd/MM/yyyy

Name

lblFolioFactura

Label

Text

Folio Factura:

TextBox

Name

txtFolioFactura

Name

lblNombreProveedor

Text

Nombre del Proveedor:

Name

txtNombreProveedor

Name

lblIdArticulo

Text

Articulo:

Name

txtIdArticulo

Name

lblCantidad

Text

Cantidad:

Name

txtCantidad

Name

lblPrecioCompra

Text

Precio:

Name

txtPrecioCompra

Name

btnAgregar

Text

Agregar

Name

btnGrabar

Text

Grabar

Label

DateTimePicker

Label

DateTimePicker

Label
TextBox
Label
TextBox
Label
TextBox
Label
TextBox
Button

Button

Button

ListView

Name

btnCancelar

Text

Cancelar

Name

lvEntrada

FullRowSelect

True

GridLines

True

HideSelection

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

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
Button

Button

Button

ListView

Label

Propiedad

Valor

Name

btnNueva

Text

Nueva

Name

btnMostrar

Text

Mostrar

Name

btnSalir

Text

Salir

Name

lvEntradas

FullRowSelect

True

GridLines

True

HideSelection

False

Name

lblMensaje

Text

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
Label

DateTimePicker

Label
TextBox
Label
TextBox
Label
TextBox
Button

Button

Button

ListView

Propiedad

Valor

Name

lblFechaSalida

Text

Fecha Salida:

Name

dtpFechaSalida

Format

Custom

CustomFormat

dd/MM/yyyy

Name

lblResponsable

Text

Responsable de la Salida:

Name

txtResponsable

Name

lblIdArticulo

Text

Articulo:

Name

txtIdArticulo

Name

lblCantidad

Text

Cantidad:

Name

txtCantidad

Name

btnAgregar

Text

Agregar

Name

btnGrabar

Text

Grabar

Name

btnCancelar

Text

Cancelar

Name

lvSalida

FullRowSelect

True

GridLines

True

HideSelection

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

Valor

Button

Button

Button

ListView

Label

Name

btnNueva

Text

Nueva

Name

btnMostrar

Text

Mostrar

Name

btnSalir

Text

Salir

Name

lvSalidas

FullRowSelect

True

GridLines

True

HideSelection

False

Name

lblMensaje

Text

Doble clic para imprimir.

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

System.Data
System.Data.OleDb
Microsoft.Reporting.WinForms
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

Propiedad

Valor

MenuStrip

Name

mnuPrincipal

Name

mnuArchivo

Text

Archivo

Name

mnuAyuda

Text

Ayuda

Name

mnuEntradas

Text

Entradas

Name

mnuSalidas

Text

Salidas

Name

mnuSalir

Text

Salir del Sistema

Name

barPrincipal

Name

btnEntradas

Text

Entradas

DisplayStyle

ImageAndText

ToolStripMenuItem

ToolStripMenuItem

ToolStripMenuItem

ToolStripMenuItem

ToolStripMenuItem
ToolStrip

ToolStripButton

TextImageRelatio
ImageAboveText
n
Image
ToolStripButton Name
Text

(A su gusto)
btnSalidas
Salidas

DisplayStyle

ImageAndText

TextImageRelatio
ImageAboveText
n

ToolStripButton

Image

(A su gusto)

Name

btnSalir

Text

Salir

DisplayStyle

ImageAndText

TextImageRelatio
ImageAboveText
n
Image

(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

Potrebbero piacerti anche