Anexo:
Objetivo:
Implementar procedimientos almacenados en mysql 5 o superior, crear una aplicación cliente en visual basic 6.0 realizando la interconexión mediante ODBC con el conector mysql-connector-odbc-3.51.14-win32.
Consideraciones:
El anexo comenzará la descripción del artículo considerando que el siguiente software requerido se encuentra instalado correctamente en su equipo de cómputo a utilizar para llevar a cabo esta práctica.
De la misma manera se supondrá la correcta configuración del el o los usuario en el DBMS, se recomienda ingresar dos, uno de ellos que tenga todos los privilegios sobre la base de datos que se creará y otro solamente con el privilegio de ejecución.
Se considera que el lector tiene conocimientos medios en el manejo del DBMS así como del lenguaje de programación visual basic 6.0 y de la tecnología ADO.
Es también necesario que después de la instalación del DBMS, creación de usuarios mencionados, se creen la base de datos “banco” y las tablas de la imagen que se presenta en la sección “escenario”, para este fin se recomienda que se utilice la aplicación administrativa de base de datos mysql administrator que viene en el paquete mysql-gui-tools-5.0-r8-win32.msi
Software Requerido:
• wamp5_1.6.6
• Visual basic 6.0
• mysql-connector-odbc-3.51.14-win32
• Sistema operativo windows preferentemente XP
• mysql-gui-tools-5.0-r8-win32.msi
Escenario:
El anexo pretende resolver el problema planteado en el capítulo dos sección cinco sub sección uno que es básicamente el caso de un banco en el que se pretende ocultar tablas a los usuarios y para esto utilizan la implementación de procedimientos almacenados. La estructura de base de datos es la que se muestra a continuación.
Procedimientos almacenados:
Mediante la herramienta mysql query browser es necesario ingresar lo siguientes procedimientos almacenados.
Estado_cuenta:
Este procedimiento se encarga de poner a la vista de la aplicación cliente los diferentes movimientos que ha tenido la cuenta que se otorga como parámetro, al igual que todos los otros procedimientos almacenados antes de brindar cualquier información se realiza una verificación del usuario y la clave de este.
Identificación:
Este procedimiento realiza la verificación inicial del nombre del usuario, clave y la sucursal donde tiene autorización de ingresar.
Información:
Es el encargado de enviar información a la aplicación cliente de diferentes aspectos que tienen que ver con la situación de la cuenta.
ingresa_retiro_deposito
El ingreso de información en las tablas de operación y movimientos es el principal trabajo de este procedimiento, aparte de garantizar que estos movimientos se realicen correctamente.
Aplicación:
La aplicación está realizada en el lenguaje de programación visual basic 6.0 y realiza una interconexión con mysql-connector-odbc-3.51.14-win32, consta de un grupo de formularios que se describen a continuación.
Formulario Clavepedir:
En este formulario el usuario se identifica y puede tener acceso a la configuración de la conexión, posterior a la identificación es enviado al formulario mdi que se analizará más delante.
Bajo el siguiente código:
Private Sub Command1_Click()
Dim sql As String
Dim mirecordset As Recordset
Dim mirecordset2 As Recordset
If Module2.conectar1 = False Then
Call MsgBox("Su conexión no fué exitosa", vbInformation, "I.T.E.S.U")
dsn.Show
Exit Sub
End If
If Text1 = Or Text2 = Or Text3 = Then
Call MsgBox("Es necesario ingresar todos los datos de identificación", vbInformation, "I.T.E.S.U")
Exit Sub
End If
' utilizacion de procedimiento almacenado
sql = "call identificacion('" & Text1 & "','" & Text2 & "'," & Text3 & ")"
Set mirecordset = MiConexion.Execute(sql)
If mirecordset.BOF And mirecordset.EOF Then
Call Module2.DESconectartexto
Call MsgBox("Verifique su nombre y contraseña", vbInformation, "I.T.E.S.U")
Exit Sub
End If
Call Module2.DESconectartexto
Module1.usuario = Text1
Module1.clave = Text2
Module1.sucursal = Text3
MDIForm1.Show
Unload Me
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
Private Sub Command3_Click()
dsn.Show
End Sub
Formulario dsn:
Cuando se desea realizar modificaciones en los parámetros de conexión al servidor mysql es necesario recurrir a este formulario ya que en el se puede realizar esta operación.
Bajo el siguiente código:
Private Sub Command1_Click()
Call creaelarchivodeclaveaceptada
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
Private Sub Command3_Click()
Call Command1_Click
If conectar1() = True Then
Call MsgBox("La prueba fué exitosa", vbInformation, "I.T.E.S.U")
Else
Call MsgBox("No se pudo conectar con el servidor", , "I.T.E.S.U")
End If
End Sub
Private Sub Form_Load()
Call Module1.enelcentro(Me)
Dim NUMERITO As ARCHIVODSN
Dim canal As Integer
Dim leido As String
canal = FreeFile
Open App.Path & "\" & "dsnwin32.dll" For Random As canal Len = Len(NUMERITO)
Get #canal, 1, NUMERITO
Close
Text1 = Trim(NUMERITO.dsnname)
Text1 = (Text1)
Text2 = Trim(NUMERITO.hostorip)
Text2 = (Text2)
Text3 = Trim(NUMERITO.namedatabase)
Text3 = (Text3)
Text4 = Trim(NUMERITO.user)
Text4 = (Text4)
Text5 = Trim(NUMERITO.Password)
Text5 = (Text5)
Text6 = Trim(NUMERITO.port)
Text6 = (Text6)
End Sub
Private Sub creaelarchivodeclaveaceptada()
'se hace el archiv
Dim NUMERITO As ARCHIVODSN
Dim canal As Integer
canal = FreeFile
Open App.Path & "\" & "dsnwin32.dll" For Random As canal Len = Len(NUMERITO)
NUMERITO.dsnname = Text1
NUMERITO.hostorip = Text2
NUMERITO.namedatabase = (Text3)
NUMERITO.user = (Text4)
NUMERITO.Password = (Text5)
NUMERITO.port = (Text6)
Put #canal, 1, NUMERITO
Close
Call MsgBox("Sus datos fueron guardados correctamente", vbExclamation, "I.T.E.S.U")
Unload Me
End Sub
Formulario MDIFORM1
Este formulario tiene la tarea de dar la posibilidad al usuario de seleccionar dentro del menú la tarea que desea realizar.
Bajo el siguiente código.
Private Sub estadodecuentaaa_Click()
estadodecuenta.Show
End Sub
Private Sub mov_cuenta_Click()
pruebaprocedure.Show
End Sub
Private Sub salirrrr_Click()
End
End Sub
Formulario pruebaprocedure:
Este formulario tiene la tarea de proporcionar la información de las cuentas al usuario, tanto cuenta origen como la destino, y le proporciona una caja de texto para teclear la cantidad del movimiento, en el caso de que un cliente llegue a realizar solamente un retiro o un deposito en efectivo o una cuenta que no sea del banco lo que se hace es que se teclea una cuenta predispuesta con el número cero.
Bajo el siguiente código:
Private Sub Command1_Click()
Dim sql As String
Dim comillas As String
comillas = Chr(39)
Dim mirecordset As Recordset
If IsNumeric(Text1) = False Then
Call MsgBox("Es necesario que el dato ingresado sea numérico", vbInformation, "I.T.E.S.U")
Text1 =
Text1.SetFocus
Exit Sub
End If
Call Module2.conectar1
sql = "call informacion(" & Text1 & ",'" & Module1.usuario & "','" & Module1.clave & "')"
Set mirecordset = MiConexion.Execute(sql)
If mirecordset.BOF And mirecordset.EOF Then
Call Module2.DESconectartexto
Call MsgBox("No se encontró ninguna cuenta bajo este número", vbInformation, "I.T.E.S.U")
Text1 =
Text1.SetFocus
Exit Sub
End If
Text2 = mirecordset("id_cliente")
Text3 = mirecordset("paterno")
Text4 = mirecordset("mateno")
Text5 = mirecordset("nombre")
Text6 = mirecordset("idsucursal")
Text7 = mirecordset("municipio") & " " & mirecordset("entidad")
Text8 = mirecordset("descripcion")
Text9 = mirecordset("quetipo")
DTPicker1.Value = mirecordset("apertura")
Call Module2.DESconectartexto
Text1.Locked = True
Text10.SetFocus
End Sub
Private Sub Command2_Click()
Dim sql As String
Dim comillas As String
comillas = Chr(39)
Dim mirecordset As Recordset
If Text1.Locked = False Or Text10.Locked = False Then
Call MsgBox("Es necesario que selecciones alguna cuenta", vbInformation, "I.T.E.S.U")
Exit Sub
End If
If IsNumeric(Text19) = False Then
Call MsgBox("Es necesario que el dato monetario sea numérico", vbInformation, "I.T.E.S.U")
Exit Sub
End If
Dim respuesta As Integer
Call Module2.conectar1
respuesta = 0
sql = "call ingresa_retiro_deposito('" & Module1.usuario & "','" & Module1.clave & "'," & Module1.sucursal & "," & Text1 & "," & Text10 & " ," & Text19 & ")"
MiConexion.Execute (sql)
Module2.DESconectartexto
Call MsgBox("Sus cambios se han realizado correctamente", vbInformation, "I.T.E.S.U")
Text1.SetFocus
Call limpiartext
End Sub
Private Sub Command3_Click()
Unload Me
End Sub
Private Sub Command4_Click()
Dim sql As String
Dim comillas As String
comillas = Chr(39)
Dim mirecordset As Recordset
If IsNumeric(Text10) = False Then
Call MsgBox("Es necesario que el dato ingresado sea numérico", vbInformation, "I.T.E.S.U")
Text10 =
Text10.SetFocus
Exit Sub
End If
Call Module2.conectar1
sql = "call informacion(" & Text10 & ",'" & Module1.usuario & "','" & Module1.clave & "')"
Set mirecordset = MiConexion.Execute(sql)
If mirecordset.BOF And mirecordset.EOF Then
Call Module2.DESconectartexto
Call MsgBox("No se encontró ninguna cuenta bajo este número", vbInformation, "I.T.E.S.U")
Text10 =
Text10.SetFocus
Exit Sub
End If
Text11 = mirecordset("id_cliente")
Text12 = mirecordset("paterno")
Text13 = mirecordset("mateno")
Text14 = mirecordset("nombre")
Text15 = mirecordset("idsucursal")
Text16 = mirecordset("municipio") & " " & mirecordset("entidad")
Text17 = mirecordset("descripcion")
Text18 = mirecordset("quetipo")
DTPicker2.Value = mirecordset("apertura")
Call Module2.DESconectartexto
Text10.Locked = True
Text19.SetFocus
End Sub
Private Sub Form_Load()
Call Module1.enelcentro(Me)
Call limpiartext
End Sub
Private Sub limpiartext()
Text1.Locked = False
Text10.Locked = False
Text19 =
Text1 =
Text2 =
Text3 =
Text4 =
Text5 =
Text6 =
Text7 =
Text8 =
Text9 =
Text10 =
Text11 =
Text12 =
Text13 =
Text14 =
Text15 =
Text16 =
Text17 =
Text18 =
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Command1.SetFocus
End If
End Sub
Private Sub Text10_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Command4.SetFocus
End If
End Sub
Private Sub Text11_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Command2.SetFocus
End If
End Sub
Private Sub Text19_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Command2.SetFocus
End If
End Sub
Formulario : estadodecuenta
El mostrar los diferentes movimientos que han sido realizados con el formulario pruebaprocedure es la tarea principal de esta interfaz y los controles utilizados para esta tarea se muestran a continuación.
Bajo el siguiente código.
Private Sub limpiartext()
Text1.Locked = False
Text1 =
Text2 =
Text3 =
Text4 =
Text5 =
Text6 =
Text7 =
Text8 =
Text9 =
MSFlexGrid1.Clear
Call formatoflex
End Sub
Private Sub Command1_Click()
Dim sql As String
Dim comillas As String
comillas = Chr(39)
Dim mirecordset As Recordset
If IsNumeric(Text1) = False Then
Call MsgBox("Es necesario que el número de cuenta sea un dato numérico", vbInformation, "I.T.E.S.U")
Text1 =
Text1.SetFocus
Exit Sub
End If
MSFlexGrid1.Clear
Call formatoflex
Call Module2.conectar1
sql = "call informacion(" & Text1 & ",'" & Module1.usuario & "','" & Module1.clave & "')"
Set mirecordset = MiConexion.Execute(sql)
If mirecordset.BOF And mirecordset.EOF Then
Call Module2.DESconectartexto
Call MsgBox("No se encontró ninguna cuenta bajo este número", vbInformation, "I.T.E.S.U")
Text1 =
Text1.SetFocus
Exit Sub
End If
Text2 = mirecordset("id_cliente")
Text3 = mirecordset("paterno")
Text4 = mirecordset("mateno")
Text5 = mirecordset("nombre")
Text6 = mirecordset("idsucursal")
Text7 = mirecordset("municipio") & " " & mirecordset("entidad")
Text8 = mirecordset("descripcion")
Text9 = mirecordset("quetipo")
DTPicker1.Value = mirecordset("apertura")
Call Module2.DESconectartexto
Text1.Locked = True
Call Module2.conectar1
sql = "call estado_cuenta('" & Module1.usuario & "','" & Module1.clave & "'," & Text1 & ")"
Set mirecordset = MiConexion.Execute(sql)
If mirecordset.BOF And mirecordset.EOF Then
Call Module2.DESconectartexto
Call MsgBox("No se encontró ningún movimiento de esta cuenta", vbInformation, "I.T.E.S.U")
Text1 =
Text1.SetFocus
Exit Sub
End If
Dim tantos As Integer
MSFlexGrid1.Rows = 2
While mirecordset.EOF = False
tantos = Module1.cuantosdatostieneelflexencolumnas(MSFlexGrid1)
tantos = tantos + 1
MSFlexGrid1.Rows = tantos + 4
MSFlexGrid1.TextMatrix(tantos, 0) = mirecordset("idoperacion")
MSFlexGrid1.TextMatrix(tantos, 1) = mirecordset("fecha")
MSFlexGrid1.TextMatrix(tantos, 2) = mirecordset("idsucursal")
MSFlexGrid1.TextMatrix(tantos, 3) = mirecordset("direccion")
MSFlexGrid1.TextMatrix(tantos, 4) = mirecordset("num_ref")
MSFlexGrid1.TextMatrix(tantos, 5) = mirecordset("retiro")
MSFlexGrid1.TextMatrix(tantos, 6) = mirecordset("deposito")
mirecordset.MoveNext
Wend
Call Module2.DESconectartexto
Command3.SetFocus
End Sub
Private Sub Command2_Click()
Call limpiartext
Text1.SetFocus
End Sub
Private Sub Command3_Click()
Unload Me
End Sub
Private Sub Form_Load()
Call Module1.enelcentro(Me)
Call limpiartext
Call formatoflex
End Sub
Private Sub formatoflex()
MSFlexGrid1.TextMatrix(0, 0) = "Operación Num"
MSFlexGrid1.ColWidth(0) = 1770
MSFlexGrid1.TextMatrix(0, 1) = "Fecha"
MSFlexGrid1.ColWidth(1) = 2880
MSFlexGrid1.TextMatrix(0, 2) = "Suc Num"
MSFlexGrid1.ColWidth(2) = 1035
MSFlexGrid1.TextMatrix(0, 3) = "Direcc"
MSFlexGrid1.ColWidth(3) = 3180
MSFlexGrid1.TextMatrix(0, 4) = "Referencia"
MSFlexGrid1.ColWidth(4) = 1230
MSFlexGrid1.TextMatrix(0, 5) = "Retiro"
MSFlexGrid1.ColWidth(5) = 1650
MSFlexGrid1.TextMatrix(0, 6) = "Depósito"
MSFlexGrid1.ColWidth(6) = 2685
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Command1.SetFocus
End If
End Sub
Modulo: module1
Este módulo almacena algunas funciones simples utilizadas por el sistema, así como algunas variables de tipo global.
Bajo el siguiente código.
Public usuario As String
Public clave As String
Public sucursal As Double
Public Type ARCHIVODSN
dsnname As String * 500
hostorip As String * 500
namedatabase As String * 500
user As String * 500
Password As String * 500
port As String * 500
End Type
Public Sub enelcentro(formulario As Form)
formulario.Top = 0
formulario.Left = 0
End Sub
Public Function cuantosdatostieneelflexencolumnas(flexito As MSFlexGrid)
Dim numrenglones As Integer
Dim resputa As Integer
Dim X As Integer
numrenglones = flexito.Rows
For X = 1 To numrenglones - 1
If flexito.TextMatrix(X, 0) = Then
resputa = X
X = numrenglones - 1
End If
Next
resputa = resputa - 1
cuantosdatostieneelflexencolumnas = resputa
End Function
Modulo: module2
Este módulo realiza solamente dos funciones, la de realizar la conexión con el servidor y la desconexión del mismo.
Bajo el siguiente código.
Public MiConexion As Connection
Public MiConexionaccess As Connection
Public manejador As String
Public Function DESconectartexto()
If MiConexion.State = 1 Then
MiConexion.Close
End If
End Function
Public Function conectar1() As Boolean
Dim dsname As String
Dim DATABASE As String
Dim host As String
Dim usuario As String
Dim puerto As String
Dim clave As String
Set MiConexion = New ADODB.Connection
Dim X As Integer
Dim NUMERITO As ARCHIVODSN
Dim canal As Integer
Dim leido As String
canal = FreeFile
Open App.Path & "\" & "dsnwin32.dll" For Random As canal Len = Len(NUMERITO)
Get #canal, 1, NUMERITO
Close
canal = Len(NUMERITO.dsnname)
DATABASE = Trim(NUMERITO.namedatabase)
DATABASE = (DATABASE)
usuario = Trim(NUMERITO.user)
usuario = (usuario)
clave = Trim(NUMERITO.Password)
clave = (clave)
puerto = Trim(NUMERITO.port)
puerto = (puerto)
On Error Resume Next
MiConexion.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};" _
& "SERVER=" & host & ";" _
& "DATABASE=" & DATABASE & ";" _
& "UID=" & usuario & ";" _
& "PWD=" & clave & ";"
MiConexion.CursorLocation = adUseServer
MiConexion.Open
If Err.Number Then
Call MsgBox("No fué Posible El Conectarse Con El Servidor De Base De Datos" & vbCrLf & "Favor De Verificar Que El Servidor Esté Activo" & vbCrLf & , vbExclamation, "I.T.E.S.U")
conectar1 = False
Else
conectar1 = True
End If
Err.Clear
End Function