Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
users
Tipo de Datos
Descripcin
user_login
Texto(50)
user_password
Texto(255)
nombre
Texto(255)
activo
Si/No
Si est activo
administrar
Si/No
reportes
Si/No
articulos
Tipo de Datos Descripcin
id_articulo
Texto(50)
Id del artculo
articulo
Texto(255)
localizacion
Texto(255)
Ubicacin en el almacn
grupo
Texto(255)
unidad_medida
Texto(255)
Unidad de medida
existencia
Nmero(Doble)
Existencia
cant_min
Nmero(Doble)
Existencia mnima
costo_promedio
Nmero(Doble)
Costo promedio
entradas
Tipo de Datos Descripcin
id_entrada
Autonumrico
Id de la entrada
fecha_registro
Fecha/Hora
fecha_entrada
Fecha/Hora
Fecha de la entrada en el
almacen
proveedor
Texto(255)
folio_factura
Texto(50)
fecha_factura
Fecha/Hora
Fecha de la factura
user_login
Texto(50)
entradas_detalle
Tipo de Datos
Descripcin
id_entrada_detalle
Autonumrico
id_entrada
Nmero
Id de la entrada
id_articulo
Texto(50)
Id del artculo
cantidad
Nmero(Doble)
precio_compra
Nmero(Doble)
iva
Nmero(Doble)
salidas
Nombre del Campo
Tipo de Datos
Descripcin
id_salida
Autonumrico
Id de la salida
fecha_registro
Fecha/Hora
fecha_salida
Fecha/Hora
Fecha de la salida
responsable
Texto(255)
Responsable de la salida
user_login
Texto(50)
salidas_detalle
Nombre del Campo
Tipo de Datos
Descripcin
id_salida_detalle
Autonumrico
id_salida
Nmero
Id de la salida
id_articulo
Texto(50)
Id del artculo
cantidad
Nmero(Doble)
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.
Entradas al Almacn
Diseo de la pantalla
Empezaremos diseando la pantalla de entradas (formulario frmEntrada), la apariencia debe de
quedar mas o menos as:
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
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
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
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:
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
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:
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:
Elija a su gusto:
Puede darle diseo al reporte, hagalo a su gusto, aqui se muestra algo muy bsico:
Hasta aqui todo ha sido diseo, ahora escribiremos el cdigo que hace todo posible:
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
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
Diseo de la pantalla
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
System.Data
System.Data.OleDb
Microsoft.Reporting.WinForms
System.IO
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
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:
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
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
''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
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.
Pantalla principal
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
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 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
Hemos terminado este tutorial, espero que les sea de utilidad... Dios los Bendiga