6.3. Cursores
Los cursores se utilizan para manejar las sentencias SELECT. Un cursor esta formado por
un conjunto de registros devueltos por una instrucción SQL del tipo SELECT. Desde un
punto de visto interno a la base de datos, los cursores son segmentos de memoria utilizados
para realizar operaciones con los registros devueltos tras ejecutar una sentencia SELECT.
Reciben el nombre de cursores implícitos, cuando la sentencia SELECT regresa solo un
registro. Para procesar instrucciones SELECT que devuelvan más de una fila, son
necesarios cursores explicítos combinados con un estructura de bloque.
Un cursor admite el uso de parámetros. Los parámetros deben declararse junto con el
cursor.
El siguiente diagrama representa como se procesa una instrucción SQL a través de un
cursor.
Fases de un cursor MYSQL
Fases de un cursor ORACLE
Cursores implícitos
Se utilizan cuando la sentencia SELECT devuelve un solo registro. En cada cursor
implicito debe existir palabra reservada INTO.
Las variables que reciben los datos devueltos por el cursor tienen que contienen el mismo
tipo de dato que las columnas de la tabla.
MySQL no soporta esta clase de cursores pero podemos visualizarlos así.
Importante poner un delimitador nuevo, (suele ser ';') ya que si no se cambia toma el ; como
delimitador, es decir que seria el final del procedimiento o función (Línea 2).
También es posible usar cursores dentro de un procedimiento almacenado. Observe el
siguiente ejemplo que a diferencia de los ejercicios anteriores no genera error si la consulta
no regresa registros. Si usamos %ROWCOUNT es posible conocer cuántos registros
regresa la consulta 0 ... n.
BEGIN inscripcionCursores('Compiladores','LILIANA','ENEJUN09',90); END;
DECLARE
fechas dolar.fecha%TYPE ;
precioActual dolar.precio%TYPE;
BEGIN
SELECT fecha, precio INTO fechas, precioActual
FROM dolar WHERE fecha = (SELECT MAX(precio)
FROM dolar);
dbms_output.put_line(fechas || ' ' || precioActual);
END;
Ejemplo: Video Patito. Obtener el director de una determinada pelicula.
DROP PROCEDURE IF EXISTS dirige;
DELIMITER $$
CREATE PROCEDURE dirige (IN _Pelicula CHAR(40),
OUT _Director CHAR(50))
BEGIN
DECLARE _Dirige CURSOR FOR
SELECT a.NombreActor
FROM actua ac, rol r, pelicula p, actor a
WHERE ac.idActor = a.idActor
AND ac.idPelicula = p.idPelicula
AND ac.idRol = r.idRol
AND r.NombreRol = 'Director'
AND p.NombrePelicula = _Pelicula;
OPEN _Dirige;
FETCH _Dirige INTO _Director;
CLOSE _Dirige;
END$$
DELIMITER ;
-- Llamada al procedimiento
CALL dirige('Contrabando', @Quien);
SELECT @Quien;
DECLARE
nombreDirector CHAR(50);
BEGIN
SELECT a.NombreActor INTO nombreDirector
FROM actua ac, rol r, pelicula p, actor a
WHERE ac.idActor = a.idActor
AND ac.idPelicula = p.idPelicula
AND ac.idRol = r.idRol
AND r.NombreRol = 'Director'
AND p.NombrePelicula = 'Contrabando';
dbms_output.put_line('El director de
Contrabando es: ' ||
nombreDirector);
END;
Cursores explícitos:
Se utilizan cuando la sentencia SELECT puede devolver varios registros. También se
pueden utilizar en consultas que devuelvan un solo registro por razones de eficiencia con
respecto a los cursores implícitos, eficiencia que mejorará especialmente si el cursor
explícito se tiene que ejecutar varias veces dentro del bloque de código.
Un cursor explícito tiene que ser definido previamente como cualquier otra variable
cursores explícitos admiten el uso de parámetros. Los parámetros deben declararse junto
con el cursor.
Ejemplo: Reloj checador
Iniciaremos creando las siguientes tablas
CREATE TABLE empleados (
idEmpleado INTEGER AUTO_INCREMENT,
nombre CHAR(40) NOT NULL,
PRIMARY KEY (idEmpleado, nombre)
) ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_spanish_ci;
CREATE TABLE checar (
idChecar INTEGER AUTO_INCREMENT,
fecha DATE NOT NULL,
hora TIME NOT NULL,
idEmpleado INT NOT NULL,
PRIMARY KEY (idchecar),
CONSTRAINT fk_idEmpleado FOREIGN KEY (idEmpleado )
REFERENCES empleados (idEmpleado )
) ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_spanish_ci;
Ingresaremos los siguientes empleados
INSERT INTO empleados VALUES (1,'Jorge Pérez García');
INSERT INTO empleados VALUES (2,
'Roberto Carlos Hernández Alamillo');
INSERT INTO empleados VALUES (3,'Francisco Argona Luis');
Declaramos ahora el cursor (línea 9 al 12) y el procedimiento correspondiente
DROP PROCEDURE IF EXISTS checando;
DELIMITER $$
CREATE PROCEDURE checando(IN fechas DATE,
IN horas TIME,
IN id INTEGER,
OUT mensaje CHAR(20))
BEGIN
DECLARE n INTEGER DEFAULT 0;
DECLARE nChecadas CURSOR FOR
SELECT COUNT(*) FROM checar WHERE (idEmpleado = id)
AND (fecha = fechas);
OPEN nChecadas;
FETCH nChecadas INTO n;
CLOSE nChecadas;
IF (n <= 1) THEN
IF (n = 0) THEN
INSERT INTO checar (fecha, hora, idEmpleado)
VALUES (fechas, horas, id);
SET mensaje = 'Entrada';
ELSE
INSERT INTO checar (fecha, hora, idEmpleado)
VALUES (fechas, horas, id);
SET mensaje = 'Salida';
END IF;
ELSE
SET mensaje = 'No jugar';
END IF;
END$$
DELIMITER ;
El comando DECLARE (línea 5) sirve para declarar variables locales y cursores. Solo
funcionan dentro de procedimientos inmediantamente del BEGIN.
Ejemplo: Tipo de cambio para solventar obligaciones denominadas en dólares de los
EE.UU.A., pagaderas en la República Mexicana.Fuente:
DROP PROCEDURE IF EXISTS precioDolar;
DELIMITER $$;
CREATE PROCEDURE precioDolar(
OUT fechas CHAR(10),
OUT precioCaro DECIMAL(8,4)
)
BEGIN
DECLARE c CURSOR
FOR SELECT fecha, precio
FROM dolar
WHERE precio = (SELECT MAX(precio) FROM dolar);
SET precioCaro = 0;
OPEN c;
FETCH c INTO fechas, precioCaro;
CLOSE c;
END$$
DELIMITER ;
CALL precioDolar(@fecha,@precio);
SELECT @fecha, @precio;
Ejemplo:Modificando una tabla mediante un cursor
CREATE TABLE IF NOT EXISTS base (
idCodigo int(11) NOT NULL,
colonia char(85) COLLATE utf8_spanish_ci NOT NULL,
idAsentamiento int(11) DEFAULT NULL,
Asentamiento char(50) COLLATE utf8_spanish_ci NOT NULL,
idMunicipio int(11) DEFAULT NULL,
municipio char(85) COLLATE utf8_spanish_ci NOT NULL,
idEstado int(11) NOT NULL,
idZona int(11) NOT NULL,
zona char(30) COLLATE utf8_spanish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
COLLATE=utf8_spanish_ci;
CREATE TABLE IF NOT EXISTS zonas (
idZona int(11) NOT NULL AUTO_INCREMENT,
Zona char(20) NOT NULL,
PRIMARY KEY (idZona)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS tiposAsentamiento (
idTipo int(11) NOT NULL AUTO_INCREMENT,
asentamiento char(50) COLLATE utf8_spanish_ci NOT NULL,
PRIMARY KEY (idTipo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
COLLATE=utf8_spanish_ci AUTO_INCREMENT=1;
Vamos a poblar las tablas zonas y tiposAsentamiento
UPDATE base SET idZona = 1 WHERE zona = 'Rural';
UPDATE base SET idZona = 2 WHERE zona = 'Semiurbano';
UPDATE base SET idZona = 3 WHERE zona = 'Urbano';
INSERT INTO municipios(idEstado, municipio)
SELECT DISTINCT idEstado, municipio
FROM base
ORDER BY idEstado, municipio
Nuestro procedimiento y cursor debE lucir similar a:
DELIMITER //
DROP PROCEDURE IF EXISTS tipos;
CREATE PROCEDURE tipos()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE Tipo, tipos INT;
DECLARE Asentamientos, nAsentamiento CHAR(50);
DECLARE cMunicipios CURSOR FOR
SELECT idTipo, asentamiento FROM tiposAsentamiento;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cMunicipios;
main_loop: LOOP
FETCH cMunicipios INTO Tipo, Asentamientos;
IF done THEN
LEAVE main_loop;
END IF;
SET tipos = Tipo;
SET nAsentamiento = Asentamientos;
UPDATE base SET idAsentamiento = Tipos
WHERE asentamiento = nAsentamiento;
END LOOP;
END;
DELIMITER ;
CALL tipos();
De forma simisilar
DROP PROCEDURE IF EXISTS pMunicipio;
CREATE PROCEDURE pMunicipio()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE idMun,idMuni, idEsta, idEstados INT;
DECLARE Mun, Municipios CHAR(85);
DECLARE cMunicipios CURSOR FOR
SELECT idMunicipio, municipio, idEstado
FROM municipios;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cMunicipios;
main_loop: LOOP
FETCH cMunicipios INTO idMun, Mun, idEsta;
IF done = 1 THEN
LEAVE main_loop;
END IF;
SET idMuni = idMun;
SET Municipios = Mun;
SET idEstados = idEsta;
UPDATE base SET idMunicipio = idMuni
WHERE (idEstado = idEstados)
AND (municipio = Municipios);
END LOOP;
END;
CALL pMunicipio();
Por último elimine los campos Asentamientos,municipio y zon. Elabore la tabla
denominada colonias, con su respectiva integridad referencial. Si usted esta aquí ya casi
acredita el curso, animo
Anterior Acerca de
home
Contactame
Siguiente
Private Sub GuardarImagen(sRuta As String, rst As ADODB.Recordset)
Dim b() As Byte
Open sRuta For Binary As #1
ReDim b(FileLen(sRuta))
Get #1, , b
Close #1
rst.AddNew
rst.Fields("CampoBLOB").AppendChunk b
rst.Update
End Sub
"CampoBLOB" es el nombre del campo imagen.
Para llamarlo:
GuardarImagen "C:Mis imágenesLa imagen.jpg", MiRecordset
(Source: todoexpertos.com)
PublicSubCONECTAR()
DimSTRHOST As String
DimSTRDATABASEAs String
DimSTRUSER AsString
DimSTRPASSAs String
DimSTRCONSTRINGAsString
If CON.State = 0 Then
On Error GoTo conexion
STRHOST= "192.168.1.20"
STRDATABASE= "lujan"
STRUSER = "root"
STRPASS= "lujan"
STRCONSTRING= "DRIVER={MySQLODBC 3.51 Driver};"_
& "SERVER=" & STRHOST& ";" _
& "DATABASE="& STRDATABASE& ";" _
& "UID=" & STRUSER & ";PWD=" & STRPASS& "; OPTION=3"
WithCON
.ConnectionString=STRCONSTRING
.CursorLocation= adUseClient
.Open
EndWith
ExitSub
conexion:
MsgBox Err.Number&" " & Err.Description&" ", vbCritical,"Asegureseque el Servidoreste
encendido..."
Else
End If
endsub
Gracias por ponerme atencion....
he probadocambiandomi code de la formaque dice enel linkque me diotesis,ybuenonole allo
la diferenciaencuantoa rapidez......perome parece masviable..gracias...
lossegundotengouncampo de tiponumericoencada tablaes poreso que tengounafuncion
CREARID(TABLA),talveslamecanicade laenzeñanzaque me dieron,perosi prientande otra
formalo prueboyvemos...
loultimomi cadenade conexioneslasiguiente:
PublicCON AsNewADODB.Connection
PublicSubCONECTAR()
DimSTRHOST As String
DimSTRDATABASEAs String
DimSTRUSER AsString
DimSTRPASSAs String
DimSTRCONSTRINGAsString
If CON.State = 0 Then
On Error GoTo conexion
STRHOST = "192.168.1.20"
STRDATABASE= "lujan"
STRUSER = "root"
STRPASS= "lujan"
STRCONSTRING= "DRIVER={MySQLODBC 3.51 Driver};"_
& "SERVER=" & STRHOST & ";" _
& "DATABASE="& STRDATABASE& ";" _
& "UID=" & STRUSER & ";PWD=" & STRPASS& "; OPTION=3"
'On Error GoTo CONERROR
WithCON
.ConnectionString=STRCONSTRING
.CursorLocation= adUseClient
.Open
End With
COMM.ActiveConnection=CON
ExitSub
conexion:
MsgBox Err.Number&" " & Err.Description&" ", vbCritical,"Asegureseque el Servidoreste
encendido..."
Else
End If
.. escuchoconsejosporfavorquieroseguiraprendiendo..-.

o
o
o
o
o
o
o
o
o
o
o
o

o
o
Tutoriales MS Access - Procedimientos Almacenados desde Access
vía código VBA
Miguel Ángel Sandoval Sepúlveda
248
3,369
Publicadoel 28/03/2013
Aprenderemos a ejecutar procedimientos almacenados en mysql desde MS Access, todo
esto vía código, en la descripción encontraras material adicional para tus proyectos.
Esta es el código que he establecido para ejecutar mi procedimiento almacenado de crear al
usuario con su contraseña.
Const DB_CONNECT As String = "Driver={MySQL ODBC 5.1
Driver};Server=localhost;Port=3306;Database=tubasededatos;User=tuusuario;Passwor-
d=tupassword;Option=3;"
'Definición de Objetos
Dim cn As ADODB.Connection
Dim cmd As ADODB.Command
Dim rst As ADODB.Recordset
Set cn = New ADODB.Connection
With cn
.ConnectionString = DB_CONNECT
.Open
End With
Set cmd = New ADODB.Command
With cmd
.ActiveConnection = cn 'Activo la Conexión
.NamedParameters = True
.CommandType = adCmdStoredProc 'Defino el tipo de comando
.CommandText = "proc_nuevo_usuario('" & txt_usuario & "', '" & txt_clave & "')" 'Defino
los parámetros a enviar
.Execute 'Ejecuto el envio del procedimiento.
End With
cn.Close 'Cierro la conexión
Set cmd = Nothing
Set cn = Nothing
Dijimos que los procedimientos almacenados pueden devolver información; para ello se
emplean parámetros de salida. El valor se retorna a quien realizó la llamada con parámetros
de salida. Para que un procedimiento almacenado devuelva un valor se debe declarar una
variable con la palabra clave "output" al crear el procedimiento:
create procedure NOMBREPROCEDIMIENTO
@PARAMETROENTRADA TIPO =VALORPORDEFECTO,
@PARAMETROSALIDA TIPO=VALORPORDEFECTO output
as
SENTENCIAS
select @PARAMETROSALIDA=SENTENCIAS;
Los parámetros de salida pueden ser de cualquier tipo de datos, excepto text, ntext e image.
Creamos un procedimiento almacenado al cual le enviamos 2 números y retorna el
promedio:
create procedure pa_promedio
@n1 decimal(4,2),
@n2 decimal(4,2),
@resultado decimal(4,2) output
as
select @resultado=(@n1+@n2)/2;
Al ejecutarlo también debe emplearse "output":
declare @variable decimal(4,2)
execute pa_promedio 5,6, @variable output
select @variable;
Declaramos una variable para guardar el valor devuelto por el procedimiento; ejecutamos el
procedimiento enviándole 2 valores y mostramos el resultado.
La instrucción que realiza la llamada al procedimiento debe contener un nombre de variable
para almacenar el valor retornado.
Creamos un procedimiento almacenado que muestre los títulos, editorial y precio de los
libros de un determinado autor (enviado como parámetro de entrada) y nos retorne la suma
y el promedio de los precios de todos los libros del autor enviado:
create procedure pa_autor_sumaypromedio
@autor varchar(30)='%',
@suma decimal(6,2) output,
@promedio decimal(6,2) output
as
select titulo,editorial,precio
from libros
where autor like @autor
select @suma=sum(precio)
from libros
where autor like @autor
select @promedio=avg(precio)
from libros
where autor like @autor;
Ejecutamos el procedimiento y vemos el contenido de las variables en las que almacenamos
los parámetros de salida del procedimiento:
declare @s decimal(6,2), @p decimal(6,2)
execute pa_autor_sumaypromedio 'Richard Bach', @s output, @p output
select @s as total, @p as promedio;
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

Base datos mysql y visual basic

  • 1.
    6.3. Cursores Los cursoresse utilizan para manejar las sentencias SELECT. Un cursor esta formado por un conjunto de registros devueltos por una instrucción SQL del tipo SELECT. Desde un punto de visto interno a la base de datos, los cursores son segmentos de memoria utilizados para realizar operaciones con los registros devueltos tras ejecutar una sentencia SELECT. Reciben el nombre de cursores implícitos, cuando la sentencia SELECT regresa solo un registro. Para procesar instrucciones SELECT que devuelvan más de una fila, son necesarios cursores explicítos combinados con un estructura de bloque. Un cursor admite el uso de parámetros. Los parámetros deben declararse junto con el cursor. El siguiente diagrama representa como se procesa una instrucción SQL a través de un cursor. Fases de un cursor MYSQL Fases de un cursor ORACLE Cursores implícitos
  • 2.
    Se utilizan cuandola sentencia SELECT devuelve un solo registro. En cada cursor implicito debe existir palabra reservada INTO. Las variables que reciben los datos devueltos por el cursor tienen que contienen el mismo tipo de dato que las columnas de la tabla. MySQL no soporta esta clase de cursores pero podemos visualizarlos así. Importante poner un delimitador nuevo, (suele ser ';') ya que si no se cambia toma el ; como delimitador, es decir que seria el final del procedimiento o función (Línea 2). También es posible usar cursores dentro de un procedimiento almacenado. Observe el siguiente ejemplo que a diferencia de los ejercicios anteriores no genera error si la consulta no regresa registros. Si usamos %ROWCOUNT es posible conocer cuántos registros regresa la consulta 0 ... n. BEGIN inscripcionCursores('Compiladores','LILIANA','ENEJUN09',90); END; DECLARE fechas dolar.fecha%TYPE ; precioActual dolar.precio%TYPE; BEGIN SELECT fecha, precio INTO fechas, precioActual FROM dolar WHERE fecha = (SELECT MAX(precio) FROM dolar); dbms_output.put_line(fechas || ' ' || precioActual); END; Ejemplo: Video Patito. Obtener el director de una determinada pelicula.
  • 3.
    DROP PROCEDURE IFEXISTS dirige; DELIMITER $$ CREATE PROCEDURE dirige (IN _Pelicula CHAR(40), OUT _Director CHAR(50)) BEGIN DECLARE _Dirige CURSOR FOR SELECT a.NombreActor FROM actua ac, rol r, pelicula p, actor a WHERE ac.idActor = a.idActor AND ac.idPelicula = p.idPelicula AND ac.idRol = r.idRol AND r.NombreRol = 'Director' AND p.NombrePelicula = _Pelicula; OPEN _Dirige; FETCH _Dirige INTO _Director; CLOSE _Dirige; END$$ DELIMITER ; -- Llamada al procedimiento CALL dirige('Contrabando', @Quien); SELECT @Quien; DECLARE nombreDirector CHAR(50); BEGIN SELECT a.NombreActor INTO nombreDirector FROM actua ac, rol r, pelicula p, actor a WHERE ac.idActor = a.idActor AND ac.idPelicula = p.idPelicula AND ac.idRol = r.idRol AND r.NombreRol = 'Director' AND p.NombrePelicula = 'Contrabando'; dbms_output.put_line('El director de
  • 4.
    Contrabando es: '|| nombreDirector); END; Cursores explícitos: Se utilizan cuando la sentencia SELECT puede devolver varios registros. También se pueden utilizar en consultas que devuelvan un solo registro por razones de eficiencia con respecto a los cursores implícitos, eficiencia que mejorará especialmente si el cursor explícito se tiene que ejecutar varias veces dentro del bloque de código. Un cursor explícito tiene que ser definido previamente como cualquier otra variable cursores explícitos admiten el uso de parámetros. Los parámetros deben declararse junto con el cursor. Ejemplo: Reloj checador Iniciaremos creando las siguientes tablas CREATE TABLE empleados ( idEmpleado INTEGER AUTO_INCREMENT, nombre CHAR(40) NOT NULL, PRIMARY KEY (idEmpleado, nombre) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_spanish_ci; CREATE TABLE checar ( idChecar INTEGER AUTO_INCREMENT, fecha DATE NOT NULL, hora TIME NOT NULL, idEmpleado INT NOT NULL, PRIMARY KEY (idchecar), CONSTRAINT fk_idEmpleado FOREIGN KEY (idEmpleado ) REFERENCES empleados (idEmpleado ) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_spanish_ci; Ingresaremos los siguientes empleados INSERT INTO empleados VALUES (1,'Jorge Pérez García'); INSERT INTO empleados VALUES (2, 'Roberto Carlos Hernández Alamillo'); INSERT INTO empleados VALUES (3,'Francisco Argona Luis'); Declaramos ahora el cursor (línea 9 al 12) y el procedimiento correspondiente DROP PROCEDURE IF EXISTS checando;
  • 5.
    DELIMITER $$ CREATE PROCEDUREchecando(IN fechas DATE, IN horas TIME, IN id INTEGER, OUT mensaje CHAR(20)) BEGIN DECLARE n INTEGER DEFAULT 0; DECLARE nChecadas CURSOR FOR SELECT COUNT(*) FROM checar WHERE (idEmpleado = id) AND (fecha = fechas); OPEN nChecadas; FETCH nChecadas INTO n; CLOSE nChecadas; IF (n <= 1) THEN IF (n = 0) THEN INSERT INTO checar (fecha, hora, idEmpleado) VALUES (fechas, horas, id); SET mensaje = 'Entrada'; ELSE INSERT INTO checar (fecha, hora, idEmpleado) VALUES (fechas, horas, id); SET mensaje = 'Salida'; END IF; ELSE SET mensaje = 'No jugar'; END IF; END$$ DELIMITER ; El comando DECLARE (línea 5) sirve para declarar variables locales y cursores. Solo funcionan dentro de procedimientos inmediantamente del BEGIN. Ejemplo: Tipo de cambio para solventar obligaciones denominadas en dólares de los EE.UU.A., pagaderas en la República Mexicana.Fuente: DROP PROCEDURE IF EXISTS precioDolar; DELIMITER $$; CREATE PROCEDURE precioDolar( OUT fechas CHAR(10), OUT precioCaro DECIMAL(8,4) ) BEGIN DECLARE c CURSOR FOR SELECT fecha, precio FROM dolar WHERE precio = (SELECT MAX(precio) FROM dolar); SET precioCaro = 0; OPEN c; FETCH c INTO fechas, precioCaro; CLOSE c; END$$ DELIMITER ; CALL precioDolar(@fecha,@precio); SELECT @fecha, @precio;
  • 6.
    Ejemplo:Modificando una tablamediante un cursor CREATE TABLE IF NOT EXISTS base ( idCodigo int(11) NOT NULL, colonia char(85) COLLATE utf8_spanish_ci NOT NULL, idAsentamiento int(11) DEFAULT NULL, Asentamiento char(50) COLLATE utf8_spanish_ci NOT NULL, idMunicipio int(11) DEFAULT NULL, municipio char(85) COLLATE utf8_spanish_ci NOT NULL, idEstado int(11) NOT NULL, idZona int(11) NOT NULL, zona char(30) COLLATE utf8_spanish_ci NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci; CREATE TABLE IF NOT EXISTS zonas ( idZona int(11) NOT NULL AUTO_INCREMENT, Zona char(20) NOT NULL, PRIMARY KEY (idZona) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; CREATE TABLE IF NOT EXISTS tiposAsentamiento ( idTipo int(11) NOT NULL AUTO_INCREMENT, asentamiento char(50) COLLATE utf8_spanish_ci NOT NULL, PRIMARY KEY (idTipo) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci AUTO_INCREMENT=1; Vamos a poblar las tablas zonas y tiposAsentamiento UPDATE base SET idZona = 1 WHERE zona = 'Rural'; UPDATE base SET idZona = 2 WHERE zona = 'Semiurbano'; UPDATE base SET idZona = 3 WHERE zona = 'Urbano'; INSERT INTO municipios(idEstado, municipio) SELECT DISTINCT idEstado, municipio FROM base ORDER BY idEstado, municipio Nuestro procedimiento y cursor debE lucir similar a: DELIMITER // DROP PROCEDURE IF EXISTS tipos; CREATE PROCEDURE tipos() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE Tipo, tipos INT; DECLARE Asentamientos, nAsentamiento CHAR(50); DECLARE cMunicipios CURSOR FOR SELECT idTipo, asentamiento FROM tiposAsentamiento; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  • 7.
    OPEN cMunicipios; main_loop: LOOP FETCHcMunicipios INTO Tipo, Asentamientos; IF done THEN LEAVE main_loop; END IF; SET tipos = Tipo; SET nAsentamiento = Asentamientos; UPDATE base SET idAsentamiento = Tipos WHERE asentamiento = nAsentamiento; END LOOP; END; DELIMITER ; CALL tipos(); De forma simisilar DROP PROCEDURE IF EXISTS pMunicipio; CREATE PROCEDURE pMunicipio() BEGIN DECLARE done INT DEFAULT 0; DECLARE idMun,idMuni, idEsta, idEstados INT; DECLARE Mun, Municipios CHAR(85); DECLARE cMunicipios CURSOR FOR SELECT idMunicipio, municipio, idEstado FROM municipios; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN cMunicipios; main_loop: LOOP FETCH cMunicipios INTO idMun, Mun, idEsta; IF done = 1 THEN LEAVE main_loop; END IF; SET idMuni = idMun; SET Municipios = Mun; SET idEstados = idEsta; UPDATE base SET idMunicipio = idMuni WHERE (idEstado = idEstados) AND (municipio = Municipios); END LOOP; END; CALL pMunicipio(); Por último elimine los campos Asentamientos,municipio y zon. Elabore la tabla denominada colonias, con su respectiva integridad referencial. Si usted esta aquí ya casi acredita el curso, animo
  • 8.
    Anterior Acerca de home Contactame Siguiente PrivateSub GuardarImagen(sRuta As String, rst As ADODB.Recordset) Dim b() As Byte Open sRuta For Binary As #1 ReDim b(FileLen(sRuta)) Get #1, , b Close #1 rst.AddNew rst.Fields("CampoBLOB").AppendChunk b rst.Update End Sub "CampoBLOB" es el nombre del campo imagen. Para llamarlo: GuardarImagen "C:Mis imágenesLa imagen.jpg", MiRecordset (Source: todoexpertos.com) PublicSubCONECTAR() DimSTRHOST As String DimSTRDATABASEAs String DimSTRUSER AsString DimSTRPASSAs String DimSTRCONSTRINGAsString If CON.State = 0 Then On Error GoTo conexion STRHOST= "192.168.1.20" STRDATABASE= "lujan" STRUSER = "root" STRPASS= "lujan"
  • 9.
    STRCONSTRING= "DRIVER={MySQLODBC 3.51Driver};"_ & "SERVER=" & STRHOST& ";" _ & "DATABASE="& STRDATABASE& ";" _ & "UID=" & STRUSER & ";PWD=" & STRPASS& "; OPTION=3" WithCON .ConnectionString=STRCONSTRING .CursorLocation= adUseClient .Open EndWith ExitSub conexion: MsgBox Err.Number&" " & Err.Description&" ", vbCritical,"Asegureseque el Servidoreste encendido..." Else End If endsub Gracias por ponerme atencion.... he probadocambiandomi code de la formaque dice enel linkque me diotesis,ybuenonole allo la diferenciaencuantoa rapidez......perome parece masviable..gracias... lossegundotengouncampo de tiponumericoencada tablaes poreso que tengounafuncion CREARID(TABLA),talveslamecanicade laenzeñanzaque me dieron,perosi prientande otra formalo prueboyvemos... loultimomi cadenade conexioneslasiguiente: PublicCON AsNewADODB.Connection PublicSubCONECTAR() DimSTRHOST As String DimSTRDATABASEAs String DimSTRUSER AsString DimSTRPASSAs String DimSTRCONSTRINGAsString
  • 10.
    If CON.State =0 Then On Error GoTo conexion STRHOST = "192.168.1.20" STRDATABASE= "lujan" STRUSER = "root" STRPASS= "lujan" STRCONSTRING= "DRIVER={MySQLODBC 3.51 Driver};"_ & "SERVER=" & STRHOST & ";" _ & "DATABASE="& STRDATABASE& ";" _ & "UID=" & STRUSER & ";PWD=" & STRPASS& "; OPTION=3" 'On Error GoTo CONERROR WithCON .ConnectionString=STRCONSTRING .CursorLocation= adUseClient .Open End With COMM.ActiveConnection=CON ExitSub conexion: MsgBox Err.Number&" " & Err.Description&" ", vbCritical,"Asegureseque el Servidoreste encendido..." Else End If .. escuchoconsejosporfavorquieroseguiraprendiendo..-.
  • 11.
     o o o o o o o o o o o o  o o Tutoriales MS Access- Procedimientos Almacenados desde Access vía código VBA Miguel Ángel Sandoval Sepúlveda 248 3,369 Publicadoel 28/03/2013 Aprenderemos a ejecutar procedimientos almacenados en mysql desde MS Access, todo esto vía código, en la descripción encontraras material adicional para tus proyectos. Esta es el código que he establecido para ejecutar mi procedimiento almacenado de crear al usuario con su contraseña. Const DB_CONNECT As String = "Driver={MySQL ODBC 5.1 Driver};Server=localhost;Port=3306;Database=tubasededatos;User=tuusuario;Passwor- d=tupassword;Option=3;" 'Definición de Objetos
  • 12.
    Dim cn AsADODB.Connection Dim cmd As ADODB.Command Dim rst As ADODB.Recordset Set cn = New ADODB.Connection With cn .ConnectionString = DB_CONNECT .Open End With Set cmd = New ADODB.Command With cmd .ActiveConnection = cn 'Activo la Conexión .NamedParameters = True .CommandType = adCmdStoredProc 'Defino el tipo de comando .CommandText = "proc_nuevo_usuario('" & txt_usuario & "', '" & txt_clave & "')" 'Defino los parámetros a enviar .Execute 'Ejecuto el envio del procedimiento. End With cn.Close 'Cierro la conexión Set cmd = Nothing Set cn = Nothing
  • 13.
    Dijimos que losprocedimientos almacenados pueden devolver información; para ello se emplean parámetros de salida. El valor se retorna a quien realizó la llamada con parámetros de salida. Para que un procedimiento almacenado devuelva un valor se debe declarar una variable con la palabra clave "output" al crear el procedimiento: create procedure NOMBREPROCEDIMIENTO @PARAMETROENTRADA TIPO =VALORPORDEFECTO, @PARAMETROSALIDA TIPO=VALORPORDEFECTO output as SENTENCIAS select @PARAMETROSALIDA=SENTENCIAS; Los parámetros de salida pueden ser de cualquier tipo de datos, excepto text, ntext e image. Creamos un procedimiento almacenado al cual le enviamos 2 números y retorna el promedio: create procedure pa_promedio @n1 decimal(4,2), @n2 decimal(4,2), @resultado decimal(4,2) output as select @resultado=(@n1+@n2)/2; Al ejecutarlo también debe emplearse "output": declare @variable decimal(4,2) execute pa_promedio 5,6, @variable output select @variable; Declaramos una variable para guardar el valor devuelto por el procedimiento; ejecutamos el procedimiento enviándole 2 valores y mostramos el resultado. La instrucción que realiza la llamada al procedimiento debe contener un nombre de variable para almacenar el valor retornado. Creamos un procedimiento almacenado que muestre los títulos, editorial y precio de los libros de un determinado autor (enviado como parámetro de entrada) y nos retorne la suma y el promedio de los precios de todos los libros del autor enviado: create procedure pa_autor_sumaypromedio @autor varchar(30)='%',
  • 14.
    @suma decimal(6,2) output, @promediodecimal(6,2) output as select titulo,editorial,precio from libros where autor like @autor select @suma=sum(precio) from libros where autor like @autor select @promedio=avg(precio) from libros where autor like @autor; Ejecutamos el procedimiento y vemos el contenido de las variables en las que almacenamos los parámetros de salida del procedimiento: declare @s decimal(6,2), @p decimal(6,2) execute pa_autor_sumaypromedio 'Richard Bach', @s output, @p output select @s as total, @p as promedio;
  • 15.
    1. Entorno  VisualBasic 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
  • 16.
    -- DROP TABLE IFEXISTS `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
  • 17.
    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
  • 18.
    Y las referenciasdel proyecto deberian ser las siguientes:
  • 19.
    3.4.1. Métodos desoporte 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
  • 20.
    'Habilita los controlesque 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;" _
  • 21.
    & "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(" & _ "?," & _ "?," & _ "?," & _
  • 22.
    "?" & _ ")" .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:
  • 23.
    insertarvisitante = False ExitFunction 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
  • 24.
    .Value = Me.dtpFechaNacimiento.Value EndWith 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
  • 25.
    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
  • 26.
    4. Ejemplo dela Aplicación