lunes, febrero 21, 2011

VB 6.0 - Mysql con procedimientos almacenados en Visual Basic 6.0.


"Si usa algún código del siguiente tutorial, den el icono de ME GUSTA del Facebook que se encuentra en su mano derecha, para que se vuelva Seguidor del Blog y también comentenos que tal les pareció el tutorial"

1. Entorno


  • Visual Basic 6.0.
  • MySQL 5.0.

2. Introducción


Visual Basic es un lenguaje de programación orientado a eventos, desarrollado por el alemán Alan Cooper para Microsoft. Este lenguaje de programación es un dialecto de BASIC, con importantes agregados. Su primera versión fue presentada en 1991, con la intención de simplificar la programación utilizando un ambiente de desarrollo completamente gráfico que facilitara la creación de interfaces gráficas y, en cierta medida, también la programación misma. Y el siguiente tutorial podran ver un ejemplo de como comunicar Visual Basic 6.0 con una base de datos MySQL 5.0 que tiene procedimientos almacenados. Desarrollaremos un ejemplo de mantenimiento a una tabla que espero les sea de su utilidad.

3. Desarrollo


3.1. Driver

Primero debemos de instalar el Driver de MySQL para que se pueda comunicar Visual Basic 6.0 con MySQL 5.0 para eso lo descargamos del siguiente LINK

3.2. Creando Base de Datos con MySQL

A continuación les paso el script para crear la base y la tabla que vamos a usar en el ejemplo

--
-- Creando la base de datos
--
CREATE DATABASE IF NOT EXISTS bdblog;
--
-- Usando la base de datos
--
USE bdblog;
--
-- Creando la tabla
--
DROP TABLE IF EXISTS `visitante`;
CREATE TABLE `visitante` (
  `codigo` int(11) NOT NULL AUTO_INCREMENT,
  `nombre` varchar(50) NOT NULL,
  `fechaNacimiento` datetime NOT NULL,
  `peso` decimal(18,2) NOT NULL,
  PRIMARY KEY (`codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


3.3. Creando los procedimiento

El script de los procedimientos almacenados que vamos a usar

-- Insertar Visitante
DELIMITER $$

DROP PROCEDURE IF EXISTS `spI_visitante` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `spI_visitante`(
   _codigo  int ,
   _nombre  varchar(50) ,
   _fechaNacimiento  datetime ,
   _peso  decimal(18, 2)
)
BEGIN

SELECT IFNULL(MAX(codigo),0)+1 into _codigo FROM `visitante`;
INSERT INTO `visitante`(
   `codigo`,
   `nombre`,
   `fechaNacimiento`,
   `peso`
)
VALUES (
   _codigo,
   _nombre,
   _fechaNacimiento,
   _peso
);
END $$

DELIMITER ;


-- Actualizar Visitante
DELIMITER $$

DROP PROCEDURE IF EXISTS `spU_visitante` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `spU_visitante`(
   _codigo  int ,
   _nombre  varchar(50) ,
   _fechaNacimiento  datetime ,
   _peso  decimal(18, 2)
)
BEGIN

UPDATE visitante
SET 
   `nombre` = _nombre,
   `fechaNacimiento` = _fechaNacimiento,
   `peso` = _peso
WHERE
    `codigo` = _codigo
;
END $$

DELIMITER ;


-- Mostrar todos los Visitante
DELIMITER $$

DROP PROCEDURE IF EXISTS `spF_visitante_all` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `spF_visitante_all`(
)
BEGIN

select codigo, nombre, fechaNacimiento, peso from visitante order by nombre;
END $$

DELIMITER ;

3.4. Creando el proyecto en Visual Basic 6.0.

Debemos de crear un proyecto en Visual Basic 6.0 y luego diseñamos el siguiente formulario






















Y las referencias del proyecto deberian ser las siguientes:



















3.4.1. Métodos de soporte

Dentro del formulario vamos a crear unos métodos que den soporte a nuestro formulario. Como el evento limpiar, que limpia todos los textbox o el método habilitar que habilita los controles.

Option Explicit

'Para saber si es un nuevo registro
Dim nuevo As Boolean
'Para saber si vamos a modificar
Dim modificar As Boolean
'Habilita los controles que son textbox, combobox, dtpicker
Private Sub habilitar(ByVal blnEstado As Boolean)
  Dim crl As Control
  For Each crl In Me.Controls
    If TypeOf crl Is TextBox Or TypeOf crl Is ComboBox Or TypeOf crl Is DTPicker Then
      crl.Enabled = blnEstado
    End If
  Next
End Sub
'Limpia las cajas de texto
Private Sub limpiar()
  Dim crl As Control
  For Each crl In Me.Controls
    If TypeOf crl Is TextBox Then
      crl.Text = ""
    End If
  Next
End Sub
'Habilita o deshabilita los botones
Private Sub botones()
  If nuevo = True Or modificar = True Then
    habilitar True
    btnNuevo.Enabled = False
    btnGuardar.Enabled = True
    btnModificar.Enabled = False
    btnCancelar.Enabled = True
  Else
    habilitar False
    btnNuevo.Enabled = True
    btnGuardar.Enabled = False
    btnModificar.Enabled = True
    btnCancelar.Enabled = False
  End If
End Sub
'Cargamos los metodos en el load
Private Sub Form_Load()
  nuevo = False
  modificar = False
  habilitar False
  botones
  'Este metodo lo implementamos despues
  llenarListView
End Sub

3.4.2. Método Conectar

El siguiente método nos permite conectarnos a la base de datos que esta en MySQL desde Visual Basic 6.0.

Public Function Conectar() As ADODB.Connection
    Dim con As ADODB.Connection
    Set con = New ADODB.Connection
    con.CursorLocation = adUseClient
    con.Open "DRIVER={MySQL ODBC 3.51 Driver};" _
                        & "SERVER=localhost;" _
                        & "DATABASE=bdblog;" _
                        & "UID=root;PWD=clave;PORT=3306;OPTION=131072"
    Set Conectar = con
End Function


3.4.3. Método llenar listView

Private Sub llenarListView()
    With lvwVisitante
        .Refresh
        .ListItems.Clear
    End With
    Dim sqlcon As ADODB.Connection
    Set sqlcon = Me.Conectar
    Dim sqlrec As New ADODB.Recordset
    sqlrec.Open "call spF_visitante_all()", sqlcon, adOpenStatic, adLockOptimistic
       Dim Item As ListItem
    While Not sqlrec.EOF
        Set Item = lvwVisitante.ListItems.Add(, , sqlrec!nombre)
        Item.Tag = sqlrec!nombre
        Item.SubItems(1) = VBA.Format$(sqlrec!fechaNacimiento, "dd-MM-yyyy")
        Item.SubItems(2) = "" & sqlrec!peso
        Item.SubItems(3) = "" & sqlrec!Codigo
        sqlrec.MoveNext
    Wend
    lvwVisitante.Refresh
    sqlrec.Close
    sqlcon.Close
    Set sqlrec = Nothing
    Set sqlcon = Nothing
End Sub

3.4.4. Método para insertar un visitante

Este método sirve para insertar un visitante a nuestra base de datos y llama al procedimiento almacenado "spI_Visitante"

Public Function insertarvisitante() As Boolean
On Error GoTo Problemas
    Dim rpta As Boolean ' Variables que nos indicar si se inserto el Registro
    rpta = False
    Dim sqlcon As ADODB.Connection ' Variable que sirve para establecer la conexion con MySQL
    Set sqlcon = Me.Conectar
    Dim sqlcmd As New ADODB.Command ' El comando que vamos a ejecutar --> Insertar un registro a la tabla visitante
    With sqlcmd
        .CommandText = "call spI_visitante(" & _
        "?," & _
        "?," & _
        "?," & _
        "?" & _
        ")"
        .ActiveConnection = sqlcon ' Establecemos la conexion al comando
        .CommandType = adCmdText ' Va a ejecutar un Store Procedure
        .Prepared = True ' La sentencia esta prepara para ejecutarse
    End With
    'Parametros que tendra el procedimiento almacenado spI_visitante
    Dim paramcodigo As New ADODB.Parameter
    Dim paramnombre As New ADODB.Parameter
    Dim paramfechaNacimiento As New ADODB.Parameter
    Dim parampeso As New ADODB.Parameter
    'Establecemos los valores para los parametros del procedimiento almacenado spI_visitante
    With paramcodigo
        .Name = "_codigo"
        .Size = 0
        .Direction = adParamInput
        .Type = adInteger
        .Value = 0
    End With
    With paramnombre
        .Name = "_nombre"
        .Size = 50
        .Direction = adParamInput
        .Type = adVarChar
        .Value = UCase(Me.txtNombre.Text)
    End With
    With paramfechaNacimiento
        .Name = "_fechaNacimiento"
        .Size = 0
        .Direction = adParamInput
        .Type = adDate
        .Value = Me.dtpFechaNacimiento.Value
    End With
    With parampeso
        .Name = "_peso"
        .Size = 0
        .Direction = adParamInput
        .Type = adDecimal
        .Precision = 18
        .NumericScale = 2
        .Value = Me.txtPeso.Text
    End With
    'Agregamos los parametros al comando
    sqlcmd.Parameters.Append paramcodigo
    sqlcmd.Parameters.Append paramnombre
    sqlcmd.Parameters.Append paramfechaNacimiento
    sqlcmd.Parameters.Append parampeso
    'Ejecutamos el procedimiento
    sqlcmd.Execute
    'Limpiamos los recursos
    Set sqlcmd = Nothing
    sqlcon.Close
    Set sqlcon = Nothing
    insertarvisitante = True
    Exit Function
Problemas:
    insertarvisitante = False
    Exit Function
End Function

3.4.5. Método para actualizar un visitante

Este método sirve para actualizar un visitante a nuestra base de datos y llama al procedimiento almacenado "spU_Visitante"

Public Function actualizarvisitante() As Boolean
On Error GoTo Problemas
    Dim rpta As Boolean ' Variables que nos indicar si se actualizo el Registro
    rpta = False
    Dim sqlcon As ADODB.Connection ' Variable que sirve para establecer la conexion con MySQL
    Set sqlcon = Me.Conectar
    Dim sqlcmd As New ADODB.Command ' El comando que vamos a ejecutar --> Actualizar un registro a la tabla visitante
    With sqlcmd
        .CommandText = "call spU_visitante(" & _
        "?," & _
        "?," & _
        "?," & _
        "?" & _
        ")"
        .ActiveConnection = sqlcon ' Establecemos la conexion al comando
        .CommandType = adCmdText ' Va a ejecutar un Store Procedure
        .Prepared = True ' La sentencia esta prepara para ejecutarse
    End With
    'Parametros que tendra el procedimiento almacenado spI_visitante
    Dim paramcodigo As New ADODB.Parameter
    Dim paramnombre As New ADODB.Parameter
    Dim paramfechaNacimiento As New ADODB.Parameter
    Dim parampeso As New ADODB.Parameter
    'Establecemos los valores para los parametros del procedimiento almacenado spI_visitante
    With paramcodigo
        .Name = "_codigo"
        .Size = 0
        .Direction = adParamInput
        .Type = adInteger
        .Value = Me.lblCodigo.Caption
    End With
    With paramnombre
        .Name = "_nombre"
        .Size = 50
        .Direction = adParamInput
        .Type = adVarChar
        .Value = UCase(Me.txtNombre.Text)
    End With
    With paramfechaNacimiento
        .Name = "_fechaNacimiento"
        .Size = 0
        .Direction = adParamInput
        .Type = adDate
        .Value = Me.dtpFechaNacimiento.Value
    End With
    With parampeso
        .Name = "_peso"
        .Size = 0
        .Direction = adParamInput
        .Type = adDecimal
        .Precision = 18
        .NumericScale = 2
        .Value = Me.txtPeso.Text
    End With
    'Agregamos los parametros al comando
    sqlcmd.Parameters.Append paramcodigo
    sqlcmd.Parameters.Append paramnombre
    sqlcmd.Parameters.Append paramfechaNacimiento
    sqlcmd.Parameters.Append parampeso
    'Ejecutamos el procedimiento
    sqlcmd.Execute
    'Limpiamos los recursos
    Set sqlcmd = Nothing
    sqlcon.Close
    Set sqlcon = Nothing
    actualizarvisitante = True
    Exit Function
Problemas:
    actualizarvisitante = False
    Exit Function
End Function

3.4.6. Eventos de los controles del formulario

A continuación les mostraremos los eventos de los botones del formulario y del evento double clic del listview

'Evento clic del boton cancelar
Private Sub btnCancelar_Click()
    nuevo = False
    modificar = False
    botones
    limpiar
    Me.lblCodigo.Caption = ""
End Sub

'Evento clic del boton guardar
Private Sub btnGuardar_Click()
    Dim respuesta As Integer
    Dim rpta As Boolean
    rpta = False
    If nuevo = True Then
         rpta = Me.insertarvisitante
    Else
        respuesta = MsgBox("Desea guardar los cambios realizados", 52, "MENSAJE")
        If respuesta = vbYes Then
             rpta = Me.actualizarvisitante
        End If
    End If
    If rpta = True Then
        Dim men As String
        men = "Se "
        If nuevo = True Then
            men = men + "registro "
        Else
            men = men + "actualizo "
        End If
        men = men + "de forma correcta al Visitante"
        MsgBox men, vbDefaultButton1, "MENSAJE"
    Else
        MsgBox "No se realizo el proceso correctamente", vbCritical, "ERROR"
    End If
    nuevo = False
    modificar = False
    botones
    limpiar
    llenarListView
    Me.lblCodigo.Caption = ""
End Sub

'Evento clic del boton modificar
Private Sub btnModificar_Click()
    If lblCodigo.Caption <> "" Then
        modificar = True
        botones
    Else
        MsgBox "Debe de buscar un dato para modificar", vbCritical, "ERROR"
    End If
End Sub

Private Sub btnNuevo_Click()
    nuevo = True
    modificar = False
    botones
    limpiar
    Me.txtNombre.SetFocus
    Me.lblCodigo.Caption = ""
End Sub

'Evento double clic del lisview
Private Sub lvwVisitante_DblClick()
On Error GoTo Problemas
    If lvwVisitante.ListItems.Count = 0 Then Exit Sub
    If lvwVisitante.SelectedItem Is Nothing Then Exit Sub
    Me.txtNombre.Text = lvwVisitante.SelectedItem.Tag
    Me.dtpFechaNacimiento.Value = lvwVisitante.SelectedItem.SubItems(1)
    Me.txtPeso.Text = lvwVisitante.SelectedItem.SubItems(2)
    Me.lblCodigo.Caption = lvwVisitante.SelectedItem.SubItems(3)
    Exit Sub
Problemas:
    MsgBox "Debe de seleccionar un Visitante", vbCritical, "ERROR"
    Exit Sub
End Sub

4. Ejemplo de la Aplicación


15 comentarios:

hola que tal , no podrias dejar alguna descarga de este codigo por favor? deverdad lo necesito

Lo buscare para subir .. Porque esos códigos se borraron

Parece ser un buen tutorial, intentaré hacerlo en casa.
....principiante.

espero que te sea util chalo

Muy bueno ;)
Lo unico... ¿A donde creo esa base de datos?

La base de datos esta en mysql y esta al inicio del proyecto. Y ahi esta el query

Sí, pero...
¿La base de datos la creo en VB? ¿O en donde?

En el mysql query browser lo puedes poner.

hola estudiando una ing en sistemas voy cursando por el momento la materia de base de datos y nos dejaron hacer una bd donde la enlacemos con visual me poderias mandaar un tutorial mas completo porfa este es mi correo sikojaom_111@hotmail.com te lo agradecria bastante

tambien ando cursando sistemas y me gustaria ver manuales muy completos de como programar en visual

gracias por los aportes
este es mi correo para quien me yuden con lo manuales
juancaos11@hotmail.com

hola que tal! Henry podrias hacer un videotutorial de todo el procedimiento por favor.

otra consulta este tipo de conexión sirve para una red lan?

Muy bueno tu ejemplo mas la parte de los SP de MySQL que son como misterios jejeje S2 Gracias por compartirlo :D

hola esta bueno el post si tuvieras mas ejemplos quisiera q me psaras a luis_gonzaless@yahoo.com.ar desde ya gracias

etsa muy fachero el post no tndriass algun otro codigo de vb6 y mysql cualqier cosa a luis_gonzaless@yahoo.com.ar desde ya graciias

Excelente código, simple y muy didáctico, ya lo mejore. Muchas Gracias por compartirlo