Академический Документы
Профессиональный Документы
Культура Документы
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 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.
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
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
Label TextBox
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
Programacin
Directivas Imports:
Imports System.Data Imports System.Data.OleDb
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",
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:
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
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:
En la siguiente ventana, expanda todo y ubique el DataSet que acaba de crear anteriormente, como se muestra a continuacin:
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:
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:
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
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
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.
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
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
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
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
Le daremos diseo al formulario frmPrincipal agregando un MenuStrip, un ToolStrip y estableciendo su pripiedad IsMdiContainer = true para que quede de la siguiente manera:
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
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