Sistema de Almacén Visual Basic (Parte 5)


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:

ObjetoPropiedadValor
LabelNamelblFechaSalida
TextFecha Salida:
DateTimePicker NamedtpFechaSalida
FormatCustom
CustomFormatdd/MM/yyyy
LabelNamelblResponsable
TextResponsable de la Salida:
TextBoxNametxtResponsable
LabelNamelblIdArticulo
TextArticulo:
TextBoxNametxtIdArticulo
LabelNamelblCantidad
TextCantidad:
TextBoxNametxtCantidad
ButtonNamebtnAgregar
TextAgregar
ButtonNamebtnGrabar
TextGrabar
ButtonNamebtnCancelar
TextCancelar
ListViewNamelvSalida
FullRowSelectTrue
GridLinesTrue
HideSelectionFalse


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.IO
Escribiremos 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:



Regresar a la parte 4|Ir a la parte 6

¡Hacer clic en +1 No te Cuesta Nada!

1 comentario: