Salidas del Almacén
Diseño de la pantalla
Empezaremos diseñando 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 | Valor |
Label | Name | lblFechaSalida |
Text | Fecha Salida: | |
DateTimePicker | Name | dtpFechaSalida |
Format | Custom | |
CustomFormat | dd/MM/yyyy | |
Label | Name | lblResponsable |
Text | Responsable de la Salida: | |
TextBox | Name | txtResponsable |
Label | Name | lblIdArticulo |
Text | Articulo: | |
TextBox | Name | txtIdArticulo |
Label | Name | lblCantidad |
Text | Cantidad: | |
TextBox | Name | txtCantidad |
Button | Name | btnAgregar |
Text | Agregar | |
Button | Name | btnGrabar |
Text | Grabar | |
Button | Name | btnCancelar |
Text | Cancelar | |
ListView | Name | lvSalida |
FullRowSelect | True | |
GridLines | True | |
HideSelection | False |
Programación
La parte de la programación es la mas enredada. Voy a considerar que el lector es un novato con nociones bastante
básicas e insuficientes como para comprender la estructura de la programación C#. Recomiendo al lector poner mucha atención
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 System.Data Imports System.Data.OleDb Imports Microsoft.Reporting.WinForms Imports System.IOEscribiremos el código 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", "Información 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 botón Agregar (btnAgregar) y escribimos el siguiente código:
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 código para grabar la entrada, hacemos doble clic sobre el botón Grabar (btnGrabar) y escribimos el siguiente código:
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 código 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 deficinicón de la tabla temporal generaColumnas() mostrarEntrada()
En el botón Salir (btnSalir) escribimos esto:
Me.Close()
Aqui un ejemplo de la pantalla funcionando:
Exelentes Ejercicios
ResponderEliminarGracias