domingo, 30 de marzo de 2014

Punto de Venta con VB y MySQL (5)

Código a los formularios

En la entrada anterior se creó el módulo para conectarnos a nuestra base de datos y poder interactuar a través de nuestra aplicación.

Hoy se introducirá el código al resto de los formularios.

Doy por echo de que ya saben conceptos básicos del lenguaje SQL, sino, les puedo explicar con más detalle el código.

Perfeccionando al contenedor
 
Abrimos el Formulario:
frmPuntoVenta



Propiedad:

IsMdiContainer                  –  True

BackGroundImage             –   Insertamos logo de la empresa

BackGroundImageLayout –  Stretch

MaximizeBox                      –  False

MinimizeBox                       –  False

Size                                       –  900, 600

WindowState                      –  Normal


Perfeccionando a los formularios hijos
 
Abrimos el Formulario:
frmProducto



Propiedad:

IsMdiContainer  –  False

MaximizeBox      –  True

MinimizeBox       –  True

WindowState      –  Maximized

 
Y lo vamos reordenado.

Agregamos un txt más al inicio con el nombre de TxtId




Deseamos que inicie mostrando todos los datos, y además, que solo el txtNombre esté habilitado. Doble clic al formulario y colocar en el Load:

' Este código llama al procedimiento ActualizarDatos, e inhabilita todas las cajas de texto (TextBox)

ActualizarDatos()

        TxtId.Visible = False

        TxtDescripción.Enabled = False

        TxtMarca.Enabled = False

        TxtPrecio.Enabled = False

        TxtCosto.Enabled = False

        TxtStok.Enabled = False

        TxtMinimo.Enabled = False

        Txtproveedor.Enabled = False



 Se realiza el procedimiento ActualizarDatos()

'En este método cargamos la información de una tabla desde el MySql
' DGProducto es el DataGridView
'Se crea la variable consulta de tipo cadena, y le colocamos la sentencia de mysql para realizar una búsqueda

Private Sub ActualizarDatos()  
' Se muestran todos los campos de la tabla productos, donde el nombre sea igual a lo que se escriba en la caja de texto.
' A partir de la primera letra que se pulse empieza a realizar el "filtrado de datos"

   Dim consulta As String = " select * from productos where nombre like'" & TxtNombre.Text & "%'"
'  Los datos que aparecen en el DataGridView son en base a la consulta y se conecta al módulo de TodoSQL

   DGProducto.DataSource = SQLSEL(consulta).Tables("datos").DefaultView

'Cerramos la conexión con el servidor
   conex.Close() 

    End Sub


 Se llama al procedimiento ActualizarDatos() en el TxtNombre, para filtrar datos


 ActualizarDatos()


Código al botón Nuevo


       'Limpia las cajas de texto

        Me.TxtId.Text = ""

        Me.TxtNombre.Text = ""

        Me.TxtDescripción.Text = ""

        Me.TxtMarca.Text = ""

        Me.TxtPrecio.Text = ""

        Me.TxtCosto.Text = ""

        Me.TxtStok.Text = ""

        Me.Txtproveedor.Text = ""

        Me.TxtMinimo.Text = ""

        Me.TxtNombre.Focus()

'Convierte en visibles los demás TextBox

        TxtDescripción.Enabled = True

        TxtMarca.Enabled = True

        TxtPrecio.Enabled = True

        TxtCosto.Enabled = True

        TxtStok.Enabled = True

        TxtMinimo.Enabled = True

        Txtproveedor.Enabled = True




 Ahora, lo que se desea, es que cuando le de clic al DataGridView, me muestre los datos en los TextBox.

Con el control DataGridView se puede mostrar y editar los datos en tablas a partir de numerosos tipos diferentes de orígenes de datos. 


El enlace de datos al control DataGridView es sencillo e intuitivo y en muchos casos es tan fácil como establecer la propiedad DataSource


Propiedad DataGridView.Item

Proporciona un indizador para obtener o establecer en la celda situada en la intersección de fila y columna especificadas.



 Procedimiento Transportar()


Se tiene que saber la columna y la fila en que se encuentra el dato que queremos pasar a los TextBox.

Por default, la primera columna, la que está a la izquierda es 0, la siguiente es 1, y así consecutivamente.

La columna de nuestra tabla siempre sabremos su posición, en cambio, el de la fila no, para eso está la propiedad:

CurrentCellAddress, que obtiene los índices de fila y columna de la celda activa actualmente.

        TxtId.Text = DGProducto.Item(0, DGProducto.CurrentCellAddress.Y).Value

Procedimiento Transportar
Private Sub Transportar()

        'Convierte en visibles los demás TextBox

        TxtDescripción.Enabled = True

        TxtMarca.Enabled = True

        TxtPrecio.Enabled = True

        TxtCosto.Enabled = True

        TxtStok.Enabled = True

        TxtMinimo.Enabled = True

        Txtproveedor.Enabled = True


TxtId.Text = DGProducto.Item(0, DGProducto.CurrentCellAddress.Y).Value

TxtNombre.Text = DGProducto.Item(1, DGProducto.CurrentCellAddress.Y).Value
TxtDescripción.Text = DGProducto.Item(2, DGProducto.CurrentCellAddress.Y).Value

TxtMarca.Text = DGProducto.Item(3, DGProducto.CurrentCellAddress.Y).Value

TxtPrecio.Text = DGProducto.Item(4, DGProducto.CurrentCellAddress.Y).Value

TxtCosto.Text = DGProducto.Item(5, DGProducto.CurrentCellAddress.Y).Value

TxtMinimo.Text = DGProducto.Item(8, DGProducto.CurrentCellAddress.Y).Value

Txtproveedor.Text = DGProducto.Item(6, DGProducto.CurrentCellAddress.Y).Value

TxtStok.Text = DGProducto.Item(7, DGProducto.CurrentCellAddress.Y).Value

       

End Sub

Establecer que cuando le de un clic al DatagridView, pase los datos a los TextBox
Transportar()

Código al botón Eliminar
If MsgBox("¿Seguro que desea eliminar el Producto?", vbYesNo + vbCritical) = vbYes Then

            MsgBox("Eliminado")

            Dim strEliminar As String = "delete from productos where idproducto='" & DGProducto.Item(0, DGProducto.CurrentCellAddress.Y).Value & "'"

            SQLIDU(strEliminar)

            conex.Close() 'Cerramos la conexión con el servidor

            ActualizarDatos()

        Else

            MsgBox("No Eliminado")

        End If

Código al botón Guardar


Dim insertar As String = "insert into productos values('" & TxtNombre.Text & "',  '" & TxtDescripción.Text & "','" & _

                     TxtMarca.Text & "','" & TxtPrecio.Text & "','" & TxtCosto.Text & "','" & TxtMinimo.Text & "','" & _

                     TxtStok.Text & "', '" & Txtproveedor.Text & "')"

         SQLIDU(insertar)

         conex.Close()

          MsgBox("datos agregados")


Código al botón Modificar / Actualizar


If MsgBox("¿Desea Editar este Producto?", vbYesNo + vbQuestion) = vbYes Then

                Try

                    Dim Modificar As String = "update productos set nombre='" & TxtNombre.Text & "'," & _

                                              "descripcion='" & TxtDescripción.Text & "'," & _

                                              "marca='" & TxtMarca.Text & "'," & _

                                              "precio=" & TxtPrecio.Text & "," & _

                                              "costo=" & TxtCosto.Text & "," & _

                                              "minimo=" & TxtMinimo.Text & "," & _

                                              "stok=" & TxtStok.Text & "," & _

                                              "idproveedorpro=" & Txtproveedor.Text & " where idproducto =" & TxtId.Text & ""

                    MsgBox(Modificar)

                    SQLIDU(Modificar)

                    conex.Close()

                    ActualizarDatos()

                    MsgBox("Producto Modificado", vbInformation)

                Catch

                End Try

End If


Perfeccionando el código


¿Qué pasaría si el usuario da un clic al DataGridView, modifica los datos en el TextBox y en lugar de pulsar el botón Modificar, pulsa el botón guardar?



Para evitar eso, se pueden manejar tres opciones posibles y manejarlo por medio de un Si condicional:

Opción 0: Iniciar en filtrado

Opción 1: Guardar el dato

Opción 2: Actualizar / Modificar el dato



Se declara una variable en el formulario

Public Class frmProducto

Dim ACCION As Integer = 0



Al final del código del botón nuevo le añadimos:

ACCION = 1


Al final del código del procedimiento Transportar() le añadimos:

ACCION = 2

Perfeccionando el código del botón Guardar

     If ACCION = 1 Then

         Dim insertar As String = "insert into productos values('" & TxtNombre.Text & "',  '" & TxtDescripción.Text & "','" & _

                     TxtMarca.Text & "','" & TxtPrecio.Text & "','" & TxtCosto.Text & "','" & TxtMinimo.Text & "','" & _

                     TxtStok.Text & "', '" & Txtproveedor.Text & "')"

         SQLIDU(insertar)

         conex.Close()

          MsgBox("datos agregados")


ElseIf ACCION = 2 Then

            If MsgBox("¿Desea Editar este Producto?", vbYesNo + vbQuestion) = vbYes Then

                Try

                    Dim Modificar As String = "update productos set nombre='" & TxtNombre.Text & "'," & _

                                              "descripcion='" & TxtDescripción.Text & "'," & _

                                              "marca='" & TxtMarca.Text & "'," & _

                                              "precio=" & TxtPrecio.Text & "," & _

                                              "costo=" & TxtCosto.Text & "," & _

                                              "minimo=" & TxtMinimo.Text & "," & _

                                              "stok=" & TxtStok.Text & "," & _

                                              "idproveedorpro=" & Txtproveedor.Text & " where idproducto =" & TxtId.Text & ""

                    MsgBox(Modificar)

                    SQLIDU(Modificar)

                    conex.Close()

                    ActualizarDatos()

                    MsgBox("Producto Modificado", vbInformation)

                Catch

                End Try


Else

                MsgBox("Operacion Cancelada", vbInformation)

                conex.Close()

                ActualizarDatos()

            End If

        End If


Cambiando el código del botón Modificar

ACCION = 2


Por último, código del botón Salir


        Me.Hide()

        frmPuntoVenta.Show()

Quizá haya dudas acerca de donde colocar el código, por eso les comparto el proyecto completo, y en posteriores entradas, iré explicando detalles del código restante, así como del Crystal Report y generar un Instalador.




Observación: Crear en la Base de Datos en MySQL a un usuario con cargo de contador, para que se pueda loguear en la aplicación; pueden usar esta sentencia:
insert into empleado(idempleado, nombre, direccion, telefono, usuario, contrasenia, sexo, fecha_nacimiento, cargo)
values (100, 'Iván Vega', 'Izamal', 9999999999, 'Ivan', 'Vega', 'H', '1984-06-24', 'Contador');
Si en MySQL creas a este usuario, al momento de loguearte, usar como usuario Ivan y como contraseña Vega.


Observación2: Quizá en algunos módulos de la aplicación les genere error, debido a que aún no les he explicado lo de Crystal Reports, pero pueden ver el diseño y en donde van los códigos.

Punto de Venta con VB y MySQL (4)

Módulo de MYSQL

Después de 7 meses de no seguir con el tutorial de Punto de Venta (Actividades de Docencia, Cursos, Maestría, Actualización, Mejora Continua, etc.) les comparto esta entrega en donde se hará un módulo (o una clase) en nuestra aplicación, para enlazar a MySQL.

Módulos en Visual Basic

Podemos añadir nuevos componentes a nuestros proyectos mediante el uso de formularios y módulos. 

De esta forma podemos conseguir modularizar la aplicación y que sea más sencilla de mantener y actualizar.

Tienen extensión .vb y se pueden añadir tantos como queramos, tienen el gran potencial de que pueden ser reutilizados en otros proyectos.


Permiten simplificar tareas comunes en el código, como manipulación de cadenas, realización de cálculos matemáticos, obtención de información del sistema, realización de operaciones de archivo y directorio, conexión a una base de datos, etc.



Agregar módulo

 Seleccionar el ícono de agregar nuevo elemento y elegir de las opciones el de Agregar módulo.



Llamar al módulo TodoSQL 


¿Qué es ADO.NET?


ADO.NET es la tecnología principal para conectarse aun gestor de bases de datos, con un alto nivel de abstracción, lo que nos permite olvidarnos de los detalles de bajo nivel de las bases de datos.


ADO.NET proporciona diferentes clases del nombre de espacio System.Data dentro de las cuáles, destacaremos por encima de todas, la clase DataView, la clase DataSet y la clase DataTable.


 Lenguaje SQL


›El procedimiento que se intenta seguir cuando se construya un programa ADO.Net que tenga que manipular datos deberá seguir los siguientes pasos:

›1.- Crear una conexión o enlace a la base de datos.

›2.- Abrir la conexión a la base de datos.

›3.- Crear ADAPTER o COMMAND y cargarlo con la instrucción SQL.

›4.- Crear el DataSet y cargarlo a través del Adapter o del Command.

›5.- Cargar el DataGridView con el dataset y enlazarlo

›6.- Procesar el DataGridView (editar un renglón, agregar un renglón, modificar un renglón, etc.)

›7.- Cerrar la conexión



Un resumen de la teoría de líneas arriba, es:

Si se desea seleccionar o buscar datos, hay dos maneras:

  • Ver los datos en el DataGridView
    1. Establecer la conexión.
    2. Utilizar Mysq DataAdapter
    3. Utilizar un Dataset
     
  • Recorrer los datos
    1.  Establecer la conexión
    2. Utilizar Mysql Command
    3. Utilizar DataReader
  • Si se desea hacer inserción, eliminación o actualización de datos:
  1. Establecer la conexión.
  2. Utilizar Mysq Command.

Instalar el conector .NET de MySQL


Descargar el MySQL Connector Net 6.6.5

Una vez descargado el conector, instalarlo con doble clic, siguiente, siguiente (como la mayoría de los instaladores; se instala en Archivos de Programa)

Una vez instalado el conector, clic derecho sobre el nombre del programa y elegir Agregar Referencia


Del cuadro que sale, elegir la opción .NET y buscar MySQL.Data (Si no se encuentra, localizarlo en la opción Examinar y buscar la ruta C:\Program Files (x86)\MySQL\MySQL Connector Net 6.6.5\Assemblies\v4.0)



 Código al módulo TodoSQL


´ Para utilizar la librería de MySQL
 Imports MySql.Data.MySqlClient

Module TodoSQL
    Public conex As New MySqlConnection

    Public Sub conectar()
        Try
        ´ Para establecer una conexión con MySQL es necesario especificar el servidor (server, y puede ser localhost si es que la BD está en la PC o Lap, o la dirección ip Local, o la dirección de una red), el usuario (el user, casi siempre es root o admin), la contraseña (el password, que puede ser admin, o la contraseña definida, o sin contraseña) y el nombre de la BD
            conex.ConnectionString = "server=localhost;user=admin;password=admin;database=puntoventa"
            conex.Open()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub

   ´Esta función es para cuando se desea seleccionar, recorrer o buscar datos (comando Select)
    Public Function SQLSEL(ByVal Sql As String) As DataSet
        conectar()
        Dim adaptador As New MySqlDataAdapter(Sql, conex)
        Dim RsDatos As New DataSet
        adaptador.Fill(RsDatos, "datos")
        Return RsDatos
        conex.Close()
    End Function

   ´Esta función es para cuando se desea insertar, eliminar o modificar datos (comando Insert, Delete o Update)
    Public Sub SQLIDU(ByVal SQL)
        conectar()
        Try
            Dim comando As New MySqlCommand(SQL, conex)
            comando.ExecuteNonQuery()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        conex.Close()
    End Sub

   ´Esta función es para cuando se desea trabajar con un ComboBox
    Public Function SQLCOMBO(ByVal sql As String) As DataTable
        Try
            conectar()
            Dim adaptar As New MySqlDataAdapter(sql, conex)
            Dim Data As New DataTable

            adaptar.Fill(Data)
            Return Data

        Catch ex As Exception

        End Try
    End Function
End Module



Descargar el código del Módulo TodoSQL
Descargar el MySQL Connector Net 6.6.5
Descargar el pdf de esta lección 

Cualquier duda o comentario no dudes en escribirme.